diff options
| author | Ivan Maidanski <ivmai@mail.ru> | 2012-10-04 16:49:03 +0400 |
|---|---|---|
| committer | Ivan Maidanski <ivmai@mail.ru> | 2012-10-04 16:53:48 +0400 |
| commit | a5a424e526272545fcb7faeadd9a910776c31ecc (patch) | |
| tree | 79cb9e752d8bd93d241a0ad21d895ade952396c0 /src/atomic_ops.c | |
| parent | c9b493d00ffab61f0efab8946507482b4ba39217 (diff) | |
| download | libatomic_ops-a5a424e526272545fcb7faeadd9a910776c31ecc.tar.gz | |
Remove duplicate AO_spin and AO_pause definition in atomic_ops_stack
* src/atomic_ops.c (AO_REQUIRE_CAS): Undefine and include atomic_ops.h
unconditionally.
* src/atomic_ops.c (AO_USE_WIN32_PTHREADS): Define macro (and include
windows.h) if Win32 (non-POSIX) to have Sleep-based implementation of
AO_pause.
* src/atomic_ops.c (dummy, AO_spin, AO_pause): Define unconditionally
(to be always available for atomic_ops_stack).
* src/atomic_ops.c (dummy): Rename to spin_dummy.
* src/atomic_ops_stack.c (dummy, AO_spin, AO_pause): Remove definition
(for Win32); remove FIXME.
* src/atomic_ops_stack.c (AO_pause): Declare if
AO_USE_ALMOST_LOCK_FREE defined.
Diffstat (limited to 'src/atomic_ops.c')
| -rw-r--r-- | src/atomic_ops.c | 88 |
1 files changed, 47 insertions, 41 deletions
diff --git a/src/atomic_ops.c b/src/atomic_ops.c index 6842ac0..3017fc4 100644 --- a/src/atomic_ops.c +++ b/src/atomic_ops.c @@ -43,11 +43,12 @@ # define AO_USE_NO_SIGNALS #endif +#undef AO_REQUIRE_CAS +#include "atomic_ops.h" /* Without cas emulation! */ + #if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__BORLANDC__) \ || defined(AO_USE_NO_SIGNALS) -#undef AO_REQUIRE_CAS - #include <pthread.h> #ifndef AO_USE_NO_SIGNALS @@ -66,8 +67,6 @@ # include <sys/select.h> #endif -#include "atomic_ops.h" /* Without cas emulation! */ - #ifndef AO_HAVE_double_t # include "atomic_ops/sysdeps/standard_ao_double_t.h" #endif @@ -101,42 +100,7 @@ AO_TS_t AO_locks[AO_HASH_SIZE] = { AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, }; -static AO_t dummy = 1; - -/* Spin for 2**n units. */ -static void AO_spin(int n) -{ - AO_t j = AO_load(&dummy); - int i = 2 << n; - - while (i-- > 0) - j += (j - 1) << 2; - /* Given 'dummy' is initialized to 1, j is 1 after the loop. */ - AO_store(&dummy, j); -} - -void AO_pause(int n) -{ - if (n < 12) - AO_spin(n); - else - { -# ifdef AO_USE_NANOSLEEP - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = (n > 28 ? 100000 * 1000 : 1 << (n - 2)); - nanosleep(&ts, 0); -# elif defined(AO_USE_WIN32_PTHREADS) - Sleep(n > 28 ? 100 : n < 22 ? 1 : 1 << (n - 22)); /* in millis */ -# else - struct timeval tv; - /* Short async-signal-safe sleep. */ - tv.tv_sec = 0; - tv.tv_usec = n > 28 ? 100000 : 1 << (n - 12); - select(0, 0, 0, 0, &tv); -# endif - } -} +void AO_pause(int); /* defined below */ static void lock_ool(volatile AO_TS_t *l) { @@ -241,6 +205,48 @@ void AO_store_full_emulation(volatile AO_t *addr, AO_t val) #else /* Non-posix platform */ -extern int AO_non_posix_implementation_is_entirely_in_headers; +# include <windows.h> + +# define AO_USE_WIN32_PTHREADS + /* define to use Sleep() */ + + extern int AO_non_posix_implementation_is_entirely_in_headers; #endif + +static AO_t spin_dummy = 1; + +/* Spin for 2**n units. */ +static void AO_spin(int n) +{ + AO_t j = AO_load(&spin_dummy); + int i = 2 << n; + + while (i-- > 0) + j += (j - 1) << 2; + /* Given 'spin_dummy' is initialized to 1, j is 1 after the loop. */ + AO_store(&spin_dummy, j); +} + +void AO_pause(int n) +{ + if (n < 12) + AO_spin(n); + else + { +# ifdef AO_USE_NANOSLEEP + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = (n > 28 ? 100000 * 1000 : 1 << (n - 2)); + nanosleep(&ts, 0); +# elif defined(AO_USE_WIN32_PTHREADS) + Sleep(n > 28 ? 100 : n < 22 ? 1 : 1 << (n - 22)); /* in millis */ +# else + struct timeval tv; + /* Short async-signal-safe sleep. */ + tv.tv_sec = 0; + tv.tv_usec = n > 28 ? 100000 : 1 << (n - 12); + select(0, 0, 0, 0, &tv); +# endif + } +} |
