diff options
author | rpj <rpj> | 2002-01-08 02:21:06 +0000 |
---|---|---|
committer | rpj <rpj> | 2002-01-08 02:21:06 +0000 |
commit | 5f7ea668d6d4c96d9e0efea21ac5e300fda552ad (patch) | |
tree | 3d1f0fddfaf97bd6232edc9b05318d8daa0fca4c /mutex.c | |
parent | 0337d817b128c648d97a79f42b303421b5b76386 (diff) |
* mutex.c (pthread_mutex_trylock): use
ptw32_interlocked_compare_exchange function pointer
rather than ptw32_InterlockedCompareExchange() directly
to retain portability to non-iX86 processors,
e.g. WinCE etc. The pointer will point to the native
OS version of InterlockedCompareExchange() if the
OS supports it (see ChangeLog entry of 2001-10-17).
Diffstat (limited to 'mutex.c')
-rw-r--r-- | mutex.c | 60 |
1 files changed, 30 insertions, 30 deletions
@@ -699,12 +699,12 @@ pthread_mutex_unlock(pthread_mutex_t *mutex) { mx->ownerThread = NULL; - if( InterlockedDecrement( &mx->lock_idx ) >= 0 ) - { - /* Someone is waiting on that mutex */ - ReleaseSemaphore( mx->wait_sema, 1, NULL ); - } - } + if( InterlockedDecrement( &mx->lock_idx ) >= 0 ) + { + /* Someone is waiting on that mutex */ + ReleaseSemaphore( mx->wait_sema, 1, NULL ); + } + } } else { @@ -745,35 +745,35 @@ pthread_mutex_trylock(pthread_mutex_t *mutex) if (result == 0) { - - if( PTW32_MUTEX_LOCK_IDX_INIT == ptw32_InterlockedCompareExchange( - &mx->lock_idx, 0, PTW32_MUTEX_LOCK_IDX_INIT ) ) - { - mx->recursive_count = 1; - mx->ownerThread = (mx->kind != PTHREAD_MUTEX_FAST_NP - ? pthread_self() - : (pthread_t) PTW32_MUTEX_OWNER_ANONYMOUS); - } - + if ( (PTW32_INTERLOCKED_LONG) PTW32_MUTEX_LOCK_IDX_INIT == + ptw32_interlocked_compare_exchange((PTW32_INTERLOCKED_LPLONG) &mx->lock_idx, + (PTW32_INTERLOCKED_LONG) 0, + (PTW32_INTERLOCKED_LONG) PTW32_MUTEX_LOCK_IDX_INIT)) + { + mx->recursive_count = 1; + mx->ownerThread = (mx->kind != PTHREAD_MUTEX_FAST_NP + ? pthread_self() + : (pthread_t) PTW32_MUTEX_OWNER_ANONYMOUS); + } else - { - if( mx->kind != PTHREAD_MUTEX_FAST_NP && - pthread_equal( mx->ownerThread, pthread_self() ) ) - { - if( mx->kind == PTHREAD_MUTEX_RECURSIVE_NP ) + { + if( mx->kind != PTHREAD_MUTEX_FAST_NP && + pthread_equal( mx->ownerThread, pthread_self() ) ) { - mx->recursive_count++; + if( mx->kind == PTHREAD_MUTEX_RECURSIVE_NP ) + { + mx->recursive_count++; + } + else + { + result = EDEADLK; + } } - else + else { - result = EDEADLK; + result = EBUSY; } - } - else - { - result = EBUSY; - } - } + } } return(result); |