struct channel *req, *res;
struct stream_interface *si_f, *si_b;
unsigned int rate;
- uint64_t cpu_time_before, cpu_time_after;
activity[tid].stream++;
si_sync_recv(si_f);
si_sync_recv(si_b);
- /* measure only the analysers' time */
- cpu_time_before = 0;
- if (task_profiling_mask & tid_bit)
- cpu_time_before = now_cpu_time();
-
redo:
rate = update_freq_ctr(&s->call_rate, 1);
if (rate >= 100000 && s->call_rate.prev_ctr) { // make sure to wait at least a full second
s->pending_events &= ~(TASK_WOKEN_TIMER | TASK_WOKEN_RES);
stream_release_buffers(s);
- /* We may have free'd some space in buffers, or have more to send/recv, try again */
-
- if (cpu_time_before) {
- cpu_time_after = now_cpu_time();
- cpu_time_after -= cpu_time_before;
- if (cpu_time_after >= 100000000U) {
- /* more than 1 ms CPU time spent in analysers is already absolutely
- * insane, but on tiny machines where performance doesn't matter it
- * may happen when using tons of regex, so let's fix the threshold
- * to 100ms which must never ever be hit.
- */
- stream_dump_and_crash(&s->obj_type, -(cpu_time_after / 1000));
- }
- }
return t; /* nothing more to do */
}
/* update time stats for this stream */
stream_update_time_stats(s);
- if (cpu_time_before) {
- cpu_time_after = now_cpu_time();
- cpu_time_after -= cpu_time_before;
- if (cpu_time_after >= 100000000U) {
- /* more than 1 ms CPU time spent in analysers is already absolutely
- * insane, but on tiny machines where performance doesn't matter it
- * may happen when using tons of regex, so let's fix the threshold
- * to 100ms which must never ever be hit.
- */
- stream_dump_and_crash(&s->obj_type, -(cpu_time_after / 1000));
- }
- }
-
/* the task MUST not be in the run queue anymore */
stream_free(s);
task_destroy(t);
}
/* dumps an error message for type <type> at ptr <ptr> related to stream <s>,
- * having reached loop rate <rate>, then aborts hoping to retrieve a core. If
- * <rate> is negative instead it reports a duration in microseconds.
+ * having reached loop rate <rate>, then aborts hoping to retrieve a core.
*/
void stream_dump_and_crash(enum obj_type *obj, int rate)
{
const struct stream *s;
- const char *fmt;
char *msg = NULL;
const void *ptr;
return;
}
- if (rate < 0) {
- fmt = "A bogus %s [%p] halted the whole thread for at least %d microseconds "
- "resulting in a complete freeze of all other tasks, aborting now! Please "
- "report this error to developers "
- "[%s]\n";
- rate = -rate;
- }
- else {
- fmt = "A bogus %s [%p] is spinning at %d calls per second and refuses to die, "
- "aborting now! Please report this error to developers "
- "[%s]\n";
- }
-
chunk_reset(&trash);
stream_dump(&trash, s, "", ' ');
- memprintf(&msg, fmt,
+ memprintf(&msg,
+ "A bogus %s [%p] is spinning at %d calls per second and refuses to die, "
+ "aborting now! Please report this error to developers "
+ "[%s]\n",
obj_type_name(obj), ptr, rate, trash.area);
ha_alert("%s", msg);