From bc2c68cf9316d95c5b00444aaaa2f0a6127c1aa9 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Mon, 17 Feb 2014 16:02:10 +0100 Subject: [PATCH] Provide yaz_log_{lock,unlock} This is to ensure yaz_log writes are atomic and allows us to use yaz_log_lock + yaz_log_unlock in threaded+forked applications. --- include/yaz/log.h | 3 +++ src/log.c | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/yaz/log.h b/include/yaz/log.h index 57bad18..3d7bb67 100644 --- a/include/yaz/log.h +++ b/include/yaz/log.h @@ -220,6 +220,9 @@ YAZ_EXPORT void log_event_end(void (*func)(int level, const char *msg, */ YAZ_EXPORT void yaz_log_xml_errors(const char *prefix, int log_level); +YAZ_EXPORT void yaz_log_lock(void); +YAZ_EXPORT void yaz_log_unlock(void); + YAZ_END_CDECL #endif diff --git a/src/log.c b/src/log.c index d78939c..b407ad9 100644 --- a/src/log.c +++ b/src/log.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -99,6 +100,18 @@ static struct { static unsigned int next_log_bit = YLOG_LAST_BIT<<1; /* first dynamic bit */ +static YAZ_MUTEX log_mutex = 0; + +void yaz_log_lock(void) +{ + yaz_mutex_enter(log_mutex); +} + +void yaz_log_unlock(void) +{ + yaz_mutex_leave(log_mutex); +} + static void internal_log_init(void) { static int mutex_init_flag = 0; /* not yet initialized */ @@ -108,6 +121,9 @@ static void internal_log_init(void) return; mutex_init_flag = 1; /* here, 'cause nmem_mutex_create may call yaz_log */ + if (log_mutex == 0) + yaz_mutex_create(&log_mutex); + env = getenv("YAZ_LOG"); if (env) l_level = yaz_log_mask_str_x(env, l_level); @@ -342,12 +358,14 @@ static void yaz_log_do_reopen(const char *filemode) struct tm *tm; #endif + yaz_log_lock(); #if HAVE_LOCALTIME_R localtime_r(&cur_time, tm); #else tm = localtime(&cur_time); #endif yaz_log_open_check(tm, 1, filemode); + yaz_log_unlock(); } @@ -379,6 +397,7 @@ static void yaz_log_to_file(int level, const char *log_message) internal_log_init(); + yaz_log_lock(); #if HAVE_LOCALTIME_R localtime_r(&ti, tm); #else @@ -436,6 +455,7 @@ static void yaz_log_to_file(int level, const char *log_message) if (l_level & YLOG_FLUSH) fflush(file); } + yaz_log_unlock(); } void yaz_log(int level, const char *fmt, ...) -- 1.7.10.4