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 \
--- /dev/null
+#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;
+}
+
--- /dev/null
+#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);
}
/**
- * @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
#include <queued_entry_timestamp.h>
#include <dlogutil-internal.h>
#include "qos.h"
+#include "fd_entity.h"
#ifdef __cplusplus
extern "C" {
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
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;
#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;
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);
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_);