return best_fdi;
}
-enum {
- ALL_BUFFERS_EMPTY = 1,
- BUFFER_NEWLY_DRAINED = 2,
-};
-int put_logs_into_vector(struct fd_info **data_fds, int fd_count, struct sort_vector *logs, dlogutil_filter_options_s *filter, dlogutil_entry_s **entry_out)
+int put_logs_into_vector(struct fd_info **data_fds, int fd_count, struct sort_vector *logs, dlogutil_filter_options_s *filter, bool *at_least_one_buffer_drained, bool *all_buffers_empty, dlogutil_entry_s **entry_out)
{
assert(data_fds);
assert(logs);
struct fd_info *best_fdi;
do {
best_fdi = find_earliest_log(data_fds, fd_count, logs->sort_by);
- if (!best_fdi)
- return ALL_BUFFERS_EMPTY;
+ if (!best_fdi) {
+ *all_buffers_empty = true;
+ *at_least_one_buffer_drained = true;
+ return 0;
+ }
int r = fdi_push_log(best_fdi, logs, entry_out, filter);
if (r)
return r;
if (*entry_out) {
- if (!is_limited_dumping(logs))
- return best_fdi->ops->has_log(best_fdi) ? 0 : BUFFER_NEWLY_DRAINED;
+ if (!is_limited_dumping(logs)) {
+ if (!best_fdi->ops->has_log(best_fdi))
+ *at_least_one_buffer_drained = true;
+ return 0;
+ }
free(*entry_out);
*entry_out = NULL;
}
} while (best_fdi->ops->has_log(best_fdi)); // if a buffer got drained, break to give them all a chance to refill
- return BUFFER_NEWLY_DRAINED;
+ *at_least_one_buffer_drained = true;
+ return 0;
}
int dlogutil_state_init(dlogutil_state_s *state, struct fd_info ***data_fds_ptr, int fd_count, unsigned int mode, bool monitor,
state->fd_count = fd_count;
state->data_fds = data_fds;
state->monitor = monitor;
+ state->need_epoll = true;
*data_fds_ptr = NULL;
sort_vector_init(&state->logs);
state->filter_object = filter ? log_filter_from_filter(filter) : dlogutil_filter_options_create();
if (handle_flush(state, out))
return 0;
- int r = put_logs_into_vector(state->data_fds, state->fd_count, &state->logs, state->filter_object, out);
+ bool all_buffers_empty = false;
+ state->need_epoll = false;
+ int r = put_logs_into_vector(state->data_fds, state->fd_count, &state->logs, state->filter_object, &state->need_epoll, &all_buffers_empty, out);
if (r < 0)
return r;
int refill_err = 0;
- if (r == BUFFER_NEWLY_DRAINED
- || r == ALL_BUFFERS_EMPTY)
+ if (state->need_epoll)
refill_err = refill_fdi_buffers(state, timeout);
if (*out)
if (refill_err)
return refill_err;
- set_flush_target(state, r == ALL_BUFFERS_EMPTY);
+ set_flush_target(state, all_buffers_empty);
remove_drained_buffers(state);
}
int r;
- do
- r = put_logs_into_vector(state->data_fds, state->fd_count, &state->logs, state->filter_object, out);
- while (r == BUFFER_NEWLY_DRAINED && !*out);
+ bool all_buffers_empty;
+ do {
+ all_buffers_empty = false;
+ r = put_logs_into_vector(state->data_fds, state->fd_count, &state->logs, state->filter_object, &state->need_epoll, &all_buffers_empty, out);
+ } while (r == 0 && !all_buffers_empty && !*out);
if (r < 0)
return r;
if (*out)
bool process_log(const dlogutil_entry_s *e, struct timespec reference_ts, dlogutil_sorting_order_e stamp_type, long timeout, int *callback_ret);
struct fd_info *find_earliest_log(struct fd_info **data_fds, int fd_count, dlogutil_sorting_order_e sort_by);
-int put_logs_into_vector(struct fd_info **data_fds, int fd_count, struct sort_vector *logs, dlogutil_filter_options_s *filter, dlogutil_entry_s **entry_out);
+int put_logs_into_vector(struct fd_info **data_fds, int fd_count, struct sort_vector *logs, dlogutil_filter_options_s *filter, bool *need_epoll, bool *any_drained, dlogutil_entry_s **entry_out);
int __wrap_clock_gettime(clockid_t clk_id, struct timespec *tp)
{
sort_vector_pop(&sv);
dlogutil_entry_s *vector_overflown = NULL;
- assert(put_logs_into_vector(fds, 0, &sv, (dlogutil_filter_options_s *)0xEEE, &vector_overflown) == 1);
+ bool need_epoll = false, all_drained = false;
+ assert(put_logs_into_vector(fds, 0, &sv, (dlogutil_filter_options_s *)0xEEE, &need_epoll, &all_drained, &vector_overflown) == 0);
assert(!vector_overflown);
+ assert(all_drained);
+ assert(need_epoll);
fdi_push_log_ret = -EIO;
- assert(put_logs_into_vector(fds, 10, &sv, (dlogutil_filter_options_s *)0xEEE, &vector_overflown) == -EIO);
+ assert(put_logs_into_vector(fds, 10, &sv, (dlogutil_filter_options_s *)0xEEE, &need_epoll, &all_drained, &vector_overflown) == -EIO);
assert(!vector_overflown);
fdi_push_log_ret = 0;
- assert(put_logs_into_vector(fds, 10, &sv, (dlogutil_filter_options_s *)0xEEE, &vector_overflown) == 2);
+ all_drained = false;
+ need_epoll = false;
+ assert(put_logs_into_vector(fds, 10, &sv, (dlogutil_filter_options_s *)0xEEE, &need_epoll, &all_drained, &vector_overflown) == 0);
assert(!vector_overflown);
assert(sort_vector_used_size(&sv) == 1);
+ assert(!all_drained);
+ assert(need_epoll);
sort_vector_free(&sv);
}