[4.0] logger: replace writer type with callbacks 41/118241/9
authorRafal Pietruch <r.pietruch@samsung.com>
Thu, 9 Mar 2017 08:59:30 +0000 (09:59 +0100)
committerMichal Bloch <m.bloch@samsung.com>
Fri, 17 Mar 2017 16:43:20 +0000 (17:43 +0100)
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

index 98543dc..5d6b779 100644 (file)
@@ -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;
        }