Simplyfiy resource management

Move the resource announce/forget into the rwlock init/destroy
Move resource announcement/forget into the mutex init/destroy
This commit is contained in:
Christian Thaeter 2008-08-09 16:15:29 +02:00
parent c11915a4c4
commit d8f59fb722
5 changed files with 39 additions and 36 deletions

View file

@ -32,25 +32,34 @@ LUMIERA_ERROR_DEFINE (MUTEX_DESTROY, "Mutex destroy failed");
LumieraMutex LumieraMutex
lumiera_mutex_init (LumieraMutex self) lumiera_mutex_init (LumieraMutex self, const char* purpose, struct nobug_flag* flag)
{ {
if (self) if (self)
{ {
pthread_mutex_init (&self->mutex, NULL); pthread_mutex_init (&self->mutex, NULL);
NOBUG_RESOURCE_HANDLE_INIT (self->rh); NOBUG_RESOURCE_HANDLE_INIT (self->rh);
NOBUG_RESOURCE_ANNOUNCE_RAW (flag, "mutex", purpose, self, self->rh);
} }
return self; return self;
} }
LumieraMutex LumieraMutex
lumiera_mutex_destroy (LumieraMutex self) lumiera_mutex_destroy (LumieraMutex self, struct nobug_flag* flag)
{ {
if (self) if (self)
{ {
NOBUG_RESOURCE_FORGET_RAW (flag, self->rh);
if (pthread_mutex_destroy (&self->mutex)) if (pthread_mutex_destroy (&self->mutex))
LUMIERA_DIE (MUTEX_DESTROY); LUMIERA_DIE (MUTEX_DESTROY);
} }
return self; return self;
} }
/*
// Local Variables:
// mode: C
// c-file-style: "gnu"
// indent-tabs-mode: nil
// End:
*/

View file

@ -80,7 +80,7 @@ typedef lumiera_mutex* LumieraMutex;
* @return self as given * @return self as given
*/ */
LumieraMutex 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 * @return self as given
*/ */
LumieraMutex 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 #endif
/*
// Local Variables:
// mode: C
// c-file-style: "gnu"
// indent-tabs-mode: nil
// End:
*/

View file

