2
* pthread_rwlock_destroy.c
5
* This translation unit implements read/write lock primitives.
7
* --------------------------------------------------------------------------
9
* Pthreads-win32 - POSIX Threads Library for Win32
10
* Copyright(C) 1998 John E. Bossom
11
* Copyright(C) 1999,2005 Pthreads-win32 contributors
13
* Contact Email: rpj@callisto.canberra.edu.au
15
* The current list of contributors is contained
16
* in the file CONTRIBUTORS included with the source
17
* code distribution. The list can also be seen at the
18
* following World Wide Web location:
19
* http://sources.redhat.com/pthreads-win32/contributors.html
21
* This library is free software; you can redistribute it and/or
22
* modify it under the terms of the GNU Lesser General Public
23
* License as published by the Free Software Foundation; either
24
* version 2 of the License, or (at your option) any later version.
26
* This library is distributed in the hope that it will be useful,
27
* but WITHOUT ANY WARRANTY; without even the implied warranty of
28
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
29
* Lesser General Public License for more details.
31
* You should have received a copy of the GNU Lesser General Public
32
* License along with this library in the file COPYING.LIB;
33
* if not, write to the Free Software Foundation, Inc.,
34
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
40
#include "implement.h"
43
pthread_rwlock_destroy (pthread_rwlock_t * rwlock)
46
int result = 0, result1 = 0, result2 = 0;
48
if (rwlock == NULL || *rwlock == NULL)
53
if (*rwlock != PTHREAD_RWLOCK_INITIALIZER)
57
if (rwl->nMagic != PTW32_RWLOCK_MAGIC)
62
if ((result = pthread_mutex_lock (&(rwl->mtxExclusiveAccess))) != 0)
68
pthread_mutex_lock (&(rwl->mtxSharedAccessCompleted))) != 0)
70
(void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess));
75
* Check whether any threads own/wait for the lock (wait for ex.access);
76
* report "BUSY" if so.
78
if (rwl->nExclusiveAccessCount > 0
79
|| rwl->nSharedAccessCount > rwl->nCompletedSharedAccessCount)
81
result = pthread_mutex_unlock (&(rwl->mtxSharedAccessCompleted));
82
result1 = pthread_mutex_unlock (&(rwl->mtxExclusiveAccess));
90
pthread_mutex_unlock (&(rwl->mtxSharedAccessCompleted))) != 0)
92
pthread_mutex_unlock (&rwl->mtxExclusiveAccess);
97
pthread_mutex_unlock (&(rwl->mtxExclusiveAccess))) != 0)
102
*rwlock = NULL; /* Invalidate rwlock before anything else */
103
result = pthread_cond_destroy (&(rwl->cndSharedAccessCompleted));
104
result1 = pthread_mutex_destroy (&(rwl->mtxSharedAccessCompleted));
105
result2 = pthread_mutex_destroy (&(rwl->mtxExclusiveAccess));
112
* See notes in ptw32_rwlock_check_need_init() above also.
114
EnterCriticalSection (&ptw32_rwlock_test_init_lock);
119
if (*rwlock == PTHREAD_RWLOCK_INITIALIZER)
122
* This is all we need to do to destroy a statically
123
* initialised rwlock that has not yet been used (initialised).
124
* If we get to here, another thread
125
* waiting to initialise this rwlock will get an EINVAL.
132
* The rwlock has been initialised while we were waiting
133
* so assume it's in use.
138
LeaveCriticalSection (&ptw32_rwlock_test_init_lock);
141
return ((result != 0) ? result : ((result1 != 0) ? result1 : result2));