From e298cb72721e2c7743b1c1a6a9b1068e3f96d2cb Mon Sep 17 00:00:00 2001 From: Michal Bloch Date: Fri, 5 May 2023 20:47:36 +0200 Subject: [PATCH] dlog_logger: commonize reader threading facilities Change-Id: I1e48836dd71094512f8364c0d361dc131b178bf1 Signed-off-by: Michal Bloch --- src/logger/logger.c | 3 +-- src/logger/reader_common.c | 15 +++++++++++++++ src/logger/reader_common.h | 5 +++++ src/logger/reader_logger.c | 22 ++++------------------ src/logger/reader_logger.h | 3 +-- 5 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/logger/logger.c b/src/logger/logger.c index cca9295..5728e5c 100644 --- a/src/logger/logger.c +++ b/src/logger/logger.c @@ -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); } diff --git a/src/logger/reader_common.c b/src/logger/reader_common.c index c550194..aa93119 100644 --- a/src/logger/reader_common.c +++ b/src/logger/reader_common.c @@ -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) { diff --git a/src/logger/reader_common.h b/src/logger/reader_common.h index d0ebabe..40aef54 100644 --- a/src/logger/reader_common.h +++ b/src/logger/reader_common.h @@ -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); diff --git a/src/logger/reader_logger.c b/src/logger/reader_logger.c index e58845d..e390edd 100644 --- a/src/logger/reader_logger.c +++ b/src/logger/reader_logger.c @@ -7,6 +7,8 @@ #include #include +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; -} - diff --git a/src/logger/reader_logger.h b/src/logger/reader_logger.h index 2a4762d..93fd27d 100644 --- a/src/logger/reader_logger.h +++ b/src/logger/reader_logger.h @@ -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); + -- 2.7.4