summaryrefslogtreecommitdiff
path: root/pthread_mutex_lock.c
diff options
context:
space:
mode:
authorrpj <rpj>2004-05-17 01:38:02 +0000
committerrpj <rpj>2004-05-17 01:38:02 +0000
commit771465fed0cf50ee2dd790723245fc091699c324 (patch)
treed8c18d095a33fe7c4564bd90c5f313bb9e4057dd /pthread_mutex_lock.c
parent8b14911744f58cbe3730703f3fcc41cd969fd0f3 (diff)
re-indentation, bug fixes, hooks for pre-emptive async cancelation
Diffstat (limited to 'pthread_mutex_lock.c')
-rw-r--r--pthread_mutex_lock.c103
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);
}