* @param[in] fd_entity file descriptor entity
* @return 0 on success, -errno on failure
*/
-int add_fd_entity(struct logger *logger, struct fd_entity *fd_entity)
+int add_fd_entity(struct epoll_metadata *metadata, struct fd_entity *fd_entity)
{
- assert(logger);
+ assert(metadata);
assert(fd_entity);
- int r = epoll_ctl(logger->epoll_common.fd, EPOLL_CTL_ADD, fd_entity->fd, &fd_entity->event);
+ int r = epoll_ctl(metadata->fd, EPOLL_CTL_ADD, fd_entity->fd, &fd_entity->event);
if (r < 0)
return -errno;
- ++logger->epoll_common.cnt;
+ ++metadata->cnt;
return 0;
}
* @param[in] wanted_mask wanted event mask
* @return 0 on success, -errno on failure
*/
-int modify_fd_entity(const struct logger *logger, struct fd_entity *fd_entity, int wanted_mask)
+int modify_fd_entity(const struct epoll_metadata *metadata, struct fd_entity *fd_entity, int wanted_mask)
{
- assert(logger);
+ assert(metadata);
assert(fd_entity);
if (fd_entity->fd < 0)
return 0;
fd_entity->event.events = wanted_mask;
- if (epoll_ctl(logger->epoll_common.fd, EPOLL_CTL_MOD, fd_entity->fd, &fd_entity->event) < 0) {
+ if (epoll_ctl(metadata->fd, EPOLL_CTL_MOD, fd_entity->fd, &fd_entity->event) < 0) {
fd_entity->event.events = pre;
return -errno;
}
* @param[in] fd_entity file descriptor entity
* @return 0 on success, else -errno
*/
-int remove_fd_entity(struct logger *logger, struct fd_entity *fd_entity)
+int remove_fd_entity(struct epoll_metadata *metadata, struct fd_entity *fd_entity)
{
- assert(logger);
- assert(logger->epoll_common.cnt > 0);
+ assert(metadata);
+ assert(metadata->cnt > 0);
assert(fd_entity);
- int r = epoll_ctl(logger->epoll_common.fd, EPOLL_CTL_DEL, fd_entity->fd, NULL);
+ int r = epoll_ctl(metadata->fd, EPOLL_CTL_DEL, fd_entity->fd, NULL);
if (r < 0)
return -errno;
- --logger->epoll_common.cnt;
+ --metadata->cnt;
return 0;
}
struct logger *logger = (struct logger *)user_data;
assert(reader);
if (reader->fd_entity_sink.fd >= 0)
- remove_fd_entity(logger, &reader->fd_entity_sink);
+ remove_fd_entity(&logger->epoll_common, &reader->fd_entity_sink);
if (reader->fd_entity_source.fd >= 0)
- remove_fd_entity(logger, &reader->fd_entity_source);
+ remove_fd_entity(&logger->epoll_common, &reader->fd_entity_source);
reader_free(reader);
return true;
}
void writer_close_fd(struct logger* server, struct writer* wr)
{
assert(wr);
- remove_fd_entity(server, &wr->fd_entity);
+ remove_fd_entity(&server->epoll_common, &wr->fd_entity);
close(wr->fd_entity.fd);
}
* buffers - is not a problem here because the daemon is not
* supposed to ever stop writing to files. */
- int r = add_fd_entity(server, &reader->fd_entity_sink);
+ int r = add_fd_entity(&server->epoll_common, &reader->fd_entity_sink);
if (r < 0)
return r;
}
}
assert(reader->fd_entity_source.fd >= 0);
- ret = add_fd_entity(server, &reader->fd_entity_source);
+ ret = add_fd_entity(&server->epoll_common, &reader->fd_entity_source);
if (ret < 0)
goto failure;
if (!list_add(&server->extra_readers, reader)) {
- remove_fd_entity(server, &reader->fd_entity_source);
+ remove_fd_entity(&server->epoll_common, &reader->fd_entity_source);
ret = -ENOMEM;
goto failure;
}
failure:
if (reader->fd_entity_sink.fd >= 0)
- remove_fd_entity(server, &reader->fd_entity_sink);
+ remove_fd_entity(&server->epoll_common, &reader->fd_entity_sink);
return ret;
}
return -ENOENT;
set_read_fd_entity(&reader->fd_entity_source, read_fd);
- ret = add_fd_entity(server, &reader->fd_entity_source);
+ ret = add_fd_entity(&server->epoll_common, &reader->fd_entity_source);
if (ret < 0) {
close(read_fd);
return ret;
struct fd_entity pipe_entity = wr->fd_entity;
set_read_fd_entity(&pipe_entity, pipe_fd[0]);
- r = add_fd_entity(server, &pipe_entity);
+ r = add_fd_entity(&server->epoll_common, &pipe_entity);
if (r < 0)
goto err_close;
return 0;
err_remove:
- remove_fd_entity(server, &pipe_entity);
+ remove_fd_entity(&server->epoll_common, &pipe_entity);
err_close:
close(pipe_fd[0]);
if (r > 0) {
if (reader->fd_entity_sink.fd >= 0)
- remove_fd_entity(logger, &reader->fd_entity_sink);
+ remove_fd_entity(&logger->epoll_common, &reader->fd_entity_sink);
if (reader->fd_entity_source.fd >= 0)
- remove_fd_entity(logger, &reader->fd_entity_source);
+ remove_fd_entity(&logger->epoll_common, &reader->fd_entity_source);
reader_free(reader);
return true;
}
* logs to trigger the flush and so any FDs representing connections
* to such buffer would leak until a log finally arrived (which could
* be never). This is why waiting is also done on EPOLLHUP. */
- if (modify_fd_entity(logger, &reader->fd_entity_sink, (r == 0) ? EPOLLOUT : EPOLLHUP) < 0) {
+ if (modify_fd_entity(&logger->epoll_common, &reader->fd_entity_sink, (r == 0) ? EPOLLOUT : EPOLLHUP) < 0) {
/* ignore, can't really happen and it's not
* like we can do anything about it either */
}
list_remove(&reader->buf_ptr->readers, reader);
list_remove(&server->extra_readers, reader);
if (reader->fd_entity_sink.fd >= 0)
- remove_fd_entity(server, &reader->fd_entity_sink);
+ remove_fd_entity(&server->epoll_common, &reader->fd_entity_sink);
if (reader->fd_entity_source.fd >= 0)
- remove_fd_entity(server, &reader->fd_entity_source);
+ remove_fd_entity(&server->epoll_common, &reader->fd_entity_source);
reader_free(reader);
return;
}
int r = reader->service_reader(reader);
if (r != 0) {
if (reader->fd_entity_sink.fd >= 0)
- remove_fd_entity(server, &reader->fd_entity_sink);
+ remove_fd_entity(&server->epoll_common, &reader->fd_entity_sink);
if (reader->fd_entity_source.fd >= 0)
- remove_fd_entity(server, &reader->fd_entity_source);
+ remove_fd_entity(&server->epoll_common, &reader->fd_entity_source);
}
}
assert(wr);
list_add(&l->writers, wr);
- add_fd_entity(l, &wr->fd_entity);
+ add_fd_entity(&l->epoll_common, &wr->fd_entity);
}
int epoll_metadata_initialize(struct epoll_metadata *metadata)
for (log_id_t id = 0; id < LOG_ID_MAX; id++)
if (l->buffers[id]) {
- add_fd_entity(l, &l->buffers[id]->sock_ctl.fd_entity);
- add_fd_entity(l, &l->buffers[id]->sock_wr.fd_entity);
+ add_fd_entity(&l->epoll_common, &l->buffers[id]->sock_ctl.fd_entity);
+ add_fd_entity(&l->epoll_common, &l->buffers[id]->sock_wr.fd_entity);
}
/* TODO: make writers creation optional/configurable */