Changeset 3679f51a in mainline for uspace/lib/c/include
- Timestamp:
- 2018-06-25T20:41:09Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 95838f1
- Parents:
- d73d992
- git-author:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-06-25 20:30:35)
- git-committer:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-06-25 20:41:09)
- Location:
- uspace/lib/c/include
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/include/futex.h
rd73d992 r3679f51a 42 42 typedef struct futex { 43 43 atomic_t val; 44 #ifdef FUTEX_UPGRADABLE45 int upgraded;46 #endif47 44 } futex_t; 48 49 45 50 46 extern void futex_initialize(futex_t *futex, int value); 51 47 52 #ifdef FUTEX_UPGRADABLE53 #include <rcu.h>54 55 #define FUTEX_INITIALIZE(val) {{ (val) }, 0}56 57 #define futex_lock(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_trylock(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_unlock(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 #else95 96 48 #define FUTEX_INITIALIZE(val) {{ (val) }} 49 #define FUTEX_INITIALIZER FUTEX_INITIALIZE(1) 97 50 98 51 #define futex_lock(fut) (void) futex_down((fut)) 99 52 #define futex_trylock(fut) futex_trydown((fut)) 100 53 #define futex_unlock(fut) (void) futex_up((fut)) 101 102 #endif103 104 #define FUTEX_INITIALIZER FUTEX_INITIALIZE(1)105 54 106 55 /** Try to down the futex. -
uspace/lib/c/include/rcu.h
rd73d992 r3679f51a 92 92 #define rcu_access(ptr) ACCESS_ONCE(ptr) 93 93 94 typedef enum blocking_mode {95 BM_BLOCK_FIBRIL,96 BM_BLOCK_THREAD97 } blocking_mode_t;98 99 94 extern void rcu_register_fibril(void); 100 95 extern void rcu_deregister_fibril(void); … … 105 100 extern bool rcu_read_locked(void); 106 101 107 #define rcu_synchronize() _rcu_synchronize(BM_BLOCK_FIBRIL) 108 109 extern void _rcu_synchronize(blocking_mode_t); 102 extern void rcu_synchronize(void); 110 103 111 104 #endif
Note:
See TracChangeset
for help on using the changeset viewer.