diff --git a/PHP/src/snowflake/spinlock.c b/PHP/src/snowflake/spinlock.c index 977a409..eb7b86a 100644 --- a/PHP/src/snowflake/spinlock.c +++ b/PHP/src/snowflake/spinlock.c @@ -10,7 +10,7 @@ extern int ncpu; extern int spin; -void spin_lock(atomic_t* lock, uint32_t pid) +void spin_lock(atomic_t *lock, uint32_t pid) { int i, n; @@ -22,8 +22,8 @@ void spin_lock(atomic_t* lock, uint32_t pid) InterlockedCompareExchange(lock, pid, 0) == 0 #else __sync_bool_compare_and_swap(lock, 0, pid) -#endif - ) +#endif + ) { return; } @@ -36,11 +36,7 @@ void spin_lock(atomic_t* lock, uint32_t pid) for (i = 0; i < n; i++) { -#ifdef WIN32 - MemoryBarrier(); -#else - __asm("pause"); -#endif + atomic_cpu_pause(); } if (*lock == 0 && @@ -48,8 +44,8 @@ void spin_lock(atomic_t* lock, uint32_t pid) InterlockedCompareExchange(lock, pid, 0) == 0 #else __sync_bool_compare_and_swap(lock, 0, pid) -#endif - ) +#endif + ) { return; } @@ -63,11 +59,11 @@ void spin_lock(atomic_t* lock, uint32_t pid) } } -void spin_unlock(atomic_t* lock, uint32_t pid) +void spin_unlock(atomic_t *lock, uint32_t pid) { #ifdef WIN32 InterlockedCompareExchange(lock, 0, pid); #else __sync_bool_compare_and_swap(lock, pid, 0); -#endif +#endif } diff --git a/PHP/src/snowflake/spinlock.h b/PHP/src/snowflake/spinlock.h index c1535f1..c334407 100644 --- a/PHP/src/snowflake/spinlock.h +++ b/PHP/src/snowflake/spinlock.h @@ -8,4 +8,14 @@ extern void spin_lock(atomic_t *lock, uint32_t pid); extern void spin_unlock(atomic_t *lock, uint32_t pid); +#if defined(WIN32) +#define atomic_cpu_pause() MemoryBarrier(); +#elif defined(__x86_64__) +#define atomic_cpu_pause() __asm__ __volatile__("pause") +#elif defined(__aarch64__) +#define atomic_cpu_pause() __asm__ __volatile__("yield") +#else +#define atomic_cpu_pause() +#endif + #endif diff --git a/PHP/tests/003.phpt b/PHP/tests/003.phpt index b3d4647..5a0564b 100644 --- a/PHP/tests/003.phpt +++ b/PHP/tests/003.phpt @@ -1,16 +1,15 @@ --TEST-- -Check for snowdrift serial +Check for snowdrift batch get unique --SKIPIF-- --FILE-- --EXPECT-- -bool(true) \ No newline at end of file +int(100000) \ No newline at end of file diff --git a/PHP/tests/004.phpt b/PHP/tests/004.phpt deleted file mode 100644 index 5a0564b..0000000 --- a/PHP/tests/004.phpt +++ /dev/null @@ -1,15 +0,0 @@ ---TEST-- -Check for snowdrift batch get unique ---SKIPIF-- - ---FILE-- - ---EXPECT-- -int(100000) \ No newline at end of file