diff options
author | rpj <rpj> | 2004-05-17 01:38:02 +0000 |
---|---|---|
committer | rpj <rpj> | 2004-05-17 01:38:02 +0000 |
commit | 771465fed0cf50ee2dd790723245fc091699c324 (patch) | |
tree | d8c18d095a33fe7c4564bd90c5f313bb9e4057dd /pthread_mutex_lock.c | |
parent | 8b14911744f58cbe3730703f3fcc41cd969fd0f3 (diff) |
re-indentation, bug fixes, hooks for pre-emptive async cancelation
Diffstat (limited to 'pthread_mutex_lock.c')
-rw-r--r-- | pthread_mutex_lock.c | 103 |
1 files changed, 14 insertions, 89 deletions
diff --git a/pthread_mutex_lock.c b/pthread_mutex_lock.c index ceeeb30..a59666a 100644 --- a/pthread_mutex_lock.c +++ b/pthread_mutex_lock.c @@ -35,88 +35,13 @@ */ #ifndef _UWIN -# include <process.h> +//# include <process.h> #endif #include "pthread.h" #include "implement.h" - -static INLINE int -ptw32_semwait (sem_t * sem) - /* - * ------------------------------------------------------ - * DESCRIPTION - * This function waits on a POSIX semaphore. If the - * semaphore value is greater than zero, it decreases - * its value by one. If the semaphore value is zero, then - * the calling thread (or process) is blocked until it can - * successfully decrease the value. - * - * Unlike sem_wait(), this routine is non-cancelable. - * - * RESULTS - * 0 successfully decreased semaphore, - * -1 failed, error in errno. - * ERRNO - * EINVAL 'sem' is not a valid semaphore, - * ENOSYS semaphores are not supported, - * EINTR the function was interrupted by a signal, - * EDEADLK a deadlock condition was detected. - * - * ------------------------------------------------------ - */ -{ - int result = 0; - - DWORD status; - - if (sem == NULL) - { - result = EINVAL; - } - else - { - -#ifdef NEED_SEM - - status = WaitForSingleObject( (*sem)->event, INFINITE ); - -#else /* NEED_SEM */ - - status = WaitForSingleObject( (*sem)->sem, INFINITE ); - -#endif - - if (status == WAIT_OBJECT_0) - { - -#ifdef NEED_SEM - - ptw32_decrease_semaphore(sem); - -#endif /* NEED_SEM */ - - return 0; - } - else - { - result = EINVAL; - } - } - - if (result != 0) - { - errno = result; - return -1; - } - - return 0; - -} /* ptw32_semwait */ - - int -pthread_mutex_lock(pthread_mutex_t *mutex) +pthread_mutex_lock (pthread_mutex_t * mutex) { int result = 0; pthread_mutex_t mx; @@ -135,29 +60,29 @@ pthread_mutex_lock(pthread_mutex_t *mutex) */ if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - if ((result = ptw32_mutex_check_need_init(mutex)) != 0) + if ((result = ptw32_mutex_check_need_init (mutex)) != 0) { - return(result); + return (result); } } mx = *mutex; - if ( 0 == InterlockedIncrement( &mx->lock_idx ) ) + if (0 == InterlockedIncrement (&mx->lock_idx)) { mx->recursive_count = 1; mx->ownerThread = (mx->kind != PTHREAD_MUTEX_FAST_NP - ? pthread_self() + ? 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_FAST_NP && + pthread_equal (mx->ownerThread, pthread_self ())) { - (void) InterlockedDecrement( &mx->lock_idx ); - - if( mx->kind == PTHREAD_MUTEX_RECURSIVE_NP ) + (void) InterlockedDecrement (&mx->lock_idx); + + if (mx->kind == PTHREAD_MUTEX_RECURSIVE_NP) { mx->recursive_count++; } @@ -168,11 +93,11 @@ pthread_mutex_lock(pthread_mutex_t *mutex) } else { - if (ptw32_semwait( &mx->wait_sema ) == 0) + if (ptw32_semwait (&mx->wait_sema) == 0) { mx->recursive_count = 1; mx->ownerThread = (mx->kind != PTHREAD_MUTEX_FAST_NP - ? pthread_self() + ? pthread_self () : (pthread_t) PTW32_MUTEX_OWNER_ANONYMOUS); } else @@ -182,5 +107,5 @@ pthread_mutex_lock(pthread_mutex_t *mutex) } } - return(result); + return (result); } |