mirror of
https://github.com/kanjitalk755/macemu.git
synced 2025-01-12 16:30:44 +00:00
use native windows critical sections to implement atomic interrupt flags
handling and B2_mutexes
This commit is contained in:
parent
ceba60d76f
commit
ce1420dcce
@ -24,7 +24,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <SDL_mutex.h>
|
|
||||||
|
|
||||||
#include "sysdeps.h"
|
#include "sysdeps.h"
|
||||||
#include "main.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
|
* Memory management helpers
|
||||||
*/
|
*/
|
||||||
@ -875,9 +835,7 @@ static DWORD tick_func(void *arg)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
struct B2_mutex {
|
struct B2_mutex {
|
||||||
B2_mutex() { m = SDL_CreateMutex(); }
|
mutex_t m;
|
||||||
~B2_mutex() { if (m) SDL_DestroyMutex(m); }
|
|
||||||
SDL_mutex *m;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
B2_mutex *B2_create_mutex(void)
|
B2_mutex *B2_create_mutex(void)
|
||||||
@ -887,14 +845,12 @@ B2_mutex *B2_create_mutex(void)
|
|||||||
|
|
||||||
void B2_lock_mutex(B2_mutex *mutex)
|
void B2_lock_mutex(B2_mutex *mutex)
|
||||||
{
|
{
|
||||||
if (mutex)
|
mutex->m.lock();
|
||||||
SDL_LockMutex(mutex->m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void B2_unlock_mutex(B2_mutex *mutex)
|
void B2_unlock_mutex(B2_mutex *mutex)
|
||||||
{
|
{
|
||||||
if (mutex)
|
mutex->m.unlock();
|
||||||
SDL_UnlockMutex(mutex->m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void B2_delete_mutex(B2_mutex *mutex)
|
void B2_delete_mutex(B2_mutex *mutex)
|
||||||
@ -908,15 +864,20 @@ void B2_delete_mutex(B2_mutex *mutex)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
volatile uint32 InterruptFlags = 0;
|
volatile uint32 InterruptFlags = 0;
|
||||||
|
static mutex_t intflags_mutex;
|
||||||
|
|
||||||
void SetInterruptFlag(uint32 flag)
|
void SetInterruptFlag(uint32 flag)
|
||||||
{
|
{
|
||||||
atomic_or((int *)&InterruptFlags, flag);
|
intflags_mutex.lock();
|
||||||
|
InterruptFlags |= flag;
|
||||||
|
intflags_mutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClearInterruptFlag(uint32 flag)
|
void ClearInterruptFlag(uint32 flag)
|
||||||
{
|
{
|
||||||
atomic_and((int *)&InterruptFlags, ~flag);
|
intflags_mutex.lock();
|
||||||
|
InterruptFlags &= ~flag;
|
||||||
|
intflags_mutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user