db_lock: add assertions

This commit is contained in:
Max Kellermann 2012-02-02 17:52:11 +01:00
parent 3edd4a24af
commit 837bd79b20
2 changed files with 33 additions and 0 deletions

View File

@ -21,3 +21,7 @@
#include "db_lock.h"
GStaticMutex db_mutex = G_STATIC_MUTEX_INIT;
#ifndef NDEBUG
GThread *db_mutex_holder;
#endif

View File

@ -30,9 +30,26 @@
#include <glib.h>
#include <assert.h>
#include <stdbool.h>
extern GStaticMutex db_mutex;
#ifndef NDEBUG
extern GThread *db_mutex_holder;
/**
* Does the current thread hold the database lock?
*/
G_GNUC_PURE
static inline bool
holding_db_lock(void)
{
return db_mutex_holder == g_thread_self();
}
#endif
/**
* Obtain the global database lock. This is needed before
* dereferencing a #song or #directory. It is not recursive.
@ -40,7 +57,14 @@ extern GStaticMutex db_mutex;
static inline void
db_lock(void)
{
assert(!holding_db_lock());
g_static_mutex_lock(&db_mutex);
assert(db_mutex_holder == NULL);
#ifndef NDEBUG
db_mutex_holder = g_thread_self();
#endif
}
/**
@ -49,6 +73,11 @@ db_lock(void)
static inline void
db_unlock(void)
{
assert(holding_db_lock());
#ifndef NDEBUG
db_mutex_holder = NULL;
#endif
g_static_mutex_unlock(&db_mutex);
}