repositories
/
deb_shairplay.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Mister the cleaner.
[deb_shairplay.git]
/
src
/
lib
/
logger.c
diff --git
a/src/lib/logger.c
b/src/lib/logger.c
index b344f4e985e891b7bdd00f1b7cfab91b2ab787f2..f3fe3547fa2143add97a5f39530d452c9146a93e 100644
(file)
--- a/
src/lib/logger.c
+++ b/
src/lib/logger.c
@@
-18,14
+18,37
@@
#include <assert.h>
#include "logger.h"
#include <assert.h>
#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);
assert(logger);
- logger->level = LOGGER_INFO;
+ MUTEX_CREATE(logger->lvl_mutex);
+ MUTEX_CREATE(logger->cb_mutex);
+
+ logger->level = LOGGER_WARNING;
logger->callback = NULL;
logger->callback = NULL;
+ return logger;
+}
+
+void
+logger_destroy(logger_t *logger)
+{
+ MUTEX_DESTROY(logger->lvl_mutex);
+ MUTEX_DESTROY(logger->cb_mutex);
+ free(logger);
}
void
}
void
@@
-33,15
+56,20
@@
logger_set_level(logger_t *logger, int level)
{
assert(logger);
{
assert(logger);
+ MUTEX_LOCK(logger->lvl_mutex);
logger->level = level;
logger->level = level;
+ MUTEX_UNLOCK(logger->lvl_mutex);
}
void
}
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);
{
assert(logger);
+ MUTEX_LOCK(logger->cb_mutex);
+ logger->cls = cls;
logger->callback = callback;
logger->callback = callback;
+ MUTEX_UNLOCK(logger->cb_mutex);
}
static char *
}
static char *
@@
-80,24
+108,31
@@
logger_log(logger_t *logger, int level, const char *fmt, ...)
char buffer[4096];
va_list ap;
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;
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);
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) {
if (logger->callback) {
- logger->callback(level, buffer);
+ logger->callback(logger->cls, level, buffer);
+ MUTEX_UNLOCK(logger->cb_mutex);
} else {
} else {
- char *local = logger_utf8_to_local(buffer);
-
+ char *local;
+ MUTEX_UNLOCK(logger->cb_mutex);
+ local = logger_utf8_to_local(buffer);
if (local) {
if (local) {
- fprintf(stderr, "%s", local);
+ fprintf(stderr, "%s
\n
", local);
free(local);
} else {
free(local);
} else {
- fprintf(stderr, "%s", buffer);
+ fprintf(stderr, "%s
\n
", buffer);
}
}
}
}
}
}