Changeset 280ec46 for libcfa/src/containers
- Timestamp:
- Jun 13, 2020, 10:40:44 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- c45d2fa
- Parents:
- ee06db5c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/containers/stackLockFree.hfa
ree06db5c r280ec46 9 9 // Created On : Wed May 13 20:58:58 2020 10 10 // Last Modified By : Peter A. Buhr 11 // Last Modified On : Mon May 18 13:30:08202012 // Update Count : 5511 // Last Modified On : Sat Jun 13 12:24:37 2020 12 // Update Count : 62 13 13 // 14 14 … … 19 19 forall( dtype T ) 20 20 union Link { 21 struct { // 32/64-bit x 222 T * top; // pointer to stack top23 uintptr_t count; // count each push21 struct { // 32/64-bit x 2 22 T * top; // pointer to stack top 23 uintptr_t count; // count each push 24 24 }; 25 25 #if __SIZEOF_INT128__ == 16 26 __int128 // gcc, 128-bit integer26 __int128 // gcc, 128-bit integer 27 27 #else 28 uint64_t // 64-bit integer28 uint64_t // 64-bit integer 29 29 #endif // __SIZEOF_INT128__ == 16 30 30 atom; 31 31 }; // Link 32 32 33 forall( otype T| { Link(T) * getNext( T * ); } ) {33 forall( dtype T | sized(T) | { Link(T) * getNext( T * ); } ) { 34 34 struct StackLF { 35 35 Link(T) stack; … … 42 42 43 43 void push( StackLF(T) & this, T & n ) with(this) { 44 *getNext( &n ) = stack; // atomic assignment unnecessary, or use CAA 44 45 for () { // busy wait 45 *getNext( &n ) = stack; // atomic assignment unnecessary, or use CAA46 46 if ( __atomic_compare_exchange_n( &stack.atom, &getNext( &n )->atom, (Link(T))@{ {&n, getNext( &n )->count + 1} }.atom, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ) ) break; // attempt to update top node 47 47 } // for … … 50 50 T * pop( StackLF(T) & this ) with(this) { 51 51 Link(T) t @= {}; 52 t = stack; // atomic assignment unnecessary, or use CAA 52 53 for () { // busy wait 53 t = stack; // atomic assignment unnecessary, or use CAA54 54 if ( t.top == 0p ) return 0p; // empty stack ? 55 55 if ( __atomic_compare_exchange_n( &stack.atom, &t.atom, (Link(T))@{ {getNext( t.top )->top, t.count} }.atom, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ) ) return t.top; // attempt to update top node
Note: See TracChangeset
for help on using the changeset viewer.