From 270256a021c517590f5869a6f8a3f7e73d1fe63e Mon Sep 17 00:00:00 2001 From: bje Date: Fri, 17 Jul 1998 12:47:32 +0000 Subject: 1998-07-17 Ben Elliston * mutex.c (pthread_mutex_init): Use InitializeCritcalSection(). (pthread_mutex_destroy): Use DeleteCriticalSection(). (pthread_mutex_lock): Use EnterCriticalSection(). (pthread_mutex_trylock): Use TryEnterCriticalSection(). This is not supported by Windows 9x, but trylock is a hack anyway, IMHO. (pthread_mutex_unlock): Use LeaveCriticalSection(). --- mutex.c | 65 +++++++++++++++-------------------------------------------------- 1 file changed, 15 insertions(+), 50 deletions(-) (limited to 'mutex.c') diff --git a/mutex.c b/mutex.c index e03f070..6d425ab 100644 --- a/mutex.c +++ b/mutex.c @@ -40,22 +40,13 @@ remove_attr(pthread_mutexattr_t *attr) int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutex_attr_t *attr) { - /* FIXME: Attributes are currently ignored. */ - - if ((is_attr(attr) != 0) || (mutex == NULL)) + if (mutex == NULL) { return EINVAL; } - /* Create an unnamed mutex with default security and one which is - initially not held by the thread. Default security (arg1 = NULL) - is portable to Win9x and NT, as Win9x has no security model. */ - - if ((*mutex = CreateMutex(NULL, FALSE, NULL)) == NULL) - { - /* This is almost certainly due to a lack of resources. */ - return ENOMEM; - } + /* Create a critical section. */ + InitializeCriticalSection(mutex); return 0; } @@ -63,12 +54,12 @@ pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutex_attr_t *attr) int pthread_mutex_destroy(pthread_mutex_t *mutex) { - if ((mutex == NULL) || (CloseHandle(*mutex) != TRUE)) + if (mutex == NULL) { - /* This is almost certainly due to an invalid handle. */ return EINVAL; } + DeleteCriticalSection(mutex); return 0; } @@ -142,53 +133,27 @@ pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *attr, int pthread_mutex_lock(pthread_mutex_t *mutex) { - switch (WaitForSingleObject(*mutex, INFINITE)) - { - case WAIT_ABANDONED_0: - /* Thread holding the mutex abandoned it. Fall through. */ - case WAIT_FAILED: - /* This is probably due to an invalid handle. */ - return EINVAL; - case WAIT_OBJECT_0: - /* We're good. */ - return 0; - } - /* Not reached. */ + EnterCriticalSection(mutex); + return 0; } int pthread_mutex_unlock(pthread_mutex_t *mutex) { - if (ReleaseMutex(*mutex) != TRUE) - { - /* This is probably due to an invalid handle. */ - return EINVAL; - } - else - { - return 0; - } - - /* Not reached. */ + LeaveCriticalSection(mutex); + return 0; } int pthread_mutex_trylock(pthread_mutex_t *mutex) { - /* If the mutex is already held, return EBUSY. */ - switch (WaitForSingleObject(*mutex, 0)) + /* This only works on Windows NT 4.0 and above. If this function is + called from Windows 95, we must return ENOSYS. */ + + if (mutex == NULL) { - case WAIT_ABANDONED_0: - /* Thread holding the mutex abandoned it. Fall through. */ - case WAIT_FAILED: - /* This is probably due to an invalid handle. */ return EINVAL; - case WAIT_TIMEOUT: - /* We couldn't get the lock. */ - return EBUSY; - case WAIT_OBJECT_0: - /* We're good. */ - return 0; } - /* Not reached. */ + + return (TryEnterCriticalSection(mutex) != TRUE) ? EBUSY : 0; } -- cgit v1.2.3