commit b9a7fc39ba92798d1a5a08f02742cc080bdf2df7
parent 89c166ba2a3442385573b9b2db193228ed89ddd4
Author: vaplv <vaplv@free.fr>
Date: Mon, 8 Dec 2014 10:57:14 +0100
Major refactoring of the logger API
Diffstat:
| M | src/logger.c | | | 15 | +++++---------- |
| M | src/logger.h | | | 81 | ++++++++++++++----------------------------------------------------------------- |
| M | src/test_logger.c | | | 67 | ++++++++++++++++++++----------------------------------------------- |
3 files changed, 39 insertions(+), 124 deletions(-)
diff --git a/src/logger.c b/src/logger.c
@@ -20,10 +20,9 @@ res_T
logger_print
(struct logger* logger, const enum log_type type, const char* log, ...)
{
- struct list_node* node = NULL;
va_list vargs_list;
int sz;
- ASSERT(logger && log && type < LOG_TYPES_COUNT__);
+ ASSERT(logger && log && (unsigned)type < LOG_TYPES_COUNT__);
if(logger == LOGGER_DEFAULT) {
va_start(vargs_list, log);
@@ -32,7 +31,7 @@ logger_print
return RES_OK;
}
- if(is_list_empty(logger->streams + type))
+ if(!logger->streams[type].writer)
return RES_OK;
va_start(vargs_list, log);
@@ -57,13 +56,9 @@ logger_print
va_end(vargs_list);
ASSERT((size_t)sz < darray_char_size_get(&logger->buffer));
}
-
- /* Broadcast the formatted string to the log streams */
- LIST_FOR_EACH(node, logger->streams + type) {
- struct log_stream* stream = CONTAINER_OF
- (node, struct log_stream, attachments[type]);
- stream->writer(darray_char_cdata_get(&logger->buffer), stream->ctx);
- }
+ /* Print the formatted string */
+ logger->streams[type].writer
+ (darray_char_cdata_get(&logger->buffer), logger->streams[type].ctx);
return RES_OK;
}
diff --git a/src/logger.h b/src/logger.h
@@ -31,62 +31,12 @@ enum log_type {
LOG_TYPES_COUNT__
};
-/*******************************************************************************
- * Log stream that can be attached to a logger
- ******************************************************************************/
-struct log_stream {
- /* Internal data */
- struct list_node attachments[LOG_TYPES_COUNT__];
- void (*writer)(const char*msg, void* ctx);
- void* ctx; /* User defined data */
-};
-
-static INLINE void
-log_stream_init(struct log_stream* stream)
-{
- int i;
- ASSERT(stream);
- FOR_EACH(i, 0, LOG_TYPES_COUNT__) list_init(stream->attachments +i);
- stream->writer = NULL;
- stream->ctx = NULL;
-}
-
-static INLINE void
-log_stream_release(struct log_stream* stream) { (void)stream; }
-
-static INLINE void
-log_stream_setup
- (struct log_stream* stream,
- void (*writer)(const char*, void*),
- void* context)
-{
- ASSERT(stream && writer);
- stream->writer = writer;
- stream->ctx = context;
-}
-
-static INLINE void
-log_stream_detach(struct log_stream* stream, const enum log_type type)
-{
- ASSERT(stream && type < LOG_TYPES_COUNT__);
- list_del(stream->attachments + type);
-}
-
-static INLINE void
-log_stream_clean(struct log_stream* stream)
-{
- int i;
- ASSERT(stream);
- FOR_EACH(i, 0, LOG_TYPES_COUNT__)
- log_stream_detach(stream, (enum log_type)i);
-}
-
-/*******************************************************************************
- * Logger
- ******************************************************************************/
struct logger {
/* Internal data */
- struct list_node streams[LOG_TYPES_COUNT__];
+ struct {
+ void (*writer)(const char* msg, void* ctx);
+ void* ctx;
+ } streams[LOG_TYPES_COUNT__];
struct mem_allocator* allocator;
struct darray_char buffer;
};
@@ -99,7 +49,8 @@ logger_init
int i;
ASSERT(logger);
logger->allocator = allocator ? allocator : &mem_default_allocator;
- FOR_EACH(i, 0, LOG_TYPES_COUNT__) list_init(logger->streams + i);
+ FOR_EACH(i, 0, LOG_TYPES_COUNT__) logger->streams[i].writer = NULL;
+
darray_char_init(logger->allocator, &logger->buffer);
return darray_char_resize(&logger->buffer, 256);
}
@@ -109,30 +60,26 @@ logger_clear(struct logger* logger)
{
int i;
ASSERT(logger);
- FOR_EACH(i, 0, LOG_TYPES_COUNT__) {
- struct list_node* node, *tmp;
- LIST_FOR_EACH_SAFE(node, tmp, logger->streams + i)
- list_del(node);
- }
+ FOR_EACH(i, 0, LOG_TYPES_COUNT__) logger->streams[i].writer = NULL;
}
static INLINE void
logger_release(struct logger* logger)
{
ASSERT(logger);
- logger_clear(logger);
darray_char_release(&logger->buffer);
}
static INLINE void
-logger_attach_stream
+logger_set_stream
(struct logger* logger,
const enum log_type type,
- struct log_stream* stream)
+ void (*writer)(const char* msg, void* ctx), /* May be NULL */
+ void* ctx) /* May be NULL */
{
- ASSERT(logger && stream && is_list_empty(stream->attachments + type));
- ASSERT(type < LOG_TYPES_COUNT__);
- list_add_tail(logger->streams + type, stream->attachments + type);
+ ASSERT(logger && (unsigned)type < LOG_TYPES_COUNT__);
+ logger->streams[type].writer = writer;
+ logger->streams[type].ctx = ctx;
}
BEGIN_DECLS
@@ -145,7 +92,7 @@ logger_print
... )
#ifdef COMPILER_GCC
__attribute((format(printf, 3, 4)))
-#endif
+#endif
;
END_DECLS
diff --git a/src/test_logger.c b/src/test_logger.c
@@ -31,13 +31,6 @@ func_stream_out_std(const char* fmt, void* data)
}
static void
-func_stream_out2(const char* fmt, void* data)
-{
- *(int*)data += 1;
- CHECK(strcmp(fmt, "output"), 0);
-}
-
-static void
func_stream_err(const char* fmt, void* data)
{
*(int*)data += 1;
@@ -56,10 +49,6 @@ main(int argc, char** argv)
{
int i = 0;
struct mem_allocator allocator_proxy;
- struct log_stream stream_out;
- struct log_stream stream_out2;
- struct log_stream stream_err;
- struct log_stream stream_warn;
struct logger logger;
int istream_out = 0;
int istream_err = 0;
@@ -74,30 +63,20 @@ main(int argc, char** argv)
logger_print(LOGGER_DEFAULT, LOG_WARNING, "Warn: hop%c\n", (char)('a'+i));
}
- log_stream_init(&stream_out);
- log_stream_init(&stream_out2);
- log_stream_init(&stream_err);
- log_stream_init(&stream_warn);
-
- log_stream_setup(&stream_out, func_stream_out, &istream_out);
- log_stream_setup(&stream_out2, func_stream_out2, &istream_out);
- log_stream_setup(&stream_err, func_stream_err, &istream_err);
- log_stream_setup(&stream_warn, func_stream_warn, &istream_warn);
-
logger_init(&allocator_proxy, &logger);
logger_print(&logger, LOG_OUTPUT, "out%s", "put");
CHECK(istream_out, 0);
CHECK(istream_err, 0);
CHECK(istream_warn, 0);
- logger_attach_stream(&logger, LOG_OUTPUT, &stream_out);
+ logger_set_stream(&logger, LOG_OUTPUT, func_stream_out, &istream_out);
logger_print(&logger, LOG_OUTPUT, "output");
CHECK(istream_out, 1);
CHECK(istream_err, 0);
CHECK(istream_warn, 0);
- logger_attach_stream(&logger, LOG_ERROR, &stream_err);
- logger_attach_stream(&logger, LOG_WARNING, &stream_warn);
+ logger_set_stream(&logger, LOG_ERROR, func_stream_err, &istream_err);
+ logger_set_stream(&logger, LOG_WARNING, func_stream_warn, &istream_warn);
logger_print(&logger, LOG_OUTPUT, "output");
CHECK(istream_out, 2);
CHECK(istream_err, 0);
@@ -111,38 +90,37 @@ main(int argc, char** argv)
CHECK(istream_err, 1);
CHECK(istream_warn, 1);
- logger_attach_stream(&logger, LOG_OUTPUT, &stream_out2);
+ logger_set_stream(&logger, LOG_OUTPUT, func_stream_out, &istream_out);
logger_print(&logger, LOG_OUTPUT, "output");
- CHECK(istream_out, 4);
+ CHECK(istream_out, 3);
CHECK(istream_err, 1);
CHECK(istream_warn, 1);
- log_stream_detach(&stream_out, LOG_OUTPUT);
logger_print
( &logger, LOG_OUTPUT, "%c%c%c%c%c%c", 'o', 'u' ,'t', 'p', 'u', 't' );
- CHECK(istream_out, 5);
+ CHECK(istream_out, 4);
CHECK(istream_err, 1);
CHECK(istream_warn, 1);
logger_print(&logger, LOG_ERROR, "error");
- CHECK(istream_out, 5);
+ CHECK(istream_out, 4);
CHECK(istream_err, 2);
CHECK(istream_warn, 1);
logger_print(&logger, LOG_WARNING, "warning");
- CHECK(istream_out, 5);
+ CHECK(istream_out, 4);
CHECK(istream_err, 2);
CHECK(istream_warn, 2);
- log_stream_detach( &stream_err, LOG_ERROR );
+ logger_set_stream(&logger, LOG_ERROR, NULL, NULL);
logger_print(&logger, LOG_ERROR, "error");
- CHECK(istream_out, 5);
+ CHECK(istream_out, 4);
CHECK(istream_err, 2);
CHECK(istream_warn, 2);
logger_clear(&logger);
istream_out = istream_err = istream_warn = 0;
- logger_attach_stream(&logger, LOG_OUTPUT, &stream_out);
- logger_attach_stream(&logger, LOG_ERROR, &stream_out);
- logger_attach_stream(&logger, LOG_WARNING, &stream_out);
+ logger_set_stream(&logger, LOG_OUTPUT, func_stream_out, &istream_out);
+ logger_set_stream(&logger, LOG_ERROR, func_stream_out, &istream_out);
+ logger_set_stream(&logger, LOG_WARNING, func_stream_out, &istream_out);
logger_print(&logger, LOG_OUTPUT, "output");
CHECK(istream_out, 1);
CHECK(istream_err, 0);
@@ -156,7 +134,7 @@ main(int argc, char** argv)
CHECK(istream_err, 0);
CHECK(istream_warn, 0);
- log_stream_detach(&stream_out, LOG_WARNING);
+ logger_set_stream(&logger, LOG_WARNING, NULL, NULL);
logger_print(&logger, LOG_WARNING, "output");
CHECK(istream_out, 3);
CHECK(istream_err, 0);
@@ -167,8 +145,8 @@ main(int argc, char** argv)
CHECK(istream_err, 0);
CHECK(istream_warn, 0);
- log_stream_detach(&stream_out, LOG_OUTPUT);
- log_stream_detach(&stream_out, LOG_OUTPUT);
+ logger_set_stream(&logger, LOG_OUTPUT, NULL, NULL);
+ logger_set_stream(&logger, LOG_OUTPUT, NULL, NULL);
logger_print(&logger, LOG_WARNING, "output");
logger_print(&logger, LOG_OUTPUT, "output");
CHECK(istream_out, 5);
@@ -179,15 +157,15 @@ main(int argc, char** argv)
CHECK(istream_err, 0);
CHECK(istream_warn, 0);
- logger_attach_stream(&logger, LOG_OUTPUT, &stream_out);
- logger_attach_stream(&logger, LOG_WARNING, &stream_out);
+ logger_set_stream(&logger, LOG_OUTPUT, func_stream_out, &istream_out);
+ logger_set_stream(&logger, LOG_WARNING, func_stream_out, &istream_out);
logger_print(&logger, LOG_OUTPUT, "output");
logger_print(&logger, LOG_ERROR, "output");
logger_print(&logger, LOG_WARNING, "output");
CHECK(istream_out, 9);
CHECK(istream_err, 0);
CHECK(istream_warn, 0);
- log_stream_clean(&stream_out);
+ logger_clear(&logger);
logger_print(&logger, LOG_OUTPUT, "output");
logger_print(&logger, LOG_ERROR, "output");
logger_print(&logger, LOG_WARNING, "output");
@@ -195,8 +173,7 @@ main(int argc, char** argv)
CHECK(istream_err, 0);
CHECK(istream_warn, 0);
- log_stream_setup(&stream_out, func_stream_out_std, NULL);
- logger_attach_stream(&logger, LOG_OUTPUT, &stream_out);
+ logger_set_stream(&logger, LOG_OUTPUT, func_stream_out_std, NULL);
logger_print
(&logger, LOG_OUTPUT, "%s%s%s%s",
"Rcvfbqr 1, XARR-QRRC VA GUR QRNQ:\n\
@@ -209,10 +186,6 @@ LBH'ER FGHPX BA GUR FUBERF BS URYY. GUR BAYL JNL BHG VF GUEBHTU.\n\n",
"GB PBAGVAHR GUR QBBZ RKCREVRAPR, CYNL GUR FUBERF BS URYY NAQ VGF NZNMVAT\n\
FRDHRY, VASREAB!\n");
- log_stream_release(&stream_out);
- log_stream_release(&stream_out2);
- log_stream_release(&stream_err);
- log_stream_release(&stream_warn);
logger_release(&logger);
check_memory_allocator(&allocator_proxy);