1#include "internal.h"
2
3#include <nightmare/record.h>
4#include <sch/sched.h>
5
6#ifdef TEST_NIGHTMARE_ENABLED
7struct test_liveness_state nightmare_liveness;
8
9bool nightmare_liveness_start(time_ms_t threshold_ms,
10 enum test_on_stall policy) {
11 return test_liveness_start(state: &nightmare_liveness, conc: &nightmare_runtime.conc,
12 threshold_ms, policy);
13}
14
15void nightmare_liveness_stop(void) {
16 test_liveness_stop(state: &nightmare_liveness);
17}
18
19void nightmare_report_stall(const struct test_stall_evidence *evidence) {
20 if (!evidence)
21 return;
22 NIGHTMARE_FINDING_TIER("stall", NIGHTMARE_TIER_AMBIGUOUS, 0,
23 "silent_ms=%lu progress=%lu",
24 (unsigned long) evidence->silent_ms,
25 (unsigned long) evidence->progress);
26 nightmare_publish_stop(reason: TEST_STOP_STALL);
27}
28
29void nightmare_liveness_poll(void) {
30 struct test_stall_evidence evidence;
31 if (test_liveness_take(state: &nightmare_liveness, out: &evidence)) {
32 nightmare_report_stall(evidence: &evidence);
33 if (nightmare_liveness.policy != TEST_ON_STALL_REPORT)
34 nightmare_panic("aggregate nightmare progress stalled");
35 }
36
37 if (nightmare_runtime.ctx.nm && nightmare_runtime.ctx.nm->ops &&
38 nightmare_runtime.ctx.nm->ops->probe) {
39 nightmare_runtime.ctx.nm->ops->probe(&nightmare_runtime.ctx);
40 }
41}
42#endif
43