Changes in / [7b84d3e:abb04a4]
- Location:
- libcfa/src/concurrency
- Files:
-
- 2 edited
-
channel.hfa (modified) (3 diffs)
-
locks.hfa (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/channel.hfa
r7b84d3e rabb04a4 28 28 unlock( lock ); 29 29 park(); 30 #if defined(__ARM_ARCH)31 30 __atomic_thread_fence( __ATOMIC_SEQ_CST ); 32 #endif33 31 return sn.extra == 0p; 34 32 } … … 133 131 static inline void __cons_handoff( channel(T) & chan, T & elem ) with(chan) { 134 132 memcpy( cons`first.extra, (void *)&elem, sizeof(T) ); // do waiting consumer work 135 #if defined(__ARM_ARCH)136 133 __atomic_thread_fence( __ATOMIC_SEQ_CST ); 137 #endif138 134 wake_one( cons ); 139 135 } … … 142 138 static inline void __prods_handoff( channel(T) & chan, T & retval ) with(chan) { 143 139 memcpy( (void *)&retval, prods`first.extra, sizeof(T) ); 144 #if defined(__ARM_ARCH)145 140 __atomic_thread_fence( __ATOMIC_SEQ_CST ); 146 #endif147 141 wake_one( prods ); 148 142 } -
libcfa/src/concurrency/locks.hfa
r7b84d3e rabb04a4 182 182 static inline void lock( mcs_spin_lock & l, mcs_spin_node & n ) { 183 183 n.locked = true; 184 185 #if defined(__ARM_ARCH)186 __asm__ __volatile__ ( "DMB ISH" ::: );187 #endif188 189 184 mcs_spin_node * prev = __atomic_exchange_n(&l.queue.tail, &n, __ATOMIC_SEQ_CST); 190 185 if( prev == 0p ) return; 191 186 prev->next = &n; 192 193 #if defined(__ARM_ARCH)194 __asm__ __volatile__ ( "DMB ISH" ::: );195 #endif196 197 187 while( __atomic_load_n(&n.locked, __ATOMIC_RELAXED) ) Pause(); 198 199 #if defined(__ARM_ARCH)200 __asm__ __volatile__ ( "DMB ISH" ::: );201 #endif202 188 } 203 189 204 190 static inline void unlock(mcs_spin_lock & l, mcs_spin_node & n) { 205 #if defined(__ARM_ARCH)206 __asm__ __volatile__ ( "DMB ISH" ::: );207 #endif208 209 191 mcs_spin_node * n_ptr = &n; 210 192 if (__atomic_compare_exchange_n(&l.queue.tail, &n_ptr, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) return; 211 193 while (__atomic_load_n(&n.next, __ATOMIC_RELAXED) == 0p) Pause(); 212 213 #if defined(__ARM_ARCH)214 __asm__ __volatile__ ( "DMB ISH" ::: );215 #endif216 217 194 n.next->locked = false; 218 195 }
Note:
See TracChangeset
for help on using the changeset viewer.