diff options
Diffstat (limited to 'src/atomic_ops_stack.c')
-rw-r--r-- | src/atomic_ops_stack.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/atomic_ops_stack.c b/src/atomic_ops_stack.c index 2067361..c03be7a 100644 --- a/src/atomic_ops_stack.c +++ b/src/atomic_ops_stack.c @@ -215,8 +215,37 @@ return first_ptr; } + AO_API void AO_stack_init(AO_stack_t *list) + { +# if AO_BL_SIZE == 2 + list -> AO_aux.AO_stack_bl[0] = 0; + list -> AO_aux.AO_stack_bl[1] = 0; +# else + int i; + for (i = 0; i < AO_BL_SIZE; ++i) + list -> AO_aux.AO_stack_bl[i] = 0; +# endif + list -> AO_ptr = 0; + } + + AO_API void AO_stack_push_release(AO_stack_t *list, AO_t *x) + { + AO_stack_push_explicit_aux_release(&list->AO_ptr, x, &list->AO_aux); + } + + AO_API AO_t *AO_stack_pop_acquire(AO_stack_t *list) + { + return AO_stack_pop_explicit_aux_acquire(&list->AO_ptr, &list->AO_aux); + } + #else /* ! USE_ALMOST_LOCK_FREE */ + AO_API void AO_stack_init(AO_stack_t *list) + { + list -> AO_val1 = 0; + list -> AO_val2 = 0; + } + /* The functionality is the same as of AO_load_next but the atomicity */ /* is not needed. The usage is similar to that of store_before_cas. */ # if defined(AO_THREAD_SANITIZER) \ |