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
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:
*/

View file

@ -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:
*/

View file

@ -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);
}

View file

@ -27,7 +27,6 @@
#endif
#include <pthread.h>
//#include <errno.h>
#include <nobug.h>
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);

View file

@ -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