aboutsummaryrefslogtreecommitdiffstats
path: root/CommonLibs/debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'CommonLibs/debug.c')
-rw-r--r--CommonLibs/debug.c48
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);
+}