diff options
-rw-r--r-- | source/blender/blenlib/BLI_threads.h | 6 | ||||
-rw-r--r-- | source/blender/blenlib/intern/threads.c | 27 |
2 files changed, 22 insertions, 11 deletions
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h index 0b1b4d8ee8c..9d672b1ce88 100644 --- a/source/blender/blenlib/BLI_threads.h +++ b/source/blender/blenlib/BLI_threads.h @@ -111,8 +111,10 @@ void BLI_mutex_unlock(ThreadMutex *mutex); /* Spin Lock */ -#ifdef __APPLE__ -typedef OSSpinLock SpinLock; +#if defined(__APPLE__) +typedef OSSpinLock ; +#elif defined(_MSC_VER) +typedef volatile int SpinLock; #else typedef pthread_spinlock_t SpinLock; #endif diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c index abf611d1245..fbb64f3ece2 100644 --- a/source/blender/blenlib/intern/threads.c +++ b/source/blender/blenlib/intern/threads.c @@ -472,8 +472,10 @@ void BLI_mutex_free(ThreadMutex *mutex) void BLI_spin_init(SpinLock *spin) { -#ifdef __APPLE__ +#if defined(__APPLE__) *spin = OS_SPINLOCK_INIT; +#elif defined(_MSC_VER) + *spin = 0; #else pthread_spin_init(spin, 0); #endif @@ -481,8 +483,14 @@ void BLI_spin_init(SpinLock *spin) void BLI_spin_lock(SpinLock *spin) { -#ifdef __APPLE__ +#if defined(__APPLE__) OSSpinLockLock(spin); +#elif defined(_MSC_VER) + while (InterlockedExchangeAcquire(spin, 1)) { + while (*spin) { + /* pass */ + } + } #else pthread_spin_lock(spin); #endif @@ -490,23 +498,24 @@ void BLI_spin_lock(SpinLock *spin) void BLI_spin_unlock(SpinLock *spin) { -#ifdef __APPLE__ +#if defined(__APPLE__) OSSpinLockUnlock(spin); +#elif defined(_MSC_VER) + _ReadWriteBarrier(); + *spin = 0; #else pthread_spin_unlock(spin); #endif } -#ifndef __APPLE__ void BLI_spin_end(SpinLock *spin) { - pthread_spin_destroy(spin); -} +#if defined(__APPLE__) +#elif defined(_MSC_VER) #else -void BLI_spin_end(SpinLock *UNUSED(spin)) -{ -} + pthread_spin_destroy(spin); #endif +} /* Read/Write Mutex Lock */ |