From a8ba24aecfbeaa955c07d644ceb9e6f35290f3f4 Mon Sep 17 00:00:00 2001 From: gbeauche <> Date: Sat, 25 Jun 2005 11:40:29 +0000 Subject: [PATCH] Use fast spinlocks only for small enough atomic operations. Otherwise, you run into some performance problems in e.g. video graphics experience because of busywaits in the current spin_lock() implementation. --- BasiliskII/src/Unix/video_vosf.h | 16 ++++++++-------- SheepShaver/src/Unix/sysdeps.h | 15 ++++++++------- SheepShaver/src/Unix/video_x.cpp | 20 ++++++++++---------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/BasiliskII/src/Unix/video_vosf.h b/BasiliskII/src/Unix/video_vosf.h index 90ed0747..720b1d00 100644 --- a/BasiliskII/src/Unix/video_vosf.h +++ b/BasiliskII/src/Unix/video_vosf.h @@ -168,18 +168,18 @@ static inline int find_next_page_clear(int page) #endif } -#ifdef HAVE_SPINLOCKS -static spinlock_t vosf_lock = SPIN_LOCK_UNLOCKED; // Mutex to protect frame buffer (dirtyPages in fact) -#define LOCK_VOSF spin_lock(&vosf_lock) -#define UNLOCK_VOSF spin_unlock(&vosf_lock) +#if defined(HAVE_PTHREADS) +static pthread_mutex_t vosf_lock = PTHREAD_MUTEX_INITIALIZER; // Mutex to protect frame buffer (dirtyPages in fact) +#define LOCK_VOSF pthread_mutex_lock(&vosf_lock); +#define UNLOCK_VOSF pthread_mutex_unlock(&vosf_lock); #elif defined(_WIN32) static mutex_t vosf_lock; // Mutex to protect frame buffer (dirtyPages in fact) #define LOCK_VOSF vosf_lock.lock(); #define UNLOCK_VOSF vosf_lock.unlock(); -#elif defined(HAVE_PTHREADS) -static pthread_mutex_t vosf_lock = PTHREAD_MUTEX_INITIALIZER; // Mutex to protect frame buffer (dirtyPages in fact) -#define LOCK_VOSF pthread_mutex_lock(&vosf_lock); -#define UNLOCK_VOSF pthread_mutex_unlock(&vosf_lock); +#elif defined(HAVE_SPINLOCKS) +static spinlock_t vosf_lock = SPIN_LOCK_UNLOCKED; // Mutex to protect frame buffer (dirtyPages in fact) +#define LOCK_VOSF spin_lock(&vosf_lock) +#define UNLOCK_VOSF spin_unlock(&vosf_lock) #else #define LOCK_VOSF #define UNLOCK_VOSF diff --git a/SheepShaver/src/Unix/sysdeps.h b/SheepShaver/src/Unix/sysdeps.h index e1d94b99..56d9623c 100644 --- a/SheepShaver/src/Unix/sysdeps.h +++ b/SheepShaver/src/Unix/sysdeps.h @@ -372,7 +372,8 @@ typedef volatile int spinlock_t; static const spinlock_t SPIN_LOCK_UNLOCKED = 0; -#if HAVE_TEST_AND_SET +#if defined(HAVE_TEST_AND_SET) && defined(HAVE_PTHREADS) +// There is nothing to lock if we are not in an multithreaded environment #define HAVE_SPINLOCKS 1 static inline void spin_lock(spinlock_t *lock) { @@ -442,16 +443,16 @@ typedef struct rgb_color { } rgb_color; // X11 display fast locks -#ifdef HAVE_SPINLOCKS -#define X11_LOCK_TYPE spinlock_t -#define X11_LOCK_INIT SPIN_LOCK_UNLOCKED -#define XDisplayLock() spin_lock(&x_display_lock) -#define XDisplayUnlock() spin_unlock(&x_display_lock) -#elif defined(HAVE_PTHREADS) +#if defined(HAVE_PTHREADS) #define X11_LOCK_TYPE pthread_mutex_t #define X11_LOCK_INIT PTHREAD_MUTEX_INITIALIZER #define XDisplayLock() pthread_mutex_lock(&x_display_lock); #define XDisplayUnlock() pthread_mutex_unlock(&x_display_lock); +#elif defined(HAVE_SPINLOCKS) +#define X11_LOCK_TYPE spinlock_t +#define X11_LOCK_INIT SPIN_LOCK_UNLOCKED +#define XDisplayLock() spin_lock(&x_display_lock) +#define XDisplayUnlock() spin_unlock(&x_display_lock) #else #define XDisplayLock() #define XDisplayUnlock() diff --git a/SheepShaver/src/Unix/video_x.cpp b/SheepShaver/src/Unix/video_x.cpp index 5bffd1e1..816b002c 100644 --- a/SheepShaver/src/Unix/video_x.cpp +++ b/SheepShaver/src/Unix/video_x.cpp @@ -168,28 +168,28 @@ static int num_x_video_modes; #endif // Mutex to protect palette -#ifdef HAVE_SPINLOCKS -static spinlock_t x_palette_lock = SPIN_LOCK_UNLOCKED; -#define LOCK_PALETTE spin_lock(&x_palette_lock) -#define UNLOCK_PALETTE spin_unlock(&x_palette_lock) -#elif defined(HAVE_PTHREADS) +#if defined(HAVE_PTHREADS) static pthread_mutex_t x_palette_lock = PTHREAD_MUTEX_INITIALIZER; #define LOCK_PALETTE pthread_mutex_lock(&x_palette_lock) #define UNLOCK_PALETTE pthread_mutex_unlock(&x_palette_lock) +#elif defined(HAVE_SPINLOCKS) +static spinlock_t x_palette_lock = SPIN_LOCK_UNLOCKED; +#define LOCK_PALETTE spin_lock(&x_palette_lock) +#define UNLOCK_PALETTE spin_unlock(&x_palette_lock) #else #define LOCK_PALETTE #define UNLOCK_PALETTE #endif // Mutex to protect frame buffer -#ifdef HAVE_SPINLOCKS -static spinlock_t frame_buffer_lock = SPIN_LOCK_UNLOCKED; -#define LOCK_FRAME_BUFFER spin_lock(&frame_buffer_lock) -#define UNLOCK_FRAME_BUFFER spin_unlock(&frame_buffer_lock) -#elif defined(HAVE_PTHREADS) +#if defined(HAVE_PTHREADS) static pthread_mutex_t frame_buffer_lock = PTHREAD_MUTEX_INITIALIZER; #define LOCK_FRAME_BUFFER pthread_mutex_lock(&frame_buffer_lock); #define UNLOCK_FRAME_BUFFER pthread_mutex_unlock(&frame_buffer_lock); +#elif defined(HAVE_SPINLOCKS) +static spinlock_t frame_buffer_lock = SPIN_LOCK_UNLOCKED; +#define LOCK_FRAME_BUFFER spin_lock(&frame_buffer_lock) +#define UNLOCK_FRAME_BUFFER spin_unlock(&frame_buffer_lock) #else #define LOCK_FRAME_BUFFER #define UNLOCK_FRAME_BUFFER