CHECK_PARAM(buffer < LOG_ID_MAX);
CHECK_PARAM(state->mode == DLOGUTIL_MODE_NONPRINTING);
+ assert(!state->enabled);
+
if (state->aliased[buffer] != LOG_ID_INVALID)
buffer = state->aliased[buffer];
for (int i = 0; i < state->fd_count; ++i)
- if (state->enabled[i] && state->data_fds[i]->id == buffer)
+ if (state->data_fds[i]->id == buffer)
return (state->data_fds[i]->ops->clear(state->data_fds[i])) ? TIZEN_ERROR_IO_ERROR : TIZEN_ERROR_NONE;
return TIZEN_ERROR_INVALID_PARAMETER;
CHECK_PARAM(buffer < LOG_ID_MAX);
CHECK_PARAM(state->mode == DLOGUTIL_MODE_NONPRINTING);
+ assert(!state->enabled);
+
if (state->aliased[buffer] != LOG_ID_INVALID)
buffer = state->aliased[buffer];
for (int i = 0; i < state->fd_count; ++i)
- if (state->enabled[i] && state->data_fds[i]->id == buffer)
+ if (state->data_fds[i]->id == buffer)
return (state->data_fds[i]->ops->get_capacity(state->data_fds[i], capacity)) ? TIZEN_ERROR_IO_ERROR : TIZEN_ERROR_NONE;
return TIZEN_ERROR_INVALID_PARAMETER;
CHECK_PARAM(buffer < LOG_ID_MAX);
CHECK_PARAM(state->mode == DLOGUTIL_MODE_NONPRINTING);
+ assert(!state->enabled);
+
if (state->aliased[buffer] != LOG_ID_INVALID)
buffer = state->aliased[buffer];
for (int i = 0; i < state->fd_count; ++i)
- if (state->enabled[i] && state->data_fds[i]->id == buffer)
+ if (state->data_fds[i]->id == buffer)
return (state->data_fds[i]->ops->get_usage(state->data_fds[i], usage)) ? TIZEN_ERROR_IO_ERROR : TIZEN_ERROR_NONE;
return TIZEN_ERROR_INVALID_PARAMETER;
return TIZEN_ERROR_NONE;
}
+static int state_prepare_single_print(dlogutil_state_s *state, int nfds)
+{
+ assert(state);
+ assert(state->mode != DLOGUTIL_MODE_NONPRINTING);
+
+ int r = state->data_fds[nfds]->ops->prepare_print(state->data_fds[nfds], state->dump_size, state->mode == DLOGUTIL_MODE_MONITOR, state->filter_object);
+ if (r < 0)
+ return TIZEN_ERROR_IO_ERROR;
+ if (r > 0) {
+ // everything went fine, but we're not printing this one
+ fdi_free(state->data_fds[nfds]);
+ state->data_fds[nfds] = NULL;
+ return TIZEN_ERROR_NONE;
+ }
+
+ int fd = state->data_fds[nfds]->fd;
+ r = fd_set_flags(fd, O_NONBLOCK);
+ if (r < 0)
+ return TIZEN_ERROR_IO_ERROR;
+ struct epoll_event ev = {
+ .data.ptr = state->data_fds[nfds],
+ .events = EPOLLIN,
+ };
+ state->enabled[nfds] = true;
+ epoll_ctl(state->epollfd, EPOLL_CTL_ADD, fd, &ev);
+ ++state->epoll_cnt;
+
+ return TIZEN_ERROR_NONE;
+}
+
+static int state_prepare_prints(dlogutil_state_s *state)
+{
+ assert(state);
+ assert(state->mode != DLOGUTIL_MODE_NONPRINTING);
+
+ state->enabled = calloc(state->fd_count, sizeof *state->enabled);
+ if (!state->enabled)
+ return TIZEN_ERROR_OUT_OF_MEMORY;
+
+ for (int nfds = 0; nfds < state->fd_count; ++nfds) {
+ int r = state_prepare_single_print(state, nfds);
+ if (r != TIZEN_ERROR_NONE)
+ return r;
+ }
+
+ return TIZEN_ERROR_NONE;
+}
+
int dlogutil_state_init(dlogutil_state_s *state, struct fd_info ***data_fds_ptr, int fd_count, dlogutil_config_s *config, bool sorting_needed, dlogutil_sorting_order_e real_sort_by, const struct log_config *conf, log_id_t aliased[LOG_ID_MAX])
{
assert(data_fds_ptr);
if (!sort_vector_finalize(&state->logs))
return TIZEN_ERROR_OUT_OF_MEMORY;
- state->enabled = calloc(fd_count, sizeof *state->enabled);
- if (!state->enabled)
- return TIZEN_ERROR_OUT_OF_MEMORY;
-
- for (int nfds = 0; nfds < fd_count; ++nfds) {
- if (state->mode == DLOGUTIL_MODE_NONPRINTING) {
- state->enabled[nfds] = true;
- continue;
- }
-
- int r = data_fds[nfds]->ops->prepare_print(data_fds[nfds], state->dump_size, state->mode == DLOGUTIL_MODE_MONITOR, state->filter_object);
- if (r < 0)
- return TIZEN_ERROR_IO_ERROR;
- if (r > 0) {
- // everything went fine, but we're not printing this one
- fdi_free(data_fds[nfds]);
- data_fds[nfds] = NULL;
- continue;
- }
- int fd = data_fds[nfds]->fd;
- r = fd_set_flags(fd, O_NONBLOCK);
- if (r < 0)
- return TIZEN_ERROR_IO_ERROR;
- struct epoll_event ev = {
- .data.ptr = data_fds[nfds],
- .events = EPOLLIN,
- };
- state->enabled[nfds] = true;
- epoll_ctl(state->epollfd, EPOLL_CTL_ADD, fd, &ev);
- ++state->epoll_cnt;
+ if (state->mode != DLOGUTIL_MODE_NONPRINTING) {
+ int r = state_prepare_prints(state);
+ if (r != TIZEN_ERROR_NONE)
+ return r;
}
state->evs = calloc(state->epoll_cnt, sizeof *state->evs);
static void remove_drained_buffers(dlogutil_state_s *state)
{
+ assert(state->enabled);
+
/* Instead of removing buffers when .read returns 0, we do it
* in a separate loop, using their .eof "method". This is because
* removing buffers that way would fail if EOF would be triggered