diff options
Diffstat (limited to 'CommonLibs/debug.c')
-rw-r--r-- | CommonLibs/debug.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/CommonLibs/debug.c b/CommonLibs/debug.c index 294924d..17ef5bc 100644 --- a/CommonLibs/debug.c +++ b/CommonLibs/debug.c @@ -1,3 +1,5 @@ +#include <pthread.h> + #include <osmocom/core/logging.h> #include <osmocom/core/utils.h> #include "debug.h" @@ -34,3 +36,49 @@ const struct log_info log_info = { .cat = default_categories, .num_cat = ARRAY_SIZE(default_categories), }; + +pthread_mutex_t log_mutex; + +bool log_mutex_init() { + int rc; + pthread_mutexattr_t attr; + + if ((rc = pthread_mutexattr_init(&attr))) { + fprintf(stderr, "pthread_mutexattr_init() failed: %d\n", rc); + return false; + } + if ((rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE))) { + fprintf(stderr, "pthread_mutexattr_settype() failed: %d\n", rc); + return false; + } + if ((rc = pthread_mutex_init(&log_mutex, &attr))) { + fprintf(stderr, "pthread_mutex_init() failed: %d\n", rc); + return false; + } + if ((rc = pthread_mutexattr_destroy(&attr))) { + fprintf(stderr, "pthread_mutexattr_destroy() failed: %d\n", rc); + return false; + } + return true; + /* FIXME: do we need to call pthread_mutex_destroy() during process exit? */ +} + +/* If called inside a C++ destructor, use log_mutex_(un)lock_canceldisable() APIs instead. + See osmo-trx commit 86be40b4eb762d5c12e8e3f7388ca9f254e77b36 for more information */ +void log_mutex_lock() { + OSMO_ASSERT(!pthread_mutex_lock(&log_mutex)); +} + +void log_mutex_unlock() { + OSMO_ASSERT(!pthread_mutex_unlock(&log_mutex)); +} + +void log_mutex_lock_canceldisable(int *st) { + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, st); + log_mutex_lock(); +} + +void log_mutex_unlock_canceldisable(int st) { + log_mutex_unlock(); + pthread_setcancelstate(st, NULL); +} |