summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2022-02-08 10:13:27 +0300
committerIvan Maidanski <ivmai@mail.ru>2022-02-08 13:14:08 +0300
commit223f00001b20337f6363f92db3a7b2fb29a6308c (patch)
tree0128f322db774301525573714ef694dce2b68acc
parent401f7b77301b7b588a89c7ab1b8ddb97cb4e5e57 (diff)
downloadlibatomic_ops-223f00001b20337f6363f92db3a7b2fb29a6308c.tar.gz
Avoid code duplication in AO_stack_push_explicit_aux_release
(refactoring) * src/atomic_ops_stack.c [AO_USE_ALMOST_LOCK_FREE && AO_BL_SIZE!=2] (AO_stack_push_explicit_aux_release): Remove code duplicated with AO_BL_SIZE==2 case.
-rw-r--r--src/atomic_ops_stack.c26
1 files changed, 7 insertions, 19 deletions
diff --git a/src/atomic_ops_stack.c b/src/atomic_ops_stack.c
index f36c913..c989021 100644
--- a/src/atomic_ops_stack.c
+++ b/src/atomic_ops_stack.c
@@ -79,12 +79,17 @@ AO_API void AO_stack_push_explicit_aux_release(volatile AO_t *list, AO_t *x,
/* No deletions of x can start here, since x is not currently in the */
/* list. */
retry:
-# if AO_BL_SIZE == 2
{
+# if AO_BL_SIZE == 2
/* Start all loads as close to concurrently as possible. */
AO_t entry1 = AO_load(&a->AO_stack_bl[0]);
AO_t entry2 = AO_load(&a->AO_stack_bl[1]);
if (entry1 == x_bits || entry2 == x_bits)
+# else
+ int i;
+ for (i = 0; i < AO_BL_SIZE; ++i)
+ if (AO_load(&a->AO_stack_bl[i]) == x_bits)
+# endif
{
/* Entry is currently being removed. Change it a little. */
++x_bits;
@@ -95,24 +100,7 @@ AO_API void AO_stack_push_explicit_aux_release(volatile AO_t *list, AO_t *x,
goto retry;
}
}
-# else
- {
- int i;
- for (i = 0; i < AO_BL_SIZE; ++i)
- {
- if (AO_load(&a->AO_stack_bl[i]) == x_bits)
- {
- /* Entry is currently being removed. Change it a little. */
- ++x_bits;
- if ((x_bits & AO_BIT_MASK) == 0)
- /* Version count overflowed; */
- /* EXTREMELY unlikely, but possible. */
- x_bits = (AO_t)x;
- goto retry;
- }
- }
- }
-# endif
+
/* x_bits is not currently being deleted */
do
{