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:
parent
c11915a4c4
commit
d8f59fb722
5 changed files with 39 additions and 36 deletions
|
|
@ -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:
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue