X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Flogger.c;h=f3fe3547fa2143add97a5f39530d452c9146a93e;hb=2975b4b88d0103dcc1ac84202bcfc221671e6743;hp=0ea18676b181146cb28790d97e1dad5cb7cce252;hpb=1b4a582b04fc39d9d4d930acb4d0803bdedfb32e;p=deb_shairplay.git diff --git a/src/lib/logger.c b/src/lib/logger.c index 0ea1867..f3fe354 100644 --- a/src/lib/logger.c +++ b/src/lib/logger.c @@ -1,17 +1,54 @@ +/** + * Copyright (C) 2011-2012 Juho Vähä-Herttua + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ + #include #include #include #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 @@ -19,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 * @@ -66,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); } } }