rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

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:
Msrc/logger.c | 15+++++----------
Msrc/logger.h | 81++++++++++++++-----------------------------------------------------------------
Msrc/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);