diff options
| author | rpj <rpj> | 2001-02-06 07:56:03 +0000 | 
|---|---|---|
| committer | rpj <rpj> | 2001-02-06 07:56:03 +0000 | 
| commit | 9a59a1b4611cbd4b1fcf7549a97dc2cbe340b794 (patch) | |
| tree | d07b9cf23658b2af706be05fa72ba54e1431311d | |
| parent | ced3d3f3827b360617e71fe557e6d1880ad56cb4 (diff) | |
	* mutex.c (pthread_mutexattr_settype): New; allow
	the following types of mutex:
	  PTHREAD_MUTEX_DEFAULT
	  PTHREAD_MUTEX_NORMAL
	  PTHREAD_MUTEX_ERRORCHECK
	  PTHREAD_MUTEX_RECURSIVE
	(pthread_mutex_lock): Process the lock request
	according to the mutex type.
	* mutex.c: No longer use Win32 mutexes as the
	basis of POSIX mutexes when TryEnterCriticalSection
	isn't supported; implement our own versions of
	ptw32_{Initialize,Delete,TryEnter,Enter,Leave}CriticalSection
	functions to emulate TryEnterCriticalSection when
	it isn't supported by the system; don't allow recursive
	mutex locks (similar to PTHREAD_MUTEX_ERRORCHECK
	on other systems).
	- Thomas Pfaff <tpfaff@gmx.net>
| -rw-r--r-- | ChangeLog | 19 | ||||
| -rw-r--r-- | mutex.c | 21 | 
2 files changed, 32 insertions, 8 deletions
| @@ -25,6 +25,25 @@  2001-01-10  Ross Johnson  <rpj@setup1.ise.canberra.edu.au> +	* mutex.c (pthread_mutexattr_settype): New; allow +	the following types of mutex: +	  PTHREAD_MUTEX_DEFAULT +	  PTHREAD_MUTEX_NORMAL +	  PTHREAD_MUTEX_ERRORCHECK +	  PTHREAD_MUTEX_RECURSIVE +	(pthread_mutex_lock): Process the lock request +	according to the mutex type. +	 +	* mutex.c: No longer use Win32 mutexes as the +	basis of POSIX mutexes when TryEnterCriticalSection +	isn't supported; implement our own versions of +	ptw32_{Initialize,Delete,TryEnter,Enter,Leave}CriticalSection +	functions to emulate TryEnterCriticalSection when +	it isn't supported by the system; don't allow recursive +	mutex locks (similar to PTHREAD_MUTEX_ERRORCHECK +	on other systems). +	- Thomas Pfaff <tpfaff@gmx.net> +  	* rwlock.c (ptw32_rwlock_cancelwrwait): Renamed.  	(ptw32_rwlock_cancelrdwait): Renamed. @@ -730,6 +730,9 @@ pthread_mutexattr_settype (pthread_mutexattr_t * attr,        *          thread has locked will return  with  an  error.  A        *          thread attempting to unlock an unlocked mutex will        *          return with an error. +      * +      * PTHREAD_MUTEX_DEFAULT +      *          Same as PTHREAD_MUTEX_ERRORCHECK.        *         * PTHREAD_MUTEX_RECURSIVE        *          A thread attempting to relock this  mutex  without @@ -827,17 +830,14 @@ pthread_mutex_lock(pthread_mutex_t *mutex)    mx = *mutex;    self = pthread_self(); -  ptw32_EnterCriticalSection(&mx->cs); -    switch (mx->type)      {      case PTHREAD_MUTEX_NORMAL:        if (pthread_equal(mx->ownerThread, self))          { -          ptw32_LeaveCriticalSection(&mx->cs);            /*             * Pretend to be deadlocked but release the -           * mutex if we are canceled. +           * mutex if we are [asynchronously] canceled.             */            pthread_cleanup_push(pthread_mutex_unlock, (void *) mutex);            while (TRUE) @@ -846,19 +846,24 @@ pthread_mutex_lock(pthread_mutex_t *mutex)              }            pthread_cleanup_pop(1);          } +      else +        { +          ptw32_EnterCriticalSection(&mx->cs); +        }        break;      case PTHREAD_MUTEX_DEFAULT:      case PTHREAD_MUTEX_ERRORCHECK:        if (pthread_equal(mx->ownerThread, self))          { -          ptw32_LeaveCriticalSection(&mx->cs);            result = EDEADLK;          } +      else +        { +          ptw32_EnterCriticalSection(&mx->cs); +        }        break;      case PTHREAD_MUTEX_RECURSIVE: -      /* -       * Nothing more to do. -       */ +      ptw32_EnterCriticalSection(&mx->cs);        break;      default:        result = EINVAL; | 
