From d8f59fb72258d9c6867340d2c8cd512f0df190aa Mon Sep 17 00:00:00 2001 From: Christian Thaeter Date: Sat, 9 Aug 2008 16:15:29 +0200 Subject: [PATCH] Simplyfiy resource management Move the resource announce/forget into the rwlock init/destroy Move resource announcement/forget into the mutex init/destroy --- src/lib/mutex.c | 13 ++++++++++-- src/lib/mutex.h | 11 ++++++++-- src/lib/rwlock.c | 6 ++++-- src/lib/rwlock.h | 6 +++--- tests/library/test-locking.c | 39 +++++++++++------------------------- 5 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/lib/mutex.c b/src/lib/mutex.c index 791ca8287..99ef8897f 100644 --- a/src/lib/mutex.c +++ b/src/lib/mutex.c @@ -32,25 +32,34 @@ LUMIERA_ERROR_DEFINE (MUTEX_DESTROY, "Mutex destroy failed"); LumieraMutex -lumiera_mutex_init (LumieraMutex self) +lumiera_mutex_init (LumieraMutex self, const char* purpose, struct nobug_flag* flag) { if (self) { pthread_mutex_init (&self->mutex, NULL); NOBUG_RESOURCE_HANDLE_INIT (self->rh); + NOBUG_RESOURCE_ANNOUNCE_RAW (flag, "mutex", purpose, self, self->rh); } return self; } LumieraMutex -lumiera_mutex_destroy (LumieraMutex self) +lumiera_mutex_destroy (LumieraMutex self, struct nobug_flag* flag) { if (self) { + NOBUG_RESOURCE_FORGET_RAW (flag, self->rh); if (pthread_mutex_destroy (&self->mutex)) LUMIERA_DIE (MUTEX_DESTROY); } return self; } +/* +// Local Variables: +// mode: C +// c-file-style: "gnu" +// indent-tabs-mode: nil +// End: +*/ diff --git a/src/lib/mutex.h b/src/lib/mutex.h index 54206f7f1..681d29432 100644 --- a/src/lib/mutex.h +++ b/src/lib/mutex.h @@ -80,7 +80,7 @@ typedef lumiera_mutex* LumieraMutex; * @return self as given */ LumieraMutex -lumiera_mutex_init (LumieraMutex self); +lumiera_mutex_init (LumieraMutex self, const char* purpose, struct nobug_flag* flag); /** @@ -89,7 +89,7 @@ lumiera_mutex_init (LumieraMutex self); * @return self as given */ LumieraMutex -lumiera_mutex_destroy (LumieraMutex self); +lumiera_mutex_destroy (LumieraMutex self, struct nobug_flag* flag); /** @@ -111,3 +111,10 @@ lumiera_mutexacquirer_ensureunlocked (LumieraMutexacquirer self) } #endif +/* +// Local Variables: +// mode: C +// c-file-style: "gnu" +// indent-tabs-mode: nil +// End: +*/ diff --git a/src/lib/rwlock.c b/src/lib/rwlock.c index 9fad975b3..c5287d535 100644 --- a/src/lib/rwlock.c +++ b/src/lib/rwlock.c @@ -36,22 +36,24 @@ LUMIERA_ERROR_DEFINE(RWLOCK_WRLOCK, "locking rwlock for writing failed"); */ LumieraRWLock -lumiera_rwlock_init (LumieraRWLock self) +lumiera_rwlock_init (LumieraRWLock self, const char* purpose, struct nobug_flag* flag) { if (self) { pthread_rwlock_init (&self->rwlock, NULL); NOBUG_RESOURCE_HANDLE_INIT (self->rh); + NOBUG_RESOURCE_ANNOUNCE_RAW (flag, "rwlock", purpose, self, self->rh); } return self; } LumieraRWLock -lumiera_rwlock_destroy (LumieraRWLock self) +lumiera_rwlock_destroy (LumieraRWLock self, struct nobug_flag* flag) { if (self) { + NOBUG_RESOURCE_FORGET_RAW (flag, self->rh); if (pthread_rwlock_destroy (&self->rwlock)) LUMIERA_DIE (RWLOCK_DESTROY); } diff --git a/src/lib/rwlock.h b/src/lib/rwlock.h index 8d8f69e0c..23376979b 100644 --- a/src/lib/rwlock.h +++ b/src/lib/rwlock.h @@ -27,7 +27,6 @@ #endif #include -//#include #include LUMIERA_ERROR_DECLARE(RWLOCK_AGAIN); @@ -111,7 +110,7 @@ typedef lumiera_rwlock* LumieraRWLock; * @return self as given */ LumieraRWLock -lumiera_rwlock_init (LumieraRWLock self); +lumiera_rwlock_init (LumieraRWLock self, const char* purpose, struct nobug_flag* flag); /** * destroy a rwlock @@ -119,7 +118,8 @@ lumiera_rwlock_init (LumieraRWLock self); * @return self on success or NULL at error */ LumieraRWLock -lumiera_rwlock_destroy (LumieraRWLock self); +lumiera_rwlock_destroy (LumieraRWLock self, struct nobug_flag* flag); + diff --git a/tests/library/test-locking.c b/tests/library/test-locking.c index 30b1b10cc..da42a4f47 100644 --- a/tests/library/test-locking.c +++ b/tests/library/test-locking.c @@ -43,8 +43,7 @@ TEST ("conditionforgotunlock") TEST ("mutexsection") { lumiera_mutex m; - lumiera_mutex_init (&m); - RESOURCE_ANNOUNCE (NOBUG_ON, "mutex", "mutexsection", &m, m.rh); + lumiera_mutex_init (&m, "mutexsection", &NOBUG_FLAG(NOBUG_ON)); LUMIERA_MUTEX_SECTION (NOBUG_ON, &m) { @@ -56,36 +55,31 @@ TEST ("mutexsection") printf ("mutex locked section 2\n"); } - RESOURCE_FORGET (NOBUG_ON, m.rh); - lumiera_mutex_destroy (&m); + lumiera_mutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON)); } TEST ("mutexforgotunlock") { lumiera_mutex m; - lumiera_mutex_init (&m); - RESOURCE_ANNOUNCE (NOBUG_ON, "mutex", "mutexforgotunlock", &m, m.rh); + lumiera_mutex_init (&m, "mutexforgotunlock", &NOBUG_FLAG(NOBUG_ON)); LUMIERA_MUTEX_SECTION (NOBUG_ON, &m) { break; // MUTEX_SECTIONS must not be left by a jump } - RESOURCE_FORGET (NOBUG_ON, m.rh); - lumiera_mutex_destroy (&m); + lumiera_mutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON)); } TEST ("nestedmutexsection") { lumiera_mutex m; - lumiera_mutex_init (&m); - RESOURCE_ANNOUNCE (NOBUG_ON, "mutex", "m_mutexsection", &m, m.rh); + lumiera_mutex_init (&m, "m_mutexsection", &NOBUG_FLAG(NOBUG_ON)); lumiera_mutex n; - lumiera_mutex_init (&n); - RESOURCE_ANNOUNCE (NOBUG_ON, "mutex", "n_mutexsection", &n, n.rh); + lumiera_mutex_init (&n, "n_mutexsection", &NOBUG_FLAG(NOBUG_ON)); LUMIERA_MUTEX_SECTION (NOBUG_ON, &m) { @@ -97,11 +91,8 @@ TEST ("nestedmutexsection") } } - RESOURCE_FORGET (NOBUG_ON, n.rh); - lumiera_mutex_destroy (&n); - - RESOURCE_FORGET (NOBUG_ON, m.rh); - lumiera_mutex_destroy (&m); + lumiera_mutex_destroy (&n, &NOBUG_FLAG(NOBUG_ON)); + lumiera_mutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON)); } @@ -109,8 +100,7 @@ TEST ("nestedmutexsection") TEST ("rwlocksection") { lumiera_rwlock rwlock; - lumiera_rwlock_init (&rwlock); - RESOURCE_ANNOUNCE (NOBUG_ON, "rwlock", "rwlocksection", &rwlock, rwlock.rh); + lumiera_rwlock_init (&rwlock, "rwsection", &NOBUG_FLAG(NOBUG_ON)); LUMIERA_WRLOCK_SECTION (NOBUG_ON, &rwlock) { @@ -122,25 +112,20 @@ TEST ("rwlocksection") printf ("read locked section 2\n"); } - RESOURCE_FORGET (NOBUG_ON, rwlock.rh); - lumiera_rwlock_destroy (&rwlock); + lumiera_rwlock_destroy (&rwlock, &NOBUG_FLAG(NOBUG_ON)); } - TEST ("rwlockforgotunlock") { lumiera_rwlock rwlock; - lumiera_rwlock_init (&rwlock); - RESOURCE_ANNOUNCE (NOBUG_ON, "rwlock", "rwlockforgotunlock", &rwlock, rwlock.rh); + lumiera_rwlock_init (&rwlock, "rwlockforgotunlock", &NOBUG_FLAG(NOBUG_ON)); LUMIERA_RDLOCK_SECTION (NOBUG_ON, &rwlock) { break; // LOCK_SECTIONS must not be left by a jump } - RESOURCE_FORGET (NOBUG_ON, rwlock.rh); - lumiera_rwlock_destroy (&rwlock); + lumiera_rwlock_destroy (&rwlock, &NOBUG_FLAG(NOBUG_ON)); } - TESTS_END