diff options
| -rw-r--r-- | ChangeLog | 20 | ||||
| -rw-r--r-- | global.c | 3 | ||||
| -rw-r--r-- | mutex.c | 30 | ||||
| -rw-r--r-- | pthread.h | 7 | ||||
| -rw-r--r-- | tests/mutex3.c | 12 | 
5 files changed, 63 insertions, 9 deletions
| @@ -1,3 +1,23 @@ +1998-10-05  Ben Elliston  <bje@cygnus.com> + +	* global.c (PTHREAD_MUTEX_INITIALIZER): Move to pthread.h. + +	* pthread.h (PTHREAD_MUTEX_INITIALIZER): Define. +	(pthread_mutex_t): Reimplement as a struct containing a valid +	flag. If the flag is ever down upon entry to a mutex operation, +	we call pthread_mutex_create() to initialise the object. This +	fixes the problem of how to handle statically initialised objects +	that can't call InitializeCriticalSection() due to their context. + +	* mutex.c (pthread_mutex_init): Set valid flag. +	(pthread_mutex_destroy): Clear valid flag. +	(pthread_mutex_lock): Check and handle the valid flag. +	(pthread_mutex_unlock): Likewise. +	(pthread_mutex_trylock): Likewise. + +	* tests/mutex3.c: New file; test for the static initialisation +	macro. Passes. +	  1998-10-04  Ben Elliston  <bje@cygnus.com>  	* tests/mutex2.c: Test pthread_mutex_trylock(). Passes. @@ -33,9 +33,6 @@ const int _pthread_cancel_deferred     = 1;  /* Declare variables which are global to all threads in the process. */ -/* FIXME: This is temporary. */ -#define PTHREAD_MUTEX_INITIALIZER {0} -  pthread_mutex_t _pthread_table_mutex = PTHREAD_MUTEX_INITIALIZER;  DWORD _pthread_threads_count = 0; @@ -19,7 +19,10 @@ pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)      }    /* Create a critical section. */ -  InitializeCriticalSection(mutex); +  InitializeCriticalSection(&mutex->cs); + +  /* Mark as valid. */ +  mutex->valid = 1;    return 0;  } @@ -32,7 +35,11 @@ pthread_mutex_destroy(pthread_mutex_t *mutex)        return EINVAL;      } -  DeleteCriticalSection(mutex); +  DeleteCriticalSection(&mutex->cs); +   +  /* Mark as invalid. */ +  mutex->valid = 0; +    return 0;  } @@ -59,14 +66,22 @@ pthread_mutexattr_destroy(pthread_mutexattr_t *attr)  int  pthread_mutex_lock(pthread_mutex_t *mutex)  { -  EnterCriticalSection(mutex); +  if (!mutex->valid) +    { +      pthread_mutex_init(mutex, NULL); +    } +  EnterCriticalSection(&mutex->cs);    return 0;  }  int  pthread_mutex_unlock(pthread_mutex_t *mutex)  { -  LeaveCriticalSection(mutex); +  if (!mutex->valid) +    { +      return EINVAL; +    } +  LeaveCriticalSection(&mutex->cs);    return 0;  } @@ -87,5 +102,10 @@ pthread_mutex_trylock(pthread_mutex_t *mutex)        return EINVAL;      } -  return (TryEnterCriticalSection(mutex) != TRUE) ? EBUSY : 0; +  if (!mutex->valid) +    { +      pthread_mutex_init(mutex, NULL); +    } + +  return (TryEnterCriticalSection(&mutex->cs) != TRUE) ? EBUSY : 0;  } @@ -74,8 +74,13 @@ struct timespec {     pointer to an object in memory. */  #define PTHREAD_CANCELED            ((void *) 1) +#define PTHREAD_MUTEX_INITIALIZER {0 /* ignore internals */ } +  typedef struct _pthread * pthread_t; -typedef CRITICAL_SECTION pthread_mutex_t; +typedef struct { +	int valid; +	CRITICAL_SECTION cs; +} pthread_mutex_t;  typedef DWORD pthread_key_t; diff --git a/tests/mutex3.c b/tests/mutex3.c new file mode 100644 index 0000000..2bb6106 --- /dev/null +++ b/tests/mutex3.c @@ -0,0 +1,12 @@ +#include <pthread.h> + +pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + +int +main() +{ +  pthread_mutex_lock(&mutex); +  /* do stuff */ +  pthread_mutex_unlock(&mutex); +  return 0; +} | 
