summaryrefslogtreecommitdiff
path: root/rwlock.c
diff options
context:
space:
mode:
authorrpj <rpj>2000-08-18 14:17:28 +0000
committerrpj <rpj>2000-08-18 14:17:28 +0000
commit170d8032b2fd55450e4533357f4de118b619a8e8 (patch)
treebb13635e1804f7570546baca70cfdbf47fc28846 /rwlock.c
parentcb1dbf17abe4884c5d8223b7606aec6b11e69a73 (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.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/rwlock.c b/rwlock.c
index d02461c..4353847 100644
--- a/rwlock.c
+++ b/rwlock.c
@@ -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