Patch adding Wii support by tueidj, part 6: mutexes

For the Wii, SDL's mutex functionality is used.  The implementation in the
original patch was wrong though, so this part required non-trivial changes.

git-svn-id: https://svn.eduke32.com/eduke32@2626 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2012-05-01 12:39:20 +00:00
parent f775faf435
commit 830f73a316
2 changed files with 27 additions and 12 deletions

View file

@ -1,17 +1,25 @@
#ifndef __mutex_h__ #ifndef __mutex_h__
#define __mutex_h__ #define __mutex_h__
/* Mutual exclusion mechanism wrappers for the different platforms */
#if defined(_WIN32) #if defined(_WIN32)
#include <windows.h> # include <windows.h>
#include <process.h> # include <process.h>
#elif !defined GEKKO
# include <pthread.h>
#else #else
#include <pthread.h> # include <SDL.h>
#endif #endif
#if defined(_WIN32) #if defined(_WIN32)
typedef HANDLE mutex_t; typedef HANDLE mutex_t;
#else #elif !defined GEKKO
typedef pthread_mutex_t mutex_t; typedef pthread_mutex_t mutex_t;
#else
/* PK: I don't like pointer typedefs, but SDL_CreateMutex() _returns_ one,
* so we're out of luck with our interface. */
typedef SDL_mutex* mutex_t;
#endif #endif
extern int32_t mutex_init(mutex_t *mutex); extern int32_t mutex_init(mutex_t *mutex);

View file

@ -6,30 +6,37 @@ int32_t mutex_init(mutex_t *mutex)
#ifdef _WIN32 #ifdef _WIN32
*mutex = CreateMutex(0, FALSE, 0); *mutex = CreateMutex(0, FALSE, 0);
return (*mutex == 0); return (*mutex == 0);
#else #elif !defined GEKKO
return pthread_mutex_init(mutex, NULL); return pthread_mutex_init(mutex, NULL);
#endif #else
if (mutex)
{
*mutex = SDL_CreateMutex();
if (*mutex != NULL)
return 0;
}
return -1; return -1;
#endif
} }
int32_t mutex_lock(mutex_t *mutex) int32_t mutex_lock(mutex_t *mutex)
{ {
#ifdef _WIN32 #ifdef _WIN32
return (WaitForSingleObject(*mutex, INFINITE) == WAIT_FAILED); return (WaitForSingleObject(*mutex, INFINITE) == WAIT_FAILED);
#else #elif !defined GEKKO
return pthread_mutex_lock(mutex); return pthread_mutex_lock(mutex);
#else
return SDL_LockMutex(*mutex);
#endif #endif
return -1;
} }
int32_t mutex_unlock(mutex_t *mutex) int32_t mutex_unlock(mutex_t *mutex)
{ {
#ifdef _WIN32 #ifdef _WIN32
return (ReleaseMutex(*mutex) == 0); return (ReleaseMutex(*mutex) == 0);
#else #elif !defined GEKKO
return pthread_mutex_unlock(mutex); return pthread_mutex_unlock(mutex);
#else
return SDL_UnlockMutex(*mutex);
#endif #endif
return -1;
} }