Changes in / [d99a716:66a89e7]
- Location:
- libcfa/src/concurrency
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/invoke.h
rd99a716 r66a89e7 215 215 struct __thread_user_link cltr_link; 216 216 217 // used to store state between clh lock/unlock 218 volatile bool * clh_prev; 219 217 220 // used to point to this thd's current clh node 218 221 volatile bool * clh_node; -
libcfa/src/concurrency/locks.hfa
rd99a716 r66a89e7 228 228 struct clh_lock { 229 229 volatile bool * volatile tail; 230 volatile bool * volatile head;231 230 }; 232 231 … … 238 237 *(curr_thd->clh_node) = false; 239 238 volatile bool * prev = __atomic_exchange_n((bool **)(&l.tail), (bool *)(curr_thd->clh_node), __ATOMIC_SEQ_CST); 240 while(!__atomic_load_n(prev, __ATOMIC_SEQ_CST)) Pause(); 241 __atomic_store_n((bool **)(&l.head), (bool *)curr_thd->clh_node, __ATOMIC_SEQ_CST); 242 curr_thd->clh_node = prev; 239 while(!__atomic_load_n(prev, __ATOMIC_ACQUIRE)) Pause(); 240 curr_thd->clh_prev = prev; 243 241 } 244 242 245 243 static inline void unlock(clh_lock & l) { 246 __atomic_store_n((bool *)(l.head), true, __ATOMIC_SEQ_CST); 244 thread$ * curr_thd = active_thread(); 245 __atomic_store_n(curr_thd->clh_node, true, __ATOMIC_RELEASE); 246 curr_thd->clh_node = curr_thd->clh_prev; 247 247 } 248 248
Note:
See TracChangeset
for help on using the changeset viewer.