for (size_t i = 0; i < QUEUES_CNT; i++)
queue_init(queues[i]);
- signal(SIGALRM, defer_alarm);
+ if (signal(SIGALRM, defer_alarm) == SIG_ERR) {
+ kr_log_error(DEFER, "Cannot set SIGALRM handler, interrupting of too long work on a single request will not work: %s\n",
+ strerror(errno));
+ }
defer_alarm(0);
return 0;
/// Start accounting work; optionally save state of current accounting.
/// Current state can be saved only after having an address assigned.
static inline void defer_sample_start(defer_sample_state_t *prev_state_out) {
- if (!defer) return;
+ if (!defer) {
+ if (prev_state_out) *prev_state_out = (defer_sample_state_t){ 0 }; // just to meet undefined-value check of linter, but never used
+ return;
+ }
uint64_t stamp = defer_get_stamp();
// suspend
return PROTOLAYER_EVENT_PROPAGATE;
defer_sample_state_t defer_prev_sample_state;
- if (session->outgoing)
+ const bool use_recursive_defer_sampling = session->outgoing; // make linter warning silent
+ if (use_recursive_defer_sampling)
defer_sample_start(&defer_prev_sample_state);
while (!session2_waitinglist_is_empty(session)) {
qry->flags.TCP = false;
}
qr_task_step(task, NULL, NULL);
- defer_sample_restart();
+ defer_sample_restart(); // use_recursive_defer_sampling == true
} else {
kr_assert(task->ctx->source.session == session);
task->ctx->source.session = NULL;
worker_task_unref(task);
}
- if (session->outgoing)
+ if (use_recursive_defer_sampling)
defer_sample_stop(&defer_prev_sample_state, true);
return PROTOLAYER_EVENT_PROPAGATE;