Add read-write locks for POSIX
Signed-off-by: Jeroen Koekkoek <jeroen@koekkoek.nl>
This commit is contained in:
		
							parent
							
								
									69f563be5b
								
							
						
					
					
						commit
						ac020f62f7
					
				
					 4 changed files with 159 additions and 223 deletions
				
			
		| 
						 | 
				
			
			@ -17,6 +17,7 @@ IF(${platform} IN_LIST posix_platforms)
 | 
			
		|||
  set(platform posix)
 | 
			
		||||
ENDIF()
 | 
			
		||||
 | 
			
		||||
# For posix platforms include the files in the posix/ directory.
 | 
			
		||||
PREPEND(srcs_platform ${platform} os_platform_errno.c os_platform_heap.c os_platform_init.c os_platform_process.c os_platform_ifaddrs.c os_platform_socket.c os_platform_stdlib.c os_platform_sync.c os_platform_thread.c os_platform_time.c)
 | 
			
		||||
 | 
			
		||||
include (GenerateExportHeader)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,27 +23,15 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
    typedef struct os_cond {
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        /* Used to identify initialized cond when memory is freed -
 | 
			
		||||
           keep this first in the structure so its so its address is
 | 
			
		||||
           the same as the os_cond */
 | 
			
		||||
        uint64_t signature;
 | 
			
		||||
#endif
 | 
			
		||||
        pthread_cond_t cond;
 | 
			
		||||
    } os_cond;
 | 
			
		||||
 | 
			
		||||
    typedef struct os_mutex {
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        /* Used to identify initialized cond when memory is freed -
 | 
			
		||||
           keep this first in the structure so its so its address is
 | 
			
		||||
           the same as the os_cond */
 | 
			
		||||
        uint64_t signature;
 | 
			
		||||
#endif
 | 
			
		||||
        pthread_mutex_t mutex;
 | 
			
		||||
    } os_mutex;
 | 
			
		||||
 | 
			
		||||
    typedef struct os_rwlock {
 | 
			
		||||
        os_mutex mutex;
 | 
			
		||||
      pthread_rwlock_t rwlock;
 | 
			
		||||
    } os_rwlock;
 | 
			
		||||
 | 
			
		||||
    typedef pthread_once_t os_once_t;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -78,9 +78,7 @@ void os_mutexInit (os_mutex *mutex)
 | 
			
		|||
{
 | 
			
		||||
  int shared;
 | 
			
		||||
  assert (mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert (mutex->signature != OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  pthread_mutex_init (&mutex->mutex, NULL);
 | 
			
		||||
#if HAVE_LKST
 | 
			
		||||
  if (ospl_lkst_enabled)
 | 
			
		||||
| 
						 | 
				
			
			@ -88,9 +86,6 @@ void os_mutexInit (os_mutex *mutex)
 | 
			
		|||
#else
 | 
			
		||||
  (void)shared;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  mutex->signature = OS_MUTEX_MAGIC_SIG;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_mutexDestroy (os_mutex *mutex)
 | 
			
		||||
| 
						 | 
				
			
			@ -100,22 +95,15 @@ void os_mutexDestroy (os_mutex *mutex)
 | 
			
		|||
  if (ospl_lkst_enabled)
 | 
			
		||||
    lkst_track_destroy (mutex);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert(mutex->signature == OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  if (pthread_mutex_destroy (&mutex->mutex) != 0)
 | 
			
		||||
    abort();
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  mutex->signature = 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_mutexLock (os_mutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
  assert (mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert(mutex->signature == OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if HAVE_LKST
 | 
			
		||||
  if (!ospl_lkst_enabled)
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -146,9 +134,7 @@ os_result os_mutexLock_s (os_mutex *mutex)
 | 
			
		|||
{
 | 
			
		||||
  int result;
 | 
			
		||||
  assert (mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert(mutex->signature == OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if HAVE_LKST
 | 
			
		||||
  if (!ospl_lkst_enabled)
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -178,9 +164,7 @@ os_result os_mutexTryLock (os_mutex *mutex)
 | 
			
		|||
{
 | 
			
		||||
  int result;
 | 
			
		||||
  assert (mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert(mutex->signature == OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  result = pthread_mutex_trylock (&mutex->mutex);
 | 
			
		||||
  if (result != 0 && result != EBUSY)
 | 
			
		||||
    abort();
 | 
			
		||||
| 
						 | 
				
			
			@ -194,9 +178,7 @@ os_result os_mutexTryLock (os_mutex *mutex)
 | 
			
		|||
void os_mutexUnlock (os_mutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
  assert (mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert(mutex->signature == OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if HAVE_LKST
 | 
			
		||||
  if (ospl_lkst_enabled)
 | 
			
		||||
    lkst_track_op (mutex, LKST_UNLOCK, mach_absolute_time (), 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -208,36 +190,23 @@ void os_mutexUnlock (os_mutex *mutex)
 | 
			
		|||
void os_condInit (os_cond *cond, os_mutex *dummymtx __attribute__ ((unused)))
 | 
			
		||||
{
 | 
			
		||||
  assert (cond != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert(cond->signature != OS_COND_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  pthread_cond_init (&cond->cond, NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  cond->signature = OS_COND_MAGIC_SIG;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_condDestroy (os_cond *cond)
 | 
			
		||||
{
 | 
			
		||||
  assert (cond != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert(cond->signature == OS_COND_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  if (pthread_cond_destroy (&cond->cond) != 0)
 | 
			
		||||
    abort();
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  cond->signature = 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_condWait (os_cond *cond, os_mutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
  assert (cond != NULL);
 | 
			
		||||
  assert (mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert( cond->signature == OS_COND_MAGIC_SIG );
 | 
			
		||||
  assert( mutex->signature == OS_MUTEX_MAGIC_SIG );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if HAVE_LKST
 | 
			
		||||
  if (ospl_lkst_enabled)
 | 
			
		||||
    lkst_track_op (mutex, LKST_UNLOCK, mach_absolute_time (), 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -263,10 +232,6 @@ os_result os_condTimedWait (os_cond *cond, os_mutex *mutex, const os_time *time)
 | 
			
		|||
  assert (cond != NULL);
 | 
			
		||||
  assert (mutex != NULL);
 | 
			
		||||
  assert (time != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert( cond->signature == OS_COND_MAGIC_SIG );
 | 
			
		||||
  assert( mutex->signature == OS_MUTEX_MAGIC_SIG );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  (void) gettimeofday (&tv, NULL);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -300,9 +265,7 @@ os_result os_condTimedWait (os_cond *cond, os_mutex *mutex, const os_time *time)
 | 
			
		|||
void os_condSignal (os_cond *cond)
 | 
			
		||||
{
 | 
			
		||||
  assert (cond != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert( cond->signature == OS_COND_MAGIC_SIG );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  if (pthread_cond_signal (&cond->cond) != 0)
 | 
			
		||||
    abort();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -310,47 +273,86 @@ void os_condSignal (os_cond *cond)
 | 
			
		|||
void os_condBroadcast (os_cond *cond)
 | 
			
		||||
{
 | 
			
		||||
  assert (cond != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
  assert( cond->signature == OS_COND_MAGIC_SIG );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  if (pthread_cond_broadcast (&cond->cond) != 0)
 | 
			
		||||
    abort();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_rwlockInit (os_rwlock *rwlock)
 | 
			
		||||
void os_rwlockInit(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
  os_mutexInit (&rwlock->mutex);
 | 
			
		||||
    int err = 0;
 | 
			
		||||
 | 
			
		||||
    assert(rwlock != NULL);
 | 
			
		||||
 | 
			
		||||
    /* process-shared attribute is set to PTHREAD_PROCESS_PRIVATE by default */
 | 
			
		||||
    if ((err = pthread_rwlock_init(&rwlock->rwlock, NULL)) != 0) {
 | 
			
		||||
        abort();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_rwlockDestroy (os_rwlock *rwlock)
 | 
			
		||||
void os_rwlockDestroy(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
  assert (rwlock != NULL);
 | 
			
		||||
  os_mutexDestroy (&rwlock->mutex);
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    assert(rwlock != NULL);
 | 
			
		||||
 | 
			
		||||
    if ((err = pthread_rwlock_destroy(&rwlock->rwlock)) != 0) {
 | 
			
		||||
        abort();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_rwlockRead (os_rwlock *rwlock)
 | 
			
		||||
void os_rwlockRead(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
  os_mutexLock (&rwlock->mutex);
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    assert(rwlock != NULL);
 | 
			
		||||
 | 
			
		||||
    err = pthread_rwlock_rdlock(&rwlock->rwlock);
 | 
			
		||||
    assert(err == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_rwlockWrite (os_rwlock *rwlock)
 | 
			
		||||
void os_rwlockWrite(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
  os_mutexLock (&rwlock->mutex);
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    assert(rwlock != NULL);
 | 
			
		||||
 | 
			
		||||
    err = pthread_rwlock_wrlock(&rwlock->rwlock);
 | 
			
		||||
    assert(err == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
os_result os_rwlockTryRead (os_rwlock *rwlock)
 | 
			
		||||
os_result os_rwlockTryRead(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
  return os_mutexTryLock (&rwlock->mutex);
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    assert(rwlock != NULL);
 | 
			
		||||
 | 
			
		||||
    err = pthread_rwlock_tryrdlock(&rwlock->rwlock);
 | 
			
		||||
    assert(err == 0 || err == EBUSY);
 | 
			
		||||
 | 
			
		||||
    return err == 0 ? os_resultSuccess : os_resultBusy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
os_result os_rwlockTryWrite (os_rwlock *rwlock)
 | 
			
		||||
os_result os_rwlockTryWrite(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
  return os_mutexTryLock (&rwlock->mutex);
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    assert(rwlock != NULL);
 | 
			
		||||
 | 
			
		||||
    err = pthread_rwlock_trywrlock(&rwlock->rwlock);
 | 
			
		||||
    assert(err == 0 || err == EBUSY);
 | 
			
		||||
 | 
			
		||||
    return err == 0 ? os_resultSuccess : os_resultBusy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_rwlockUnlock (os_rwlock *rwlock)
 | 
			
		||||
void os_rwlockUnlock(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
  os_mutexUnlock (&rwlock->mutex);
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    assert(rwlock != NULL);
 | 
			
		||||
 | 
			
		||||
    err = pthread_rwlock_unlock(&rwlock->rwlock);
 | 
			
		||||
    assert(err == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,234 +13,179 @@
 | 
			
		|||
#include "os/os.h"
 | 
			
		||||
 | 
			
		||||
void os_mutexInit(
 | 
			
		||||
        _Out_ os_mutex *mutex)
 | 
			
		||||
    _Out_ os_mutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
        assert(mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(mutex->signature != OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        InitializeSRWLock(&mutex->lock);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        mutex->signature = OS_MUTEX_MAGIC_SIG;
 | 
			
		||||
#endif
 | 
			
		||||
    assert(mutex != NULL);
 | 
			
		||||
 | 
			
		||||
    InitializeSRWLock(&mutex->lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_mutexDestroy(
 | 
			
		||||
        _Inout_ _Post_invalid_ os_mutex *mutex)
 | 
			
		||||
    _Inout_ _Post_invalid_ os_mutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
        assert(mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(mutex->signature == OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
        mutex->signature = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    assert(mutex != NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_Acquires_nonreentrant_lock_(&mutex->lock)
 | 
			
		||||
void os_mutexLock(
 | 
			
		||||
        _Inout_ os_mutex *mutex)
 | 
			
		||||
    _Inout_ os_mutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
        assert(mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(mutex->signature == OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        AcquireSRWLockExclusive(&mutex->lock);
 | 
			
		||||
    assert(mutex != NULL);
 | 
			
		||||
 | 
			
		||||
    AcquireSRWLockExclusive(&mutex->lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_Check_return_
 | 
			
		||||
_When_(return == os_resultSuccess, _Acquires_nonreentrant_lock_(&mutex->lock))
 | 
			
		||||
os_result os_mutexLock_s(
 | 
			
		||||
        _Inout_ os_mutex *mutex)
 | 
			
		||||
    _Inout_ os_mutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
        os_mutexLock(mutex);
 | 
			
		||||
        return os_resultSuccess;
 | 
			
		||||
    os_mutexLock(mutex);
 | 
			
		||||
    return os_resultSuccess;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_Check_return_
 | 
			
		||||
_When_(return == os_resultSuccess, _Acquires_nonreentrant_lock_(&mutex->lock))
 | 
			
		||||
os_result
 | 
			
		||||
os_mutexTryLock(
 | 
			
		||||
        _Inout_ os_mutex *mutex)
 | 
			
		||||
    _Inout_ os_mutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
        assert(mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(mutex->signature == OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        return TryAcquireSRWLockExclusive(&mutex->lock) ? os_resultSuccess : os_resultBusy;
 | 
			
		||||
    assert(mutex != NULL);
 | 
			
		||||
 | 
			
		||||
    return TryAcquireSRWLockExclusive(&mutex->lock) ? os_resultSuccess : os_resultBusy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_Releases_nonreentrant_lock_(&mutex->lock)
 | 
			
		||||
void os_mutexUnlock(
 | 
			
		||||
        _Inout_ os_mutex *mutex)
 | 
			
		||||
    _Inout_ os_mutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
        assert(mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(mutex->signature == OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        ReleaseSRWLockExclusive(&mutex->lock);
 | 
			
		||||
    assert(mutex != NULL);
 | 
			
		||||
 | 
			
		||||
    ReleaseSRWLockExclusive(&mutex->lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_condInit(
 | 
			
		||||
        _Out_ os_cond *cond,
 | 
			
		||||
        _In_ os_mutex *dummymtx)
 | 
			
		||||
{
 | 
			
		||||
        assert(cond != NULL);
 | 
			
		||||
        assert(dummymtx != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(cond->signature != OS_COND_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        (void)dummymtx;
 | 
			
		||||
        InitializeConditionVariable(&cond->cond);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        cond->signature = OS_COND_MAGIC_SIG;
 | 
			
		||||
#endif
 | 
			
		||||
    assert(cond != NULL);
 | 
			
		||||
    assert(dummymtx != NULL);
 | 
			
		||||
 | 
			
		||||
    (void)dummymtx;
 | 
			
		||||
    InitializeConditionVariable(&cond->cond);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_condDestroy(
 | 
			
		||||
        _Inout_ _Post_invalid_ os_cond *cond)
 | 
			
		||||
{
 | 
			
		||||
        assert(cond != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(cond->signature == OS_COND_MAGIC_SIG);
 | 
			
		||||
        cond->signature = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    assert(cond != NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_condWait(os_cond *cond, os_mutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
        assert(cond != NULL);
 | 
			
		||||
        assert(mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(cond->signature == OS_COND_MAGIC_SIG);
 | 
			
		||||
        assert(mutex->signature == OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        if (!SleepConditionVariableSRW(&cond->cond, &mutex->lock, INFINITE, 0)) {
 | 
			
		||||
                abort();
 | 
			
		||||
        }
 | 
			
		||||
    assert(cond != NULL);
 | 
			
		||||
    assert(mutex != NULL);
 | 
			
		||||
 | 
			
		||||
    if (!SleepConditionVariableSRW(&cond->cond, &mutex->lock, INFINITE, 0)) {
 | 
			
		||||
        abort();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
os_result os_condTimedWait(os_cond *cond, os_mutex *mutex, const os_time *time)
 | 
			
		||||
{
 | 
			
		||||
        DWORD timems;
 | 
			
		||||
        assert(cond != NULL);
 | 
			
		||||
        assert(mutex != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(cond->signature == OS_COND_MAGIC_SIG);
 | 
			
		||||
        assert(mutex->signature == OS_MUTEX_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        timems = time->tv_sec * 1000 + (time->tv_nsec + 999999999) / 1000000;
 | 
			
		||||
        if (SleepConditionVariableSRW(&cond->cond, &mutex->lock, timems, 0))
 | 
			
		||||
                return os_resultSuccess;
 | 
			
		||||
        else if (GetLastError() != ERROR_TIMEOUT)
 | 
			
		||||
                abort();
 | 
			
		||||
        else if (timems != INFINITE)
 | 
			
		||||
                return os_resultTimeout;
 | 
			
		||||
        else
 | 
			
		||||
                return os_resultSuccess;
 | 
			
		||||
    DWORD timems;
 | 
			
		||||
    assert(cond != NULL);
 | 
			
		||||
    assert(mutex != NULL);
 | 
			
		||||
 | 
			
		||||
    timems = time->tv_sec * 1000 + (time->tv_nsec + 999999999) / 1000000;
 | 
			
		||||
    if (SleepConditionVariableSRW(&cond->cond, &mutex->lock, timems, 0)) {
 | 
			
		||||
        return os_resultSuccess;
 | 
			
		||||
    } else if (GetLastError() != ERROR_TIMEOUT) {
 | 
			
		||||
        abort();
 | 
			
		||||
    } else if (timems != INFINITE) {
 | 
			
		||||
        return os_resultTimeout;
 | 
			
		||||
    } else {
 | 
			
		||||
        return os_resultSuccess;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_condSignal(os_cond *cond)
 | 
			
		||||
{
 | 
			
		||||
        assert(cond != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(cond->signature == OS_COND_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        WakeConditionVariable(&cond->cond);
 | 
			
		||||
    assert(cond != NULL);
 | 
			
		||||
 | 
			
		||||
    WakeConditionVariable(&cond->cond);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_condBroadcast(os_cond *cond)
 | 
			
		||||
{
 | 
			
		||||
        assert(cond != NULL);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(cond->signature == OS_COND_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        WakeAllConditionVariable(&cond->cond);
 | 
			
		||||
    assert(cond != NULL);
 | 
			
		||||
 | 
			
		||||
    WakeAllConditionVariable(&cond->cond);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_rwlockInit(_Out_ os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
        assert(rwlock);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(rwlock->signature != OS_RWLOCK_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        InitializeSRWLock(&rwlock->lock);
 | 
			
		||||
        rwlock->state = 0;
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        rwlock->signature = OS_RWLOCK_MAGIC_SIG;
 | 
			
		||||
#endif
 | 
			
		||||
    assert(rwlock);
 | 
			
		||||
 | 
			
		||||
    InitializeSRWLock(&rwlock->lock);
 | 
			
		||||
    rwlock->state = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_rwlockDestroy(_Inout_ _Post_invalid_ os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
        assert(rwlock);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(rwlock->signature != OS_RWLOCK_MAGIC_SIG);
 | 
			
		||||
        rwlock->signature = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    assert(rwlock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_rwlockRead(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
        assert(rwlock);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(rwlock->signature != OS_RWLOCK_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        AcquireSRWLockShared(&rwlock->lock);
 | 
			
		||||
        rwlock->state = 1;
 | 
			
		||||
    assert(rwlock);
 | 
			
		||||
 | 
			
		||||
    AcquireSRWLockShared(&rwlock->lock);
 | 
			
		||||
    rwlock->state = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_rwlockWrite(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
        assert(rwlock);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(rwlock->signature != OS_RWLOCK_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        AcquireSRWLockExclusive(&rwlock->lock);
 | 
			
		||||
        rwlock->state = -1;
 | 
			
		||||
    assert(rwlock);
 | 
			
		||||
 | 
			
		||||
    AcquireSRWLockExclusive(&rwlock->lock);
 | 
			
		||||
    rwlock->state = -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
os_result os_rwlockTryRead(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
        assert(rwlock);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(rwlock->signature != OS_RWLOCK_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        if (TryAcquireSRWLockShared(&rwlock->lock)) {
 | 
			
		||||
                rwlock->state = 1;
 | 
			
		||||
                return os_resultSuccess;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
                return os_resultBusy;
 | 
			
		||||
        }
 | 
			
		||||
    assert(rwlock);
 | 
			
		||||
 | 
			
		||||
    if (TryAcquireSRWLockShared(&rwlock->lock)) {
 | 
			
		||||
        rwlock->state = 1;
 | 
			
		||||
        return os_resultSuccess;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return os_resultBusy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
os_result os_rwlockTryWrite(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
        assert(rwlock);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(rwlock->signature != OS_RWLOCK_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        if (TryAcquireSRWLockExclusive(&rwlock->lock)) {
 | 
			
		||||
                rwlock->state = -1;
 | 
			
		||||
                return os_resultSuccess;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
                return os_resultBusy;
 | 
			
		||||
        }
 | 
			
		||||
    assert(rwlock);
 | 
			
		||||
 | 
			
		||||
    if (TryAcquireSRWLockExclusive(&rwlock->lock)) {
 | 
			
		||||
        rwlock->state = -1;
 | 
			
		||||
        return os_resultSuccess;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return os_resultBusy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void os_rwlockUnlock(os_rwlock *rwlock)
 | 
			
		||||
{
 | 
			
		||||
        assert(rwlock);
 | 
			
		||||
#ifdef OSPL_STRICT_MEM
 | 
			
		||||
        assert(rwlock->signature != OS_RWLOCK_MAGIC_SIG);
 | 
			
		||||
#endif
 | 
			
		||||
        assert(rwlock->state != 0);
 | 
			
		||||
        if (rwlock->state > 0) {
 | 
			
		||||
                ReleaseSRWLockShared(&rwlock->lock);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
                ReleaseSRWLockExclusive(&rwlock->lock);
 | 
			
		||||
        }
 | 
			
		||||
    assert(rwlock);
 | 
			
		||||
 | 
			
		||||
    assert(rwlock->state != 0);
 | 
			
		||||
    if (rwlock->state > 0) {
 | 
			
		||||
        ReleaseSRWLockShared(&rwlock->lock);
 | 
			
		||||
    } else {
 | 
			
		||||
        ReleaseSRWLockExclusive(&rwlock->lock);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct os__onceWrapper {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue