Changeset d54b303 in mainline for uspace/lib/c/include/futex.h


Ignore:
Timestamp:
2012-12-04T05:18:19Z (12 years ago)
Author:
Adam Hraska <adam.hraska+hos@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
32d2e60
Parents:
9a3b469
Message:

Initial version of nop futexes that are upgradable to proper futexes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/include/futex.h

    r9a3b469 rd54b303  
    4040#include <libc.h>
    4141
    42 #define FUTEX_INITIALIZE(val) {{(val)}}
    43 #define FUTEX_INITIALIZER     FUTEX_INITIALIZE(1)
    44 
    4542typedef struct futex {
    4643        atomic_t val;
     44#ifdef FUTEX_UPGRADABLE
     45        int upgraded;
     46#endif
    4747} futex_t;
    4848
     
    5050extern void futex_initialize(futex_t *futex, int value);
    5151
     52#ifdef FUTEX_UPGRADABLE
     53#include <rcu.h>
     54
     55#define FUTEX_INITIALIZE(val) {{(val)}, {0}}
     56
     57#define futex_down(fut) \
     58({ \
     59        rcu_read_lock(); \
     60        (fut)->upgraded = rcu_access(_upgrade_futexes); \
     61        if ((fut)->upgraded) \
     62                (void) _futex_down((fut)); \
     63})
     64
     65#define futex_trydown(fut) \
     66({ \
     67        rcu_read_lock(); \
     68        int _upgraded = rcu_access(_upgrade_futexes); \
     69        if (_upgraded) { \
     70                int _acquired = _futex_trydown((fut)); \
     71                if (!_acquired) { \
     72                        rcu_read_unlock(); \
     73                } else { \
     74                        (fut)->upgraded = true; \
     75                } \
     76                _acquired; \
     77        } else { \
     78                (fut)->upgraded = false; \
     79                1; \
     80        } \
     81})
     82               
     83#define futex_up(fut) \
     84({ \
     85        if ((fut)->upgraded) \
     86                (void) _futex_up((fut)); \
     87        rcu_read_unlock(); \
     88})
     89
     90extern int _upgrade_futexes;
     91
     92extern void futex_upgrade_all_and_wait(void);
     93               
     94#else
     95
     96#define FUTEX_INITIALIZE(val) {{(val)}}
     97
    5298#define futex_down(fut)     (void)_futex_down((fut))
    5399#define futex_trydown(fut)  _futex_trydown((fut))
    54100#define futex_up(fut)       (void)_futex_up((fut))
     101               
     102#endif
    55103
     104#define FUTEX_INITIALIZER     FUTEX_INITIALIZE(1)
    56105
    57106/** Try to down the futex.
Note: See TracChangeset for help on using the changeset viewer.