summaryrefslogtreecommitdiff
path: root/src/atomic_ops_stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/atomic_ops_stack.c')
-rw-r--r--src/atomic_ops_stack.c29
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) \