diff options
author | rpj <rpj> | 2002-02-02 23:15:28 +0000 |
---|---|---|
committer | rpj <rpj> | 2002-02-02 23:15:28 +0000 |
commit | 4a72430d821b96add23846980d07f5a01059029d (patch) | |
tree | 6601b116e591db28feaed15a92ae46bfed8197da /mutex.c | |
parent | 6a65a568fa4d9515265842c8bcf11a7449f3c325 (diff) |
* cancel.c: Rearranged some code and introduced checks
to disable cancelation at the start of a thread's cancelation
run to prevent double cancelation. The main problem
arises if a thread is canceling and then receives a subsequent
async cancel request.
* private.c: Likewise.
* condvar.c: Place pragmas around cleanup_push/pop to turn
off inline optimisation (/Obn where n>0 - MSVC only). Various
optimisation switches in MSVC turn this on, which interferes with
the way that cleanup handlers are run in C++ EH and SEH
code. Application code compiled with inline optimisation must
also wrap cleanup_push/pop blocks with the pragmas, e.g.
#pragma inline_depth(0)
pthread_cleanup_push(...)
...
pthread_cleanup_pop(...)
#pragma inline_depth(8)
* rwlock.c: Likewise.
* mutex.c: Remove attempts to inline some functions.
* signal.c: Modify misleading comment.
tests/
* mutex8: New test.
* mutex8n: New test.
* mutex8e: New test.
* mutex8r: New test.
* cancel6a: New test.
* cancel6d: New test.
* cleanup0.c: Add pragmas for inline optimisation control.
* cleanup1.c: Add pragmas for inline optimisation control.
* cleanup2.c: Add pragmas for inline optimisation control.
* cleanup3.c: Add pragmas for inline optimisation control.
* condvar7.c: Add pragmas for inline optimisation control.
* condvar8.c: Add pragmas for inline optimisation control.
* condvar9.c: Add pragmas for inline optimisation control.
Diffstat (limited to 'mutex.c')
-rw-r--r-- | mutex.c | 80 |
1 files changed, 40 insertions, 40 deletions
@@ -91,7 +91,7 @@ ptw32_mutex_check_need_init(pthread_mutex_t *mutex) return(result); } -INLINE int +int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) { int result = 0; @@ -138,20 +138,20 @@ pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) mx->lock_idx = PTW32_MUTEX_LOCK_IDX_INIT; mx->recursive_count = 0; mx->kind = (attr == NULL || *attr == NULL - ? PTHREAD_MUTEX_DEFAULT - : (*attr)->kind); + ? PTHREAD_MUTEX_DEFAULT + : (*attr)->kind); mx->ownerThread = NULL; if ( 0 != sem_init( &mx->wait_sema, 0, 0 )) - { - result = EAGAIN; - free(mx); - mx = NULL; - } + { + result = EAGAIN; + free(mx); + mx = NULL; + } else - { - InitializeCriticalSection( &mx->wait_cs ); - } + { + InitializeCriticalSection( &mx->wait_cs ); + } } *mutex = mx; @@ -762,7 +762,7 @@ ptw32_timed_semwait (sem_t * sem, const struct timespec * abstime) } /* ptw32_timed_semwait */ -INLINE int +int pthread_mutex_lock(pthread_mutex_t *mutex) { int result = 0; @@ -829,7 +829,7 @@ pthread_mutex_lock(pthread_mutex_t *mutex) } -INLINE int +int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abstime) { int result = 0; @@ -907,27 +907,27 @@ pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abstime) EnterCriticalSection(&mx->wait_cs); /* - * If we timeout, it is up to us to adjust lock_idx to say - * we're no longer waiting. If the mutex was also unlocked - * while we were timing out, and we simply return ETIMEDOUT, - * then wait_sema would be left in a state that is not consistent - * with the state of lock_idx. - * + * If we timeout, it is up to us to adjust lock_idx to say + * we're no longer waiting. If the mutex was also unlocked + * while we were timing out, and we simply return ETIMEDOUT, + * then wait_sema would be left in a state that is not consistent + * with the state of lock_idx. + * * We must check to see if wait_sema has just been posted - * but we can't just call sem_getvalue - we must compete for - * the semaphore using sem_trywait(), otherwise we would need - * additional critical sections elsewhere, which would make the - * logic too inefficient. - * - * If sem_trywait returns EAGAIN then either wait_sema - * was given directly to another waiting thread or - * another thread has called sem_*wait() before us and - * taken the lock. Then we MUST decrement lock_idx and return - * ETIMEDOUT. - * - * Otherwise we MUST return success (because we have effectively - * acquired the lock that would have been ours had we not - * timed out), and NOT decrement lock_idx. + * but we can't just call sem_getvalue - we must compete for + * the semaphore using sem_trywait(), otherwise we would need + * additional critical sections elsewhere, which would make the + * logic too inefficient. + * + * If sem_trywait returns EAGAIN then either wait_sema + * was given directly to another waiting thread or + * another thread has called sem_*wait() before us and + * taken the lock. Then we MUST decrement lock_idx and return + * ETIMEDOUT. + * + * Otherwise we MUST return success (because we have effectively + * acquired the lock that would have been ours had we not + * timed out), and NOT decrement lock_idx. * * We can almost guarrantee that EAGAIN is the only * possible error, so no need to test errno. @@ -945,10 +945,10 @@ pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abstime) case 2: /* abstime had passed before we started to wait. */ { /* - * If we timeout, it is up to us to adjust lock_idx to say - * we're no longer waiting. wait_sema has not been touched. - */ - (void) InterlockedDecrement( &mx->lock_idx ); + * If we timeout, it is up to us to adjust lock_idx to say + * we're no longer waiting. wait_sema has not been touched. + */ + (void) InterlockedDecrement( &mx->lock_idx ); result = ETIMEDOUT; break; } @@ -966,7 +966,7 @@ pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abstime) } -INLINE int +int pthread_mutex_unlock(pthread_mutex_t *mutex) { int result = 0; @@ -979,7 +979,7 @@ pthread_mutex_unlock(pthread_mutex_t *mutex) mx = *mutex; - /* + /* * If the thread calling us holds the mutex then there is no * race condition. If another thread holds the * lock then we shouldn't be in here. @@ -1020,7 +1020,7 @@ pthread_mutex_unlock(pthread_mutex_t *mutex) return(result); } -INLINE int +int pthread_mutex_trylock(pthread_mutex_t *mutex) { int result = 0; |