#include "SDL_internal.h"
#include <errno.h>
#include <pthread.h>
struct SDL_RWLock
{
pthread_rwlock_t id;
};
SDL_RWLock *SDL_CreateRWLock(void)
{
SDL_RWLock *rwlock;
rwlock = (SDL_RWLock *)SDL_calloc(1, sizeof(*rwlock));
if (rwlock) {
if (pthread_rwlock_init(&rwlock->id, NULL) != 0) {
SDL_SetError("pthread_rwlock_init() failed");
SDL_free(rwlock);
rwlock = NULL;
}
}
return rwlock;
}
void SDL_DestroyRWLock(SDL_RWLock *rwlock)
{
if (rwlock) {
pthread_rwlock_destroy(&rwlock->id);
SDL_free(rwlock);
}
}
void SDL_LockRWLockForReading(SDL_RWLock *rwlock) SDL_NO_THREAD_SAFETY_ANALYSIS {
if (rwlock) {
const int rc = pthread_rwlock_rdlock(&rwlock->id);
SDL_assert(rc == 0); }
}
void SDL_LockRWLockForWriting(SDL_RWLock *rwlock) SDL_NO_THREAD_SAFETY_ANALYSIS {
if (rwlock) {
const int rc = pthread_rwlock_wrlock(&rwlock->id);
SDL_assert(rc == 0); }
}
bool SDL_TryLockRWLockForReading(SDL_RWLock *rwlock)
{
bool result = true;
if (rwlock) {
const int rc = pthread_rwlock_tryrdlock(&rwlock->id);
if (rc != 0) {
result = false;
if (rc != EBUSY) {
SDL_assert(!"Error trying to lock rwlock for reading"); }
}
}
return result;
}
bool SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock)
{
bool result = true;
if (rwlock) {
const int rc = pthread_rwlock_trywrlock(&rwlock->id);
if (rc != 0) {
result = false;
if (rc != EBUSY) {
SDL_assert(!"Error trying to lock rwlock for writing"); }
}
}
return result;
}
void SDL_UnlockRWLock(SDL_RWLock *rwlock) SDL_NO_THREAD_SAFETY_ANALYSIS {
if (rwlock) {
const int rc = pthread_rwlock_unlock(&rwlock->id);
SDL_assert(rc == 0); }
}