From 8c59a5b0d397f78609cfab35db7923b9d6b8c08a Mon Sep 17 00:00:00 2001 From: Rafal Pietruch Date: Thu, 9 Mar 2017 09:59:30 +0100 Subject: [PATCH] [4.0] logger: replace writer type with callbacks Replaces switching between different writer types with specific writer function callback: service_writer_{socket,pipe,kmsg} to be more easily extensible when adding new writers Change-Id: I8552121bd50e20ca4872ed5e1536325a7acef279 --- src/logger/logger.c | 62 +++++++++++++++++++++-------------------------------- 1 file changed, 25 insertions(+), 37 deletions(-) diff --git a/src/logger/logger.c b/src/logger/logger.c index 98543dc..5d6b779 100644 --- a/src/logger/logger.c +++ b/src/logger/logger.c @@ -111,17 +111,22 @@ enum entity_type { ENTITY_SOCK_WRITE, }; -enum writer_state { - WRITER_SOCKET = 0, - WRITER_PIPE, - WRITER_KMSG -}; - struct fd_entity { int type; }; struct writer; +struct logger; + +/** + * @brief Service a writer + * @details Specific handler that event is delegated to, according to writers type + * @param[in] server The logger server + * @param[in] wr The writer who sent the request + * @param[in] event The relevant event + * @return 0 on success, else -errno + */ +typedef int (*service_writer_t)(struct logger* server, struct writer* wr, struct epoll_event* event); struct writer { struct fd_entity _entity; @@ -134,13 +139,10 @@ struct writer { struct log_buffer* buf_ptr; int readed; - char state; + service_writer_t service_writer; char buffer[LOG_MAX_SIZE]; }; -struct reader; -struct log_buffer; - struct reader { enum reader_type type; struct log_file file; @@ -153,6 +155,8 @@ struct reader { char partial_log[LOG_MAX_SIZE]; }; +struct log_buffer; + struct sock_data { struct fd_entity _entity; int fd; @@ -215,6 +219,9 @@ struct logger_config_data { static struct file_buffer g_file_buffer; // function prototypes +static int service_writer_socket(struct logger* server, struct writer* wr, struct epoll_event* event); +static int service_writer_pipe(struct logger* server, struct writer* wr, struct epoll_event* event); +static int service_writer_kmsg(struct logger* server, struct writer* wr, struct epoll_event* event); static void reader_free(struct reader* reader); static void logger_free(struct logger* l); static int parse_args(int argc, char ** argv, struct buffering * b); @@ -446,6 +453,7 @@ static struct writer* writer_create(int fd, int rights) if (w) { w->working_fd = fd; w->rights = rights; + w->service_writer = service_writer_socket; } return w; @@ -469,7 +477,7 @@ static int create_kmsg_writer(struct logger * server) return -errno; } - w->state = WRITER_KMSG; + w->service_writer = service_writer_kmsg; w->buf_ptr = server->buffers[LOG_ID_KMSG]; LIST_ADD(server->writers, w); @@ -1306,7 +1314,7 @@ static int service_writer_handle_req_pipe(struct logger* server, struct writer* goto err_remove; writer_close_fd(server, wr); - wr->state = WRITER_PIPE; + wr->service_writer = service_writer_pipe; wr->working_fd = pipe_fd[0]; wr->readed = 0; return 0; @@ -1450,28 +1458,6 @@ static int service_writer_kmsg(struct logger* server, struct writer* wr, struct } /** - * @brief Service a writer - * @details Relegates the event to specific handlers - * @param[in] server The logger server - * @param[in] wr The writer who sent the request - * @param[in] event The relevant event - * @return 0 on success, else -errno - */ -static int service_writer(struct logger* server, struct writer* wr, struct epoll_event* event) -{ - switch (wr->state) { - case WRITER_SOCKET: - return service_writer_socket(server, wr, event); - case WRITER_PIPE: - return service_writer_pipe(server, wr, event); - case WRITER_KMSG: - return service_writer_kmsg(server, wr, event); - default: - return -EINVAL; - } -} - -/** * @brief Service all readers * @details Update all readers with latest data * @param[in] server The logger server @@ -1610,10 +1596,12 @@ static void dispatch_event(struct logger* server, struct fd_entity* entity, stru { switch (entity->type) { case ENTITY_WRITER: { - int r = service_writer(server, (struct writer*)entity, event); + struct writer *writer = (struct writer*)entity; + assert(writer->service_writer); + int r = writer->service_writer(server, writer, event); if (r) { - LIST_REMOVE(server->writers, ((struct writer*)entity), writer); - writer_free((struct writer*)entity); + LIST_REMOVE(server->writers, writer, writer); + writer_free(writer); } break; } -- 2.7.4