| 1 | #include "internal.h" |
| 2 | |
| 3 | #include <nightmare/record.h> |
| 4 | #include <sch/sched.h> |
| 5 | |
| 6 | #ifdef TEST_NIGHTMARE_ENABLED |
| 7 | struct test_liveness_state nightmare_liveness; |
| 8 | |
| 9 | bool 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 | |
| 15 | void nightmare_liveness_stop(void) { |
| 16 | test_liveness_stop(state: &nightmare_liveness); |
| 17 | } |
| 18 | |
| 19 | void 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 | |
| 29 | void 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 | |