35 #define ERROR_BUFFER_LENGTH 1024
61 int error = check_event_handler(tehp);
69 .tem_handlers = singleton,
73 event_handlers = &singleton_handler;
90 for (uint32_t i = 0; i < temp->
tem_length; i++) {
96 event_handlers = temp;
104 #define FOREACH_ERROR_HANDLER() \
105 for (uint32_t i = 0; i < event_handlers->tem_length; i++) \
106 if (event_handlers->tem_mask & (1 << i)) \
107 event_handlers->tem_handlers[i]
180 print_failure_header(
const struct tesla_class *tcp)
183 error(
"\n\nTESLA failure:\n");
184 #if defined(_KERNEL) && defined(KDB)
195 DEBUG(libtesla.instance.new,
"new %td: %d\n",
204 DEBUG(libtesla.state.transition,
"update %td: %d->%d\n",
214 DEBUG(libtesla.instance.clone,
"clone %td:%d -> %td:%d\n",
227 print_failure_header(tcp);
230 const char *end = buffer +
sizeof(buffer);
237 assert(next > buffer);
250 print_failure_header(tcp);
253 const char *end = buffer +
sizeof(buffer);
257 "Instance %td is in state %d\n"
258 "but required to take a transition in ",
260 assert(next > buffer);
263 assert(next > buffer);
269 print_error(
struct tesla_class *tcp,
int errno,
const char *message)
272 DEBUG(libtesla.event,
"%s in '%s': %s\n",
280 DEBUG(libtesla.instance.success,
281 "pass '%s': %td\n", tcp->
tc_name,
291 const char *end = buffer +
sizeof(buffer);
297 DEBUG(libtesla.event,
"ignore '%s':%s", tcp->
tc_name, buffer);
302 .teh_transition = print_transition_taken,
303 .teh_clone = print_clone,
304 .teh_fail_no_instance = print_no_instance,
305 .teh_bad_transition = print_bad_transition,
306 .teh_err = print_error,
307 .teh_accept = print_accept,
308 .teh_ignored = print_ignored,
313 .teh_transition = ev_noop,
314 .teh_clone = ev_noop,
315 .teh_fail_no_instance = print_no_instance,
316 .teh_bad_transition = print_bad_transition,
317 .teh_err = print_error,
318 .teh_accept = ev_noop,
319 .teh_ignored = ev_noop,
345 .teh_transition = ev_noop,
346 .teh_clone = ev_noop,
347 .teh_fail_no_instance = panic_no_instance,
348 .teh_bad_transition = panic_bad_transition,
349 .teh_accept = ev_noop,
350 .teh_ignored = ev_noop,
361 #if defined(_KERNEL) && defined(KDTRACE_HOOKS)
368 .
tem_length =
sizeof(default_handlers) /
sizeof(*default_handlers),
369 #if defined(_KERNEL) && defined(KDTRACE_HOOKS)
370 .tem_mask = TESLA_KERN_DTRACE_EV,
374 .tem_handlers = default_handlers,
378 #include <sys/sysctl.h>
380 SYSCTL_NODE(, OID_AUTO, tesla, CTLFLAG_RW, 0,
"TESLA");
381 SYSCTL_NODE(_tesla, OID_AUTO, events, CTLFLAG_RW, 0,
"control of TESLA events");
382 SYSCTL_UINT(_tesla_events, OID_AUTO, handlers, CTLFLAG_RW,
383 &default_event_handlers.
tem_mask, 0,
384 "Mask of currently-enabled TESLA event handlers");