X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Flogger.c;h=f3fe3547fa2143add97a5f39530d452c9146a93e;hb=2975b4b88d0103dcc1ac84202bcfc221671e6743;hp=fd87ef41f650e6306534b3570cf6083f2e41645e;hpb=46212791ac2f31ee382934c461c49495e0c66cc9;p=deb_shairplay.git diff --git a/src/lib/logger.c b/src/lib/logger.c index fd87ef4..f3fe354 100644 --- a/src/lib/logger.c +++ b/src/lib/logger.c @@ -20,13 +20,35 @@ #include "logger.h" #include "compat.h" -void -logger_init(logger_t *logger) +struct logger_s { + mutex_handle_t lvl_mutex; + mutex_handle_t cb_mutex; + + int level; + void *cls; + logger_callback_t callback; +}; + +logger_t * +logger_init() { + logger_t *logger = calloc(1, sizeof(logger_t)); assert(logger); - logger->level = LOGGER_DEBUG; + MUTEX_CREATE(logger->lvl_mutex); + MUTEX_CREATE(logger->cb_mutex); + + logger->level = LOGGER_WARNING; logger->callback = NULL; + return logger; +} + +void +logger_destroy(logger_t *logger) +{ + MUTEX_DESTROY(logger->lvl_mutex); + MUTEX_DESTROY(logger->cb_mutex); + free(logger); } void @@ -34,15 +56,20 @@ logger_set_level(logger_t *logger, int level) { assert(logger); + MUTEX_LOCK(logger->lvl_mutex); logger->level = level; + MUTEX_UNLOCK(logger->lvl_mutex); } void -logger_set_callback(logger_t *logger, logger_callback_t callback) +logger_set_callback(logger_t *logger, logger_callback_t callback, void *cls) { assert(logger); + MUTEX_LOCK(logger->cb_mutex); + logger->cls = cls; logger->callback = callback; + MUTEX_UNLOCK(logger->cb_mutex); } static char * @@ -81,19 +108,26 @@ logger_log(logger_t *logger, int level, const char *fmt, ...) char buffer[4096]; va_list ap; - if (level > logger->level) + MUTEX_LOCK(logger->lvl_mutex); + if (level > logger->level) { + MUTEX_UNLOCK(logger->lvl_mutex); return; + } + MUTEX_UNLOCK(logger->lvl_mutex); buffer[sizeof(buffer)-1] = '\0'; va_start(ap, fmt); vsnprintf(buffer, sizeof(buffer)-1, fmt, ap); va_end(ap); + MUTEX_LOCK(logger->cb_mutex); if (logger->callback) { - logger->callback(level, buffer); + logger->callback(logger->cls, level, buffer); + MUTEX_UNLOCK(logger->cb_mutex); } else { - char *local = logger_utf8_to_local(buffer); - + char *local; + MUTEX_UNLOCK(logger->cb_mutex); + local = logger_utf8_to_local(buffer); if (local) { fprintf(stderr, "%s\n", local); free(local);