X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Flogger.c;h=f3fe3547fa2143add97a5f39530d452c9146a93e;hb=2975b4b88d0103dcc1ac84202bcfc221671e6743;hp=b344f4e985e891b7bdd00f1b7cfab91b2ab787f2;hpb=23e7e3ae2b2adfa49635495c0950b76e17987c93;p=deb_shairplay.git diff --git a/src/lib/logger.c b/src/lib/logger.c index b344f4e..f3fe354 100644 --- a/src/lib/logger.c +++ b/src/lib/logger.c @@ -18,14 +18,37 @@ #include #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_INFO; + 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 @@ -33,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 * @@ -80,24 +108,31 @@ 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", local); + fprintf(stderr, "%s\n", local); free(local); } else { - fprintf(stderr, "%s", buffer); + fprintf(stderr, "%s\n", buffer); } } }