- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel_private.hfa (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel_private.hfa
rfd9b524 r1eb239e4 10 10 // Created On : Mon Feb 13 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Aug 12 08:21:33 202013 // Update Count : 912 // Last Modified On : Sat Nov 30 19:25:02 2019 13 // Update Count : 8 14 14 // 15 15 … … 121 121 void unregister( struct __processor_id_t * proc ); 122 122 123 //----------------------------------------------------------------------- 124 // Cluster idle lock/unlock 125 static inline void lock(__cluster_idles & this) { 126 for() { 127 uint64_t l = this.lock; 128 if( 129 (0 == (l % 2)) 130 && __atomic_compare_exchange_n(&this.lock, &l, l + 1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) 131 ) return; 132 Pause(); 133 } 134 } 135 136 static inline void unlock(__cluster_idles & this) { 137 /* paranoid */ verify( 1 == (this.lock % 2) ); 138 __atomic_fetch_add( &this.lock, 1, __ATOMIC_SEQ_CST ); 139 } 140 123 141 //======================================================================= 124 142 // Reader-writer lock implementation … … 132 150 while( __builtin_expect(__atomic_exchange_n(ll, (bool)true, __ATOMIC_SEQ_CST), false) ) { 133 151 while(__atomic_load_n(ll, (int)__ATOMIC_RELAXED)) 134 Pause();152 asm volatile("pause"); 135 153 } 136 154 /* paranoid */ verify(*ll); … … 186 204 // Step 1 : make sure no writer are in the middle of the critical section 187 205 while(__atomic_load_n(&lock, (int)__ATOMIC_RELAXED)) 188 Pause();206 asm volatile("pause"); 189 207 190 208 // Fence needed because we don't want to start trying to acquire the lock … … 248 266 // pop thread from the ready queue of a cluster 249 267 // returns 0p if empty 268 // May return 0p spuriously 250 269 __attribute__((hot)) struct $thread * pop(struct cluster * cltr); 270 271 //----------------------------------------------------------------------- 272 // pop thread from the ready queue of a cluster 273 // returns 0p if empty 274 // guaranteed to find any threads added before this call 275 __attribute__((hot)) struct $thread * pop_slow(struct cluster * cltr); 251 276 252 277 //-----------------------------------------------------------------------
Note:
See TracChangeset
for help on using the changeset viewer.