From 4f29f302b2d8ac43ba4c03f5c5a2f35d28ac66be Mon Sep 17 00:00:00 2001 From: Christian Thaeter Date: Tue, 27 Jan 2009 10:07:30 +0100 Subject: [PATCH] split mutex.h again into mutex.h and recmutex.h --- src/lib/Makefile.am | 3 +- src/lib/mutex.c | 2 +- src/lib/mutex.h | 80 +-------------------- src/lib/recmutex.c | 2 +- src/lib/recmutex.h | 132 +++++++++++++++++++++++++++++++++++ src/lib/sync.hpp | 1 + tests/library/test-locking.c | 2 + 7 files changed, 140 insertions(+), 82 deletions(-) create mode 100644 src/lib/recmutex.h diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 0163d0c4c..8991e2e39 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -1,5 +1,5 @@ # Copyright (C) Lumiera.org -# 2007, Christian Thaeter +# 2007, 2008, 2009 Christian Thaeter # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -52,6 +52,7 @@ noinst_HEADERS += \ $(liblumiera_la_srcdir)/error.h \ $(liblumiera_la_srcdir)/error.hpp \ $(liblumiera_la_srcdir)/mutex.h \ + $(liblumiera_la_srcdir)/recmutex.h \ $(liblumiera_la_srcdir)/rwlock.h \ $(liblumiera_la_srcdir)/condition.h \ $(liblumiera_la_srcdir)/reccondition.h \ diff --git a/src/lib/mutex.c b/src/lib/mutex.c index c7d6df040..25b56679c 100644 --- a/src/lib/mutex.c +++ b/src/lib/mutex.c @@ -2,7 +2,7 @@ mutex.c - mutex Copyright (C) Lumiera.org - 2008, Christian Thaeter + 2008, 2009, Christian Thaeter This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as diff --git a/src/lib/mutex.h b/src/lib/mutex.h index 1199dbec5..a76707933 100644 --- a/src/lib/mutex.h +++ b/src/lib/mutex.h @@ -2,7 +2,7 @@ mutex.h - mutal exclusion locking Copyright (C) Lumiera.org - 2008, Christian Thaeter + 2008, 2009, Christian Thaeter This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -93,58 +93,6 @@ LUMIERA_SECTION_UNLOCK_(&lumiera_lock_section_) -/** - * Recursive Mutual exclusive section. - */ -#define LUMIERA_RECMUTEX_SECTION(nobugflag, mtx) \ - for (lumiera_sectionlock NOBUG_CLEANUP(lumiera_sectionlock_ensureunlocked) \ - lumiera_lock_section_ = { \ - (void*)1, lumiera_mutex_unlock_cb NOBUG_ALPHA_COMMA_NULL NOBUG_ALPHA_COMMA_NULL}; \ - lumiera_lock_section_.lock;) \ - for ( \ - ({ \ - lumiera_lock_section_.lock = (mtx); \ - NOBUG_IF_ALPHA(lumiera_lock_section_.flag = &NOBUG_FLAG(nobugflag);) \ - RESOURCE_ENTER (nobugflag, (mtx)->rh, "acquire recmutex", &lumiera_lock_section_, \ - NOBUG_RESOURCE_WAITING, lumiera_lock_section_.rh); \ - if (pthread_mutex_lock (&(mtx)->recmutex)) \ - LUMIERA_DIE (LOCK_ACQUIRE); \ - RESOURCE_STATE (nobugflag, NOBUG_RESOURCE_RECURSIVE, lumiera_lock_section_.rh); \ - }); \ - lumiera_lock_section_.lock; \ - ({ \ - LUMIERA_MUTEX_SECTION_UNLOCK; \ - })) - - -#define LUMIERA_RECMUTEX_SECTION_CHAIN(nobugflag, mtx) \ - for (lumiera_sectionlock *lumiera_lock_section_old_ = &lumiera_lock_section_, \ - NOBUG_CLEANUP(lumiera_sectionlock_ensureunlocked) lumiera_lock_section_ = { \ - (void*)1, lumiera_mutex_unlock_cb NOBUG_ALPHA_COMMA_NULL NOBUG_ALPHA_COMMA_NULL}; \ - lumiera_lock_section_.lock;) \ - for ( \ - ({ \ - REQUIRE (lumiera_lock_section_old_->lock, "section prematurely unlocked"); \ - lumiera_lock_section_.lock = (mtx); \ - NOBUG_IF_ALPHA(lumiera_lock_section_.flag = &NOBUG_FLAG(nobugflag);) \ - RESOURCE_ENTER (nobugflag, (mtx)->rh, "acquire recmutex", &lumiera_lock_section_, \ - NOBUG_RESOURCE_WAITING, lumiera_lock_section_.rh); \ - if (pthread_mutex_lock (&(mtx)->recmutex)) \ - LUMIERA_DIE (LOCK_ACQUIRE); \ - RESOURCE_STATE (nobugflag, NOBUG_RESOURCE_RECURSIVE, lumiera_lock_section_.rh); \ - LUMIERA_SECTION_UNLOCK_(lumiera_lock_section_old_) \ - }); \ - lumiera_lock_section_.lock; \ - ({ \ - LUMIERA_MUTEX_SECTION_UNLOCK; \ - })) - - -#define LUMIERA_RECMUTEX_SECTION_UNLOCK \ - LUMIERA_SECTION_UNLOCK_(&lumiera_lock_section_) - - - /** * Mutex. * @@ -157,14 +105,6 @@ struct lumiera_mutex_struct typedef struct lumiera_mutex_struct lumiera_mutex; typedef lumiera_mutex* LumieraMutex; -struct lumiera_recmutex_struct -{ - pthread_mutex_t recmutex; - RESOURCE_HANDLE (rh); -}; -typedef struct lumiera_recmutex_struct lumiera_recmutex; -typedef lumiera_recmutex* LumieraRecmutex; - /** * Initialize a mutex variable @@ -184,24 +124,6 @@ LumieraMutex lumiera_mutex_destroy (LumieraMutex self, struct nobug_flag* flag); - -/** - * Initialize a recursive mutex variable - * Initializes a 'recursive' mutex which might be locked by the same thread multiple times. - * @param self is a pointer to the mutex to be initialized - * @return self as given - */ -LumieraRecmutex -lumiera_recmutex_init (LumieraRecmutex self, const char* purpose, struct nobug_flag* flag); - -/** - * Destroy a recursive mutex variable - * @param self is a pointer to the mutex to be destroyed - * @return self as given - */ -LumieraRecmutex -lumiera_recmutex_destroy (LumieraRecmutex self, struct nobug_flag* flag); - /** * Callback for unlocking mutexes. * @internal diff --git a/src/lib/recmutex.c b/src/lib/recmutex.c index 57b9b7d65..447a12350 100644 --- a/src/lib/recmutex.c +++ b/src/lib/recmutex.c @@ -19,7 +19,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include "lib/mutex.h" +#include "lib/recmutex.h" /** * @file diff --git a/src/lib/recmutex.h b/src/lib/recmutex.h new file mode 100644 index 000000000..a893d3bed --- /dev/null +++ b/src/lib/recmutex.h @@ -0,0 +1,132 @@ +/* + recmutex.h - recursive mutal exclusion locking + + Copyright (C) Lumiera.org + 2008, 2009, Christian Thaeter + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef LUMIERA_RECMUTEX_H +#define LUMIERA_RECMUTEX_H + +#include "lib/error.h" +#include "lib/sectionlock.h" + +#include +#include + +/** + * @file + * Mutual exclusion locking, header. + */ + +/** + * Recursive Mutual exclusive section. + */ +#define LUMIERA_RECMUTEX_SECTION(nobugflag, mtx) \ + for (lumiera_sectionlock NOBUG_CLEANUP(lumiera_sectionlock_ensureunlocked) \ + lumiera_lock_section_ = { \ + (void*)1, lumiera_mutex_unlock_cb NOBUG_ALPHA_COMMA_NULL NOBUG_ALPHA_COMMA_NULL}; \ + lumiera_lock_section_.lock;) \ + for ( \ + ({ \ + lumiera_lock_section_.lock = (mtx); \ + NOBUG_IF_ALPHA(lumiera_lock_section_.flag = &NOBUG_FLAG(nobugflag);) \ + RESOURCE_ENTER (nobugflag, (mtx)->rh, "acquire recmutex", &lumiera_lock_section_, \ + NOBUG_RESOURCE_WAITING, lumiera_lock_section_.rh); \ + if (pthread_mutex_lock (&(mtx)->recmutex)) \ + LUMIERA_DIE (LOCK_ACQUIRE); \ + RESOURCE_STATE (nobugflag, NOBUG_RESOURCE_RECURSIVE, lumiera_lock_section_.rh); \ + }); \ + lumiera_lock_section_.lock; \ + ({ \ + LUMIERA_MUTEX_SECTION_UNLOCK; \ + })) + + +#define LUMIERA_RECMUTEX_SECTION_CHAIN(nobugflag, mtx) \ + for (lumiera_sectionlock *lumiera_lock_section_old_ = &lumiera_lock_section_, \ + NOBUG_CLEANUP(lumiera_sectionlock_ensureunlocked) lumiera_lock_section_ = { \ + (void*)1, lumiera_mutex_unlock_cb NOBUG_ALPHA_COMMA_NULL NOBUG_ALPHA_COMMA_NULL}; \ + lumiera_lock_section_.lock;) \ + for ( \ + ({ \ + REQUIRE (lumiera_lock_section_old_->lock, "section prematurely unlocked"); \ + lumiera_lock_section_.lock = (mtx); \ + NOBUG_IF_ALPHA(lumiera_lock_section_.flag = &NOBUG_FLAG(nobugflag);) \ + RESOURCE_ENTER (nobugflag, (mtx)->rh, "acquire recmutex", &lumiera_lock_section_, \ + NOBUG_RESOURCE_WAITING, lumiera_lock_section_.rh); \ + if (pthread_mutex_lock (&(mtx)->recmutex)) \ + LUMIERA_DIE (LOCK_ACQUIRE); \ + RESOURCE_STATE (nobugflag, NOBUG_RESOURCE_RECURSIVE, lumiera_lock_section_.rh); \ + LUMIERA_SECTION_UNLOCK_(lumiera_lock_section_old_) \ + }); \ + lumiera_lock_section_.lock; \ + ({ \ + LUMIERA_MUTEX_SECTION_UNLOCK; \ + })) + + +#define LUMIERA_RECMUTEX_SECTION_UNLOCK \ + LUMIERA_SECTION_UNLOCK_(&lumiera_lock_section_) + + + +/** + * Mutex. + * + */ +struct lumiera_recmutex_struct +{ + pthread_mutex_t recmutex; + RESOURCE_HANDLE (rh); +}; +typedef struct lumiera_recmutex_struct lumiera_recmutex; +typedef lumiera_recmutex* LumieraRecmutex; + +/** + * Initialize a recursive mutex variable + * Initializes a 'recursive' mutex which might be locked by the same thread multiple times. + * @param self is a pointer to the mutex to be initialized + * @return self as given + */ +LumieraRecmutex +lumiera_recmutex_init (LumieraRecmutex self, const char* purpose, struct nobug_flag* flag); + +/** + * Destroy a recursive mutex variable + * @param self is a pointer to the mutex to be destroyed + * @return self as given + */ +LumieraRecmutex +lumiera_recmutex_destroy (LumieraRecmutex self, struct nobug_flag* flag); + +/** + * Callback for unlocking mutexes. + * @internal + */ +int +lumiera_mutex_unlock_cb (void* mutex); + + +#endif +/* +// Local Variables: +// mode: C +// c-file-style: "gnu" +// indent-tabs-mode: nil +// End: +*/ diff --git a/src/lib/sync.hpp b/src/lib/sync.hpp index e4fcb850a..4a20852b6 100644 --- a/src/lib/sync.hpp +++ b/src/lib/sync.hpp @@ -73,6 +73,7 @@ extern "C" { #include "lib/mutex.h" +#include "lib/recmutex.h" #include "lib/condition.h" #include "lib/reccondition.h" } diff --git a/tests/library/test-locking.c b/tests/library/test-locking.c index 33ac2fccf..7ea7db794 100644 --- a/tests/library/test-locking.c +++ b/tests/library/test-locking.c @@ -21,7 +21,9 @@ #include "tests/test.h" #include "lib/mutex.h" +#include "lib/recmutex.h" #include "lib/condition.h" +#include "lib/reccondition.h" #include "lib/rwlock.h" #include