1 #include "reader_common.h"
3 #include "logger_internal.h"
4 #include "subreader_file.h"
5 #include "subreader_metrics.h"
9 static void close_reader_fd_entity(struct fd_entity *fde, struct epoll_metadata *emd)
14 remove_fd_entity(emd, fde);
18 static void reader_deinit_common(struct reader_common *reader)
20 list_clear_custom(&reader->subs, NULL, subreader_free);
22 close_reader_fd_entity(&reader->fd_entity_sink, &reader->server->epoll_common);
23 close_reader_fd_entity(&reader->fd_entity_source, &reader->server->epoll_common);
26 int reader_apply_log_to_subs(struct reader_common *reader, const struct dlogutil_entry *de)
28 const int ret = list_foreach_ret(reader->subs, (void *) de, subreader_apply_log);
32 void reader_common_init(struct reader_common *reader, struct logger *server)
34 reader->server = server;
35 init_fd_entity(&reader->fd_entity_sink , NULL, NULL);
36 init_fd_entity(&reader->fd_entity_source, NULL, NULL);
39 void subreader_free(void *_sub, void *userdata)
41 struct subreader_common *const sub = (struct subreader_common *) _sub;
43 assert(userdata == NULL);
45 sub->sub_destroy(sub->sub_userdata);
47 log_filter_free(sub->filter);
48 free(sub->sub_userdata);
51 int subreader_apply_log(void *_sub, void *userdata)
53 struct subreader_common *const sub = (struct subreader_common *) _sub;
56 const struct dlogutil_entry *const due = (const struct dlogutil_entry *) userdata;
59 if (!log_should_print_line(sub->filter, due))
62 return sub->sub_apply_log(sub, due);
65 int subreader_flush(void *_sub, void *userdata)
67 struct subreader_common *const sub = (struct subreader_common *) _sub;
69 assert(sub->sub_flush);
71 struct subreader_flush_args *const args = (struct subreader_flush_args *) userdata;
73 return sub->sub_flush(sub->sub_userdata, args->ts, args->flush_time);
76 void reader_add_sub(struct reader_common *reader, void *sub)
78 list_add(&reader->subs, sub);
81 void dispatch_event_reader(struct logger *server, struct epoll_event *event, void *userdata)
83 struct reader_common *const reader = (struct reader_common *) userdata;
86 if (event->events & (EPOLLHUP | EPOLLERR))
90 int r = get_now(&now);
94 r = reader->service_reader(reader, now);
96 /* This can happen for example if a pipe gets clogged,
97 * and is not necessarily a reason to remove the reader. */
106 int reader_flush(struct reader_common *reader, struct timespec now_mono, int flush)
108 return list_foreach_ret(reader->subs, &(struct subreader_flush_args) {
114 void reader_free(struct reader_common *reader)
119 reader_flush(reader, (struct timespec){0, 0}, 0);
121 reader->free_reader(reader);
122 reader_deinit_common(reader);
127 void reader_free_ptr(void *reader)
129 assert(reader); // to be used with attribute cleanup
130 reader_free(* ((struct reader_common **) reader));