diff options
author | rpj <rpj> | 2000-08-18 14:17:28 +0000 |
---|---|---|
committer | rpj <rpj> | 2000-08-18 14:17:28 +0000 |
commit | 170d8032b2fd55450e4533357f4de118b619a8e8 (patch) | |
tree | bb13635e1804f7570546baca70cfdbf47fc28846 /rwlock.c | |
parent | cb1dbf17abe4884c5d8223b7606aec6b11e69a73 (diff) |
2000-08-18 Ross Johnson <rpj@special.ise.canberra.edu.au>
* mutex.c (pthread_mutex_destroy): Check that the mutex isn't
held; invalidate the mutex as early as possible to avoid
contention; not perfect - FIXME!
* rwlock.c (pthread_rwlock_init): Remove redundant assignment
to "rw".
(pthread_rwlock_destroy): Invalidate the rwlock before
freeing up any of it's resources - to avoid contention.
* private.c (ptw32_tkAssocCreate): Change assoc->lock
to use a dynamically initialised mutex - only consumes
a W32 mutex or critical section when first used,
not before.
* mutex.c (pthread_mutex_init): Remove redundant assignment
to "mx".
(pthread_mutexattr_destroy): Set attribute to NULL
before freeing it's memory - to avoid contention.
Diffstat (limited to 'rwlock.c')
-rw-r--r-- | rwlock.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -94,8 +94,6 @@ pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr) return EINVAL; } - rw = *rwlock; - rw = (pthread_rwlock_t) calloc(1, sizeof(*rw)); if (rw == NULL) @@ -182,14 +180,19 @@ pthread_rwlock_destroy(pthread_rwlock_t *rwlock) } else { + /* + * Need to NULL this before we start freeing up + * and destroying it's components. + */ + *rwlock = NULL; rw->rw_magic = 0; + (void) pthread_mutex_unlock(&(rw->rw_lock)); + (void) pthread_cond_destroy(&(rw->rw_condreaders)); (void) pthread_cond_destroy(&(rw->rw_condwriters)); (void) pthread_mutex_destroy(&(rw->rw_lock)); - free(rw); - *rwlock = NULL; } } else |