Changeset d54b303 in mainline for uspace/lib/c/include/futex.h
- Timestamp:
- 2012-12-04T05:18:19Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 32d2e60
- Parents:
- 9a3b469
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/include/futex.h
r9a3b469 rd54b303 40 40 #include <libc.h> 41 41 42 #define FUTEX_INITIALIZE(val) {{(val)}}43 #define FUTEX_INITIALIZER FUTEX_INITIALIZE(1)44 45 42 typedef struct futex { 46 43 atomic_t val; 44 #ifdef FUTEX_UPGRADABLE 45 int upgraded; 46 #endif 47 47 } futex_t; 48 48 … … 50 50 extern void futex_initialize(futex_t *futex, int value); 51 51 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 90 extern int _upgrade_futexes; 91 92 extern void futex_upgrade_all_and_wait(void); 93 94 #else 95 96 #define FUTEX_INITIALIZE(val) {{(val)}} 97 52 98 #define futex_down(fut) (void)_futex_down((fut)) 53 99 #define futex_trydown(fut) _futex_trydown((fut)) 54 100 #define futex_up(fut) (void)_futex_up((fut)) 101 102 #endif 55 103 104 #define FUTEX_INITIALIZER FUTEX_INITIALIZE(1) 56 105 57 106 /** Try to down the futex.
Note:
See TracChangeset
for help on using the changeset viewer.