use native windows critical sections to implement atomic interrupt flags

handling and B2_mutexes
This commit is contained in:
gbeauche 2004-12-11 10:17:48 +00:00
parent ceba60d76f
commit ce1420dcce

View File

@ -24,7 +24,6 @@
#include <string.h>
#include <SDL.h>
#include <SDL_mutex.h>
#include "sysdeps.h"
#include "main.h"
@ -137,45 +136,6 @@ uintptr SignalStackBase(void)
}
/*
* Atomic operations
*/
#if HAVE_SPINLOCKS
static spinlock_t atomic_ops_lock = SPIN_LOCK_UNLOCKED;
#else
#define spin_lock(LOCK)
#define spin_unlock(LOCK)
#endif
int atomic_add(int *var, int v)
{
spin_lock(&atomic_ops_lock);
int ret = *var;
*var += v;
spin_unlock(&atomic_ops_lock);
return ret;
}
int atomic_and(int *var, int v)
{
spin_lock(&atomic_ops_lock);
int ret = *var;
*var &= v;
spin_unlock(&atomic_ops_lock);
return ret;
}
int atomic_or(int *var, int v)
{
spin_lock(&atomic_ops_lock);
int ret = *var;
*var |= v;
spin_unlock(&atomic_ops_lock);
return ret;
}
/*
* Memory management helpers
*/
@ -875,9 +835,7 @@ static DWORD tick_func(void *arg)
*/
struct B2_mutex {
B2_mutex() { m = SDL_CreateMutex(); }
~B2_mutex() { if (m) SDL_DestroyMutex(m); }
SDL_mutex *m;
mutex_t m;
};
B2_mutex *B2_create_mutex(void)
@ -887,14 +845,12 @@ B2_mutex *B2_create_mutex(void)
void B2_lock_mutex(B2_mutex *mutex)
{
if (mutex)
SDL_LockMutex(mutex->m);
mutex->m.lock();
}
void B2_unlock_mutex(B2_mutex *mutex)
{
if (mutex)
SDL_UnlockMutex(mutex->m);
mutex->m.unlock();
}
void B2_delete_mutex(B2_mutex *mutex)
@ -908,15 +864,20 @@ void B2_delete_mutex(B2_mutex *mutex)
*/
volatile uint32 InterruptFlags = 0;
static mutex_t intflags_mutex;
void SetInterruptFlag(uint32 flag)
{
atomic_or((int *)&InterruptFlags, flag);
intflags_mutex.lock();
InterruptFlags |= flag;
intflags_mutex.unlock();
}
void ClearInterruptFlag(uint32 flag)
{
atomic_and((int *)&InterruptFlags, ~flag);
intflags_mutex.lock();
InterruptFlags &= ~flag;
intflags_mutex.unlock();
}