X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Flog.c;h=38ecac7ef6f4a7962cd29828e4e3701cdae29500;hp=dec6a2a16d02762c5b48188fad8331a5e0f2aa85;hb=05193e78a2553c93a61da19a39e1276b1a509bac;hpb=5242cb5a8634bfa38b9333ff7f903e718ac6e292 diff --git a/src/log.c b/src/log.c index dec6a2a..38ecac7 100644 --- a/src/log.c +++ b/src/log.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2012 Index Data + * Copyright (C) Index Data * See the file LICENSE for details. */ @@ -30,8 +30,12 @@ #include #include #include +#include #include #include +#if YAZ_POSIX_THREADS +#include +#endif static int l_level = YLOG_DEFAULT_LEVEL; @@ -99,6 +103,18 @@ static struct { static unsigned int next_log_bit = YLOG_LAST_BIT<<1; /* first dynamic bit */ +static YAZ_MUTEX log_mutex = 0; + +static void yaz_log_lock(void) +{ + yaz_mutex_enter(log_mutex); +} + +static 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 +124,11 @@ 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); +#if YAZ_POSIX_THREADS + pthread_atfork(yaz_log_lock, yaz_log_unlock, yaz_log_unlock); +#endif env = getenv("YAZ_LOG"); if (env) l_level = yaz_log_mask_str_x(env, l_level); @@ -342,12 +363,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 +402,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 +460,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, ...)