diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2022-02-08 10:13:27 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2022-02-08 13:14:08 +0300 |
commit | 223f00001b20337f6363f92db3a7b2fb29a6308c (patch) | |
tree | 0128f322db774301525573714ef694dce2b68acc | |
parent | 401f7b77301b7b588a89c7ab1b8ddb97cb4e5e57 (diff) | |
download | libatomic_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.c | 26 |
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 { |