Move some fd_entity related stuff to separate file 82/241882/2
authorMateusz Majewski <m.majewski2@samsung.com>
Thu, 20 Aug 2020 11:07:32 +0000 (13:07 +0200)
committerMateusz Majewski <m.majewski2@samsung.com>
Thu, 20 Aug 2020 11:45:50 +0000 (13:45 +0200)
Change-Id: I27b219d11d6f909ea49dd984df3a3de8420d4140

Makefile.am
src/logger/fd_entity.c [new file with mode: 0644]
src/logger/fd_entity.h [new file with mode: 0644]
src/logger/logger.c
src/logger/logger_internal.h
src/logger/reader_pipe.h
src/tests/logger.c

index bb9121e..603988c 100644 (file)
@@ -125,6 +125,7 @@ dlog_logger_LDFLAGS = \
 dlog_logger_SOURCES = \
        external/sd-daemon/sd-daemon.c \
        src/logger/logger.c \
+       src/logger/fd_entity.c \
        src/logger/log_storage.c \
        src/logger/qos.c \
        src/logger/reader_pipe.c \
diff --git a/src/logger/fd_entity.c b/src/logger/fd_entity.c
new file mode 100644 (file)
index 0000000..5a09669
--- /dev/null
@@ -0,0 +1,129 @@
+#include "fd_entity.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/**
+ * @brief Add given FD entity to logger event notification
+ * @details Uses epoll mechanism for notification of events
+ * @param[in] logger server owning epoll main loop
+ * @param[in] fd_entity file descriptor entity
+ * @return 0 on success, -errno on failure
+ */
+int add_fd_entity(struct epoll_metadata *metadata, struct fd_entity *fd_entity)
+{
+       assert(metadata);
+       assert(fd_entity);
+
+       int r = epoll_ctl(metadata->fd, EPOLL_CTL_ADD, fd_entity->fd, &fd_entity->event);
+       if (r < 0)
+               return -errno;
+
+       ++metadata->cnt;
+       return 0;
+}
+
+/**
+ * @brief Modify given FD entity to logger event notification
+ * @details Uses epoll mechanism for notification of events
+ * @param[in] logger server owning epoll main loop
+ * @param[in] fd_entity file descriptor entity
+ * @param[in] wanted_mask wanted event mask
+ * @return 0 on success, -errno on failure
+ */
+int modify_fd_entity(const struct epoll_metadata *metadata, struct fd_entity *fd_entity, int wanted_mask)
+{
+       assert(metadata);
+       assert(fd_entity);
+
+       if (fd_entity->fd < 0)
+               return -EINVAL;
+
+       uint32_t pre = fd_entity->event.events;
+       if (pre == wanted_mask)
+               return 0;
+       fd_entity->event.events = wanted_mask;
+
+       if (epoll_ctl(metadata->fd, EPOLL_CTL_MOD, fd_entity->fd, &fd_entity->event) < 0) {
+               fd_entity->event.events = pre;
+               return -errno;
+       }
+       return 0;
+}
+
+/**
+ * @brief Remove given FD entity from logger event notification
+ * @details Uses epoll mechanism for notification of events
+ * @param[in] logger server owning epoll main loop
+ * @param[in] fd_entity file descriptor entity
+ * @return 0 on success, else -errno
+ */
+int remove_fd_entity(struct epoll_metadata *metadata, struct fd_entity *fd_entity)
+{
+       assert(metadata);
+       assert(fd_entity);
+
+       int r = epoll_ctl(metadata->fd, EPOLL_CTL_DEL, fd_entity->fd, NULL);
+       if (r < 0)
+               return -errno;
+
+       --metadata->cnt;
+
+       assert(metadata->cnt >= 0);
+       return 0;
+}
+
+/**
+ * @brief Init fd entity to call given function with user data on event
+ * @details Initializes dispatch_event callback and user_data pointer
+ * @param[in] fd_entity file descriptor entity to initialize
+ * @param[in] dispatch_event callback function to dispatch an event to
+ * @param[in] user_data pointer to data to place in event structure when dispatch event is called
+ */
+void init_fd_entity(struct fd_entity *fd_entity, dispatch_event_t dispatch_event, void *user_data)
+{
+       assert(fd_entity);
+       *fd_entity = (struct fd_entity) {
+               .dispatch_event = dispatch_event,
+               .dispatch_data = user_data,
+               .event = (struct epoll_event) {
+                       .data = (epoll_data_t) { .ptr = fd_entity },
+                       .events = 0
+               },
+               .fd = -1
+       };
+}
+
+/**
+ * @brief Set file descriptor to epoll entity for ready to read events
+ * @details Initializes fd and events mask in epoll entity
+ * @param[in] fd_entity file descriptor entity to initialize
+ * @param[in] fd file descriptor to set the entity with
+ */
+void set_read_fd_entity(struct fd_entity *fd_entity, int fd)
+{
+       assert(fd_entity);
+       assert(fd >= 0);
+       fd_entity->event.events = EPOLLIN;
+       fd_entity->fd = fd;
+}
+
+/**
+ * @brief Set file descriptor to epoll entity for ready to write events
+ * @details Initializes fd and events mask in epoll entity
+ * @param[in] fd_entity file descriptor entity to initialize
+ * @param[in] fd file descriptor to set the entity with
+ */
+void set_write_fd_entity(struct fd_entity *fd_entity, int fd)
+{
+       assert(fd_entity);
+       assert(fd >= 0);
+
+       fd_entity->event.events = EPOLLHUP; /* not EPOLLOUT - readers start dormant,
+                                            * get written to in atomic-like chunks,
+                                            * and only temporarily use EPOLLOUT if
+                                            * their pipe gets clogged mid-chunk */
+       fd_entity->fd = fd;
+}
+
diff --git a/src/logger/fd_entity.h b/src/logger/fd_entity.h
new file mode 100644 (file)
index 0000000..11fd18c
--- /dev/null
@@ -0,0 +1,32 @@
+#include <sys/epoll.h>
+
+struct logger; // TODO: Change into a relevant include (but not logger_internal.h)
+
+struct epoll_metadata {
+       int fd;
+       unsigned cnt;
+       unsigned events_size;
+       struct epoll_event *events;
+};
+
+/**
+ * @brief Event handler
+ * @details Receives and handles an event
+ * @param[in] server The logger server
+ * @param[in] event The received event
+ */
+typedef void (*dispatch_event_t)(struct logger *server, struct epoll_event *event, void *userdata);
+
+struct fd_entity {
+       dispatch_event_t dispatch_event;
+       void *dispatch_data;
+       struct epoll_event event;
+       int fd;
+};
+
+int add_fd_entity(struct epoll_metadata *metadata, struct fd_entity *fd_entity);
+int modify_fd_entity(const struct epoll_metadata *metadata, struct fd_entity *fd_entity, int wanted_mask);
+int remove_fd_entity(struct epoll_metadata *metadata, struct fd_entity *fd_entity);
+void init_fd_entity(struct fd_entity *fd_entity, dispatch_event_t dispatch_event, void *user_data);
+void set_read_fd_entity(struct fd_entity *fd_entity, int fd);
+void set_write_fd_entity(struct fd_entity *fd_entity, int fd);
index 57a5e7d..76a22d1 100644 (file)
@@ -228,129 +228,6 @@ failure:
 }
 
 /**
- * @brief Add given FD entity to logger event notification
- * @details Uses epoll mechanism for notification of events
- * @param[in] logger server owning epoll main loop
- * @param[in] fd_entity file descriptor entity
- * @return 0 on success, -errno on failure
- */
-int add_fd_entity(struct epoll_metadata *metadata, struct fd_entity *fd_entity)
-{
-       assert(metadata);
-       assert(fd_entity);
-
-       int r = epoll_ctl(metadata->fd, EPOLL_CTL_ADD, fd_entity->fd, &fd_entity->event);
-       if (r < 0)
-               return -errno;
-
-       ++metadata->cnt;
-       return 0;
-}
-
-/**
- * @brief Modify given FD entity to logger event notification
- * @details Uses epoll mechanism for notification of events
- * @param[in] logger server owning epoll main loop
- * @param[in] fd_entity file descriptor entity
- * @param[in] wanted_mask wanted event mask
- * @return 0 on success, -errno on failure
- */
-int modify_fd_entity(const struct epoll_metadata *metadata, struct fd_entity *fd_entity, int wanted_mask)
-{
-       assert(metadata);
-       assert(fd_entity);
-
-       if (fd_entity->fd < 0)
-               return -EINVAL;
-
-       uint32_t pre = fd_entity->event.events;
-       if (pre == wanted_mask)
-               return 0;
-       fd_entity->event.events = wanted_mask;
-
-       if (epoll_ctl(metadata->fd, EPOLL_CTL_MOD, fd_entity->fd, &fd_entity->event) < 0) {
-               fd_entity->event.events = pre;
-               return -errno;
-       }
-       return 0;
-}
-
-/**
- * @brief Remove given FD entity from logger event notification
- * @details Uses epoll mechanism for notification of events
- * @param[in] logger server owning epoll main loop
- * @param[in] fd_entity file descriptor entity
- * @return 0 on success, else -errno
- */
-int remove_fd_entity(struct epoll_metadata *metadata, struct fd_entity *fd_entity)
-{
-       assert(metadata);
-       assert(fd_entity);
-
-       int r = epoll_ctl(metadata->fd, EPOLL_CTL_DEL, fd_entity->fd, NULL);
-       if (r < 0)
-               return -errno;
-
-       --metadata->cnt;
-
-       assert(metadata->cnt >= 0);
-       return 0;
-}
-
-/**
- * @brief Init fd entity to call given function with user data on event
- * @details Initializes dispatch_event callback and user_data pointer
- * @param[in] fd_entity file descriptor entity to initialize
- * @param[in] dispatch_event callback function to dispatch an event to
- * @param[in] user_data pointer to data to place in event structure when dispatch event is called
- */
-void init_fd_entity(struct fd_entity *fd_entity, dispatch_event_t dispatch_event, void *user_data)
-{
-       assert(fd_entity);
-       *fd_entity = (struct fd_entity) {
-               .dispatch_event = dispatch_event,
-               .dispatch_data = user_data,
-               .event = (struct epoll_event) {
-                       .data = (epoll_data_t) { .ptr = fd_entity },
-                       .events = 0
-               },
-               .fd = -1
-       };
-}
-
-/**
- * @brief Set file descriptor to epoll entity for ready to read events
- * @details Initializes fd and events mask in epoll entity
- * @param[in] fd_entity file descriptor entity to initialize
- * @param[in] fd file descriptor to set the entity with
- */
-void set_read_fd_entity(struct fd_entity *fd_entity, int fd)
-{
-       assert(fd_entity);
-       assert(fd >= 0);
-       fd_entity->event.events = EPOLLIN;
-       fd_entity->fd = fd;
-}
-
-/**
- * @brief Set file descriptor to epoll entity for ready to write events
- * @details Initializes fd and events mask in epoll entity
- * @param[in] fd_entity file descriptor entity to initialize
- * @param[in] fd file descriptor to set the entity with
- */
-void set_write_fd_entity(struct fd_entity *fd_entity, int fd)
-{
-       assert(fd_entity);
-       assert(fd >= 0);
-
-       fd_entity->event.events = EPOLLHUP; /* not EPOLLOUT - readers start dormant,
-                                            * get written to in atomic-like chunks,
-                                            * and only temporarily use EPOLLOUT if
-                                            * their pipe gets clogged mid-chunk */
-       fd_entity->fd = fd;
-}
-
-/**
  * @brief Create a writer
  * @details Create a writer structure
  * @param[out] writer The newly-allocated writer
index 0756f5a..0f22385 100644 (file)
@@ -30,6 +30,7 @@
 #include <queued_entry_timestamp.h>
 #include <dlogutil-internal.h>
 #include "qos.h"
+#include "fd_entity.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -86,21 +87,6 @@ struct reader;
 struct log_buffer;
 
 /**
- * @brief Event handler
- * @details Receives and handles an event
- * @param[in] server The logger server
- * @param[in] event The received event
- */
-typedef void (*dispatch_event_t)(struct logger *server, struct epoll_event *event, void *userdata);
-
-struct fd_entity {
-       dispatch_event_t dispatch_event;
-       void *dispatch_data;
-       struct epoll_event event;
-       int fd;
-};
-
-/**
  * @brief Service a writer
  * @details Specific handler that event is delegated to, according to writers type
  * @param[in] server The logger server
@@ -210,13 +196,6 @@ struct buf_params {
        int time;
 };
 
-struct epoll_metadata {
-       int fd;
-       unsigned cnt;
-       unsigned events_size;
-       struct epoll_event *events;
-};
-
 struct logger {
        struct epoll_metadata epoll_common;
        struct epoll_metadata epoll_socket;
index cb31c6a..6a6993b 100644 (file)
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "logger_internal.h" // for struct reader
+#include "logger_internal.h" // for struct reader; TODO: We don't want to include it...
 
 struct reader_pipe {
        struct log_buffer *buf_ptr;
index d665fe0..34c9992 100644 (file)
@@ -17,9 +17,6 @@ int listen_fd_create(const char *path, int permissions);
 int systemd_sock_get(const char *path, int type);
 int dev_log_sock_get();
 int dev_log_sock_create();
-void init_fd_entity(struct fd_entity *fd_entity, dispatch_event_t dispatch_event, void *user_data);
-void set_read_fd_entity(struct fd_entity *fd_entity, int fd);
-void set_write_fd_entity(struct fd_entity *fd_entity, int fd);
 int writer_create(struct writer **writer, int fd, struct log_buffer *log_buffer, service_writer_t service_writer, service_socket_t service_socket);
 void dispatch_event_writer(struct logger *server, struct epoll_event *event, void *userdata);
 int create_kmsg_writer(struct writer **writer, struct log_buffer *log_buffer);
@@ -31,13 +28,13 @@ int socket_initialize(struct sock_data *sock, struct log_buffer *buffer, service
 void dispatch_event_sock(struct logger *server, struct epoll_event *event, void *userdata);
 void socket_close(struct sock_data *sock);
 uint64_t reader_buffered_space(const struct reader_pipe *reader);
+int reader_is_bufferable(const struct reader_pipe *reader);
+int reader_ms_since(const struct reader_pipe *reader, struct timespec *ts);
+int reader_should_buffer(struct reader_pipe *reader, const struct buf_params *buf_params, struct timespec now);
 void reader_pipe_free(struct reader_pipe *reader);
 int buffer_append(const dlogutil_entry_s *entry, struct log_buffer *b);
 int print_out_logs(struct reader_pipe *reader, struct now_t time);
 int service_reader_file(struct reader_logger *reader, struct now_t time);
-int add_fd_entity(struct epoll_metadata *md, struct fd_entity *fd_entity);
-int modify_fd_entity(const struct epoll_metadata *md, struct fd_entity *fd_entity, int wanted_mask);
-int remove_fd_entity(struct epoll_metadata *md, struct fd_entity *fd_entity);
 void writer_close_fd(struct logger* server, struct writer* wr);
 int add_buffer_reader(struct log_buffer *buffer, struct reader_pipe *reader);
 void reader_notify_losing_log(const dlogutil_entry_s *le, void *reader_);