dlog_logger: commonize reader threading facilities 74/292474/4
authorMichal Bloch <m.bloch@samsung.com>
Fri, 5 May 2023 18:47:36 +0000 (20:47 +0200)
committerMichal Bloch <m.bloch@samsung.com>
Wed, 9 Aug 2023 13:57:28 +0000 (15:57 +0200)
Change-Id: I1e48836dd71094512f8364c0d361dc131b178bf1
Signed-off-by: Michal Bloch <m.bloch@samsung.com>
src/logger/logger.c
src/logger/reader_common.c
src/logger/reader_common.h
src/logger/reader_logger.c
src/logger/reader_logger.h

index cca9295..5728e5c 100644 (file)
@@ -1052,7 +1052,7 @@ static int finalize_init(struct logger_config_data *data, struct logger *server)
                        continue;
                }
 
-               r = reader_logger_run(reader);
+               r = reader_run(&reader->common);
                if (r < 0) {
                        reader_free(&reader->common);
                        g_backend.logger_readers[id] = NULL;
@@ -1260,7 +1260,6 @@ int main(int argc, char **argv)
                struct reader_logger *const reader = g_backend.logger_readers[id];
                if (!reader)
                        continue;
-               pthread_join(reader->thread, NULL);
                reader_free(&reader->common);
        }
 
index c550194..aa93119 100644 (file)
@@ -17,6 +17,9 @@ static void close_reader_fd_entity(struct fd_entity *fde, struct epoll_metadata
 
 static void reader_deinit_common(struct reader_common *reader)
 {
+       if (reader->thread)
+               pthread_join(reader->thread, NULL);
+
        list_clear_custom(&reader->subs, NULL, subreader_free);
 
        if (reader->server) {
@@ -34,6 +37,7 @@ int reader_apply_log_to_subs(struct reader_common *reader, const struct dlogutil
 void reader_common_init(struct reader_common *reader, struct logger *server)
 {
        reader->server = server;
+       reader->thread = 0;
        init_fd_entity(&reader->fd_entity_sink  , NULL, NULL);
        init_fd_entity(&reader->fd_entity_source, NULL, NULL);
 }
@@ -105,6 +109,17 @@ reader_free:
        reader_free(reader);
 }
 
+int reader_run(struct reader_common *const reader)
+{
+       pthread_t thread;
+       int r = pthread_create(&thread, NULL, reader->thread_func, reader);
+       if (r < 0)
+               return r;
+
+       reader->thread = thread;
+       return 0;
+}
+
 int reader_flush(struct reader_common *reader, struct timespec now_mono, int flush)
 {
        return list_foreach_ret(reader->subs, &(struct subreader_flush_args) {
index d0ebabe..40aef54 100644 (file)
@@ -40,6 +40,10 @@ struct reader_common {
        struct fd_entity fd_entity_sink;
        struct fd_entity fd_entity_source;
        struct logger *server;
+
+       pthread_t thread; // note, pthread id, not the same as OS tid!
+       void *(*thread_func)(void *userdata);
+
        list_head subs;
        int (*service_reader) (struct reader_common *_reader, struct now_t time);
        void (*free_reader) (struct reader_common *reader);
@@ -65,6 +69,7 @@ void reader_add_sub(struct reader_common *reader, void *sub);
 void reader_common_init(struct reader_common *reader, struct logger *server);
 int reader_apply_log_to_subs(struct reader_common *reader, const struct dlogutil_entry *de);
 void dispatch_event_reader(struct logger *server, struct epoll_event *event, void *userdata);
+int reader_run(struct reader_common *const reader);
 
 void subreader_free(void *sub, void *userdata);
 int subreader_apply_log(void *sub, void *userdata);
index e58845d..e390edd 100644 (file)
@@ -7,6 +7,8 @@
 #include <assert.h>
 #include <poll.h>
 
+static void *reader_logger_thread(void *userdata);
+
 static void free_reader_logger(struct reader_common *_reader)
 {
        struct reader_logger *const reader = (struct reader_logger *) _reader;
@@ -16,11 +18,6 @@ static void free_reader_logger(struct reader_common *_reader)
 
        if (reader->device_fd != -1)
                close(reader->device_fd);
-
-       /* We don't do `pthread_cancel(reader->thread);`, the thread should
-        * end on its own (there's some external cleanup involved anyway).
-        * At the moment the thread assumes the reader is permanent and only
-        * closes when the whole program does, which is approximately true. */
 }
 
 static void handle_single_log(struct reader_logger *reader, struct now_t time, int read_count)
@@ -108,8 +105,8 @@ static struct reader_logger *reader_logger_alloc(struct logger *server)
        reader_common_init(&ret->common, server);
 
        ret->device_fd = -1;
-       ret->thread = 0;
        ret->buf_id = LOG_ID_INVALID;
+       ret->common.thread_func = reader_logger_thread;
        ret->common.service_reader = service_reader_logger;
        ret->common.free_reader = free_reader_logger;
 
@@ -158,7 +155,7 @@ static void service_and_maybe_flush(struct reader_logger *const reader)
        (void) reader_flush(&reader->common, now.mono, reader->common.server->buf_params.time);
 }
 
-static void *reader_thread(void *userdata)
+static void *reader_logger_thread(void *userdata)
 {
        struct reader_logger *reader = (struct reader_logger *) userdata;
 
@@ -191,14 +188,3 @@ static void *reader_thread(void *userdata)
        return NULL;
 }
 
-int reader_logger_run(struct reader_logger *reader)
-{
-       pthread_t thread;
-       int r = pthread_create(&thread, NULL, reader_thread, reader);
-       if (r < 0)
-               return r;
-
-       reader->thread = thread;
-       return 0;
-}
-
index 2a4762d..93fd27d 100644 (file)
@@ -6,7 +6,6 @@
 
 struct reader_logger {
        struct reader_common common;
-       pthread_t thread; // note, pthread id, not the same as OS tid!
        int device_fd;
        log_id_t buf_id;
        int skip_count;
@@ -17,4 +16,4 @@ struct reader_logger {
 };
 
 int reader_logger_init(struct reader_logger **reader, log_id_t buf_id, struct logger *server, bool skip);
-int reader_logger_run(struct reader_logger *reader);
+