@ -36,22 +36,24 @@ LUMIERA_ERROR_DEFINE(RWLOCK_WRLOCK, "locking rwlock for writing failed");
*/ */
LumieraRWLock LumieraRWLock
lumiera_rwlock_init (LumieraRWLock self) lumiera_rwlock_init (LumieraRWLock self, const char* purpose, struct nobug_flag* flag)
{ {
if (self) if (self)
{ {
pthread_rwlock_init (&self->rwlock, NULL); pthread_rwlock_init (&self->rwlock, NULL);
NOBUG_RESOURCE_HANDLE_INIT (self->rh); NOBUG_RESOURCE_HANDLE_INIT (self->rh);
NOBUG_RESOURCE_ANNOUNCE_RAW (flag, "rwlock", purpose, self, self->rh);
} }
return self; return self;
} }
LumieraRWLock LumieraRWLock
lumiera_rwlock_destroy (LumieraRWLock self) lumiera_rwlock_destroy (LumieraRWLock self, struct nobug_flag* flag)
{ {
if (self) if (self)
{ {
NOBUG_RESOURCE_FORGET_RAW (flag, self->rh);
if (pthread_rwlock_destroy (&self->rwlock)) if (pthread_rwlock_destroy (&self->rwlock))
LUMIERA_DIE (RWLOCK_DESTROY); LUMIERA_DIE (RWLOCK_DESTROY);
} }

View file

@ -27,7 +27,6 @@
#endif #endif
#include <pthread.h> #include <pthread.h>
//#include <errno.h>
#include <nobug.h> #include <nobug.h>
LUMIERA_ERROR_DECLARE(RWLOCK_AGAIN); LUMIERA_ERROR_DECLARE(RWLOCK_AGAIN);
@ -111,7 +110,7 @@ typedef lumiera_rwlock* LumieraRWLock;
* @return self as given * @return self as given
*/ */
LumieraRWLock LumieraRWLock
lumiera_rwlock_init (LumieraRWLock self); lumiera_rwlock_init (LumieraRWLock self, const char* purpose, struct nobug_flag* flag);
/** /**
* destroy a rwlock * destroy a rwlock
@ -119,7 +118,8 @@ lumiera_rwlock_init (LumieraRWLock self);
* @return self on success or NULL at error * @return self on success or NULL at error
*/ */
LumieraRWLock LumieraRWLock
lumiera_rwlock_destroy (LumieraRWLock self); lumiera_rwlock_destroy (LumieraRWLock self, struct nobug_flag* flag);

View file

@ -43,8 +43,7 @@ TEST ("conditionforgotunlock")
TEST ("mutexsection") TEST ("mutexsection")
{ {
lumiera_mutex m; lumiera_mutex m;
lumiera_mutex_init (&m); lumiera_mutex_init (&m, "mutexsection", &NOBUG_FLAG(NOBUG_ON));
RESOURCE_ANNOUNCE (NOBUG_ON, "mutex", "mutexsection", &m, m.rh);
LUMIERA_MUTEX_SECTION (NOBUG_ON, &m) LUMIERA_MUTEX_SECTION (NOBUG_ON, &m)
{ {
@ -56,36 +55,31 @@ TEST ("mutexsection")
printf ("mutex locked section 2\n"); printf ("mutex locked section 2\n");
} }
RESOURCE_FORGET (NOBUG_ON, m.rh); lumiera_mutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON));
lumiera_mutex_destroy (&m);
} }
TEST ("mutexforgotunlock") TEST ("mutexforgotunlock")
{ {
lumiera_mutex m; lumiera_mutex m;
lumiera_mutex_init (&m); lumiera_mutex_init (&m, "mutexforgotunlock", &NOBUG_FLAG(NOBUG_ON));
RESOURCE_ANNOUNCE (NOBUG_ON, "mutex", "mutexforgotunlock", &m, m.rh);
LUMIERA_MUTEX_SECTION (NOBUG_ON, &m) LUMIERA_MUTEX_SECTION (NOBUG_ON, &m)
{ {
break; // MUTEX_SECTIONS must not be left by a jump break; // MUTEX_SECTIONS must not be left by a jump
} }
RESOURCE_FORGET (NOBUG_ON, m.rh); lumiera_mutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON));
lumiera_mutex_destroy (&m);
} }
TEST ("nestedmutexsection") TEST ("nestedmutexsection")
{ {
lumiera_mutex m; lumiera_mutex m;
lumiera_mutex_init (&m); lumiera_mutex_init (&m, "m_mutexsection", &NOBUG_FLAG(NOBUG_ON));
RESOURCE_ANNOUNCE (NOBUG_ON, "mutex", "m_mutexsection", &m, m.rh);
lumiera_mutex n; lumiera_mutex n;
lumiera_mutex_init (&n); lumiera_mutex_init (&n, "n_mutexsection", &NOBUG_FLAG(NOBUG_ON));
RESOURCE_ANNOUNCE (NOBUG_ON, "mutex", "n_mutexsection", &n, n.rh);
LUMIERA_MUTEX_SECTION (NOBUG_ON, &m) LUMIERA_MUTEX_SECTION (NOBUG_ON, &m)
{ {
@ -97,11 +91,8 @@ TEST ("nestedmutexsection")
} }
} }
RESOURCE_FORGET (NOBUG_ON, n.rh); lumiera_mutex_destroy (&n, &NOBUG_FLAG(NOBUG_ON));
lumiera_mutex_destroy (&n); lumiera_mutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON));
RESOURCE_FORGET (NOBUG_ON, m.rh);
lumiera_mutex_destroy (&m);
} }
@ -109,8 +100,7 @@ TEST ("nestedmutexsection")
TEST ("rwlocksection") TEST ("rwlocksection")
{ {
lumiera_rwlock rwlock; lumiera_rwlock rwlock;
lumiera_rwlock_init (&rwlock); lumiera_rwlock_init (&rwlock, "rwsection", &NOBUG_FLAG(NOBUG_ON));
RESOURCE_ANNOUNCE (NOBUG_ON, "rwlock", "rwlocksection", &rwlock, rwlock.rh);
LUMIERA_WRLOCK_SECTION (NOBUG_ON, &rwlock) LUMIERA_WRLOCK_SECTION (NOBUG_ON, &rwlock)
{ {
@ -122,25 +112,20 @@ TEST ("rwlocksection")
printf ("read locked section 2\n"); printf ("read locked section 2\n");
} }
RESOURCE_FORGET (NOBUG_ON, rwlock.rh); lumiera_rwlock_destroy (&rwlock, &NOBUG_FLAG(NOBUG_ON));
lumiera_rwlock_destroy (&rwlock);
} }
TEST ("rwlockforgotunlock") TEST ("rwlockforgotunlock")
{ {
lumiera_rwlock rwlock; lumiera_rwlock rwlock;
lumiera_rwlock_init (&rwlock); lumiera_rwlock_init (&rwlock, "rwlockforgotunlock", &NOBUG_FLAG(NOBUG_ON));
RESOURCE_ANNOUNCE (NOBUG_ON, "rwlock", "rwlockforgotunlock", &rwlock, rwlock.rh);
LUMIERA_RDLOCK_SECTION (NOBUG_ON, &rwlock) LUMIERA_RDLOCK_SECTION (NOBUG_ON, &rwlock)
{ {
break; // LOCK_SECTIONS must not be left by a jump break; // LOCK_SECTIONS must not be left by a jump
} }
RESOURCE_FORGET (NOBUG_ON, rwlock.rh); lumiera_rwlock_destroy (&rwlock, &NOBUG_FLAG(NOBUG_ON));
lumiera_rwlock_destroy (&rwlock);
} }
TESTS_END TESTS_END