1 ;;; pipe-skel.el - pipelined graph node skeleton
5 (define-skeleton skel-periodic
6 "Insert a skeleton periodic process node"
8 '(setq node-name (skeleton-read "Name: "))
9 '(setq uc-node-name (upcase node-name))
10 '(setq poll-period (skeleton-read "Poll period (f64 seconds, e.g. 10.0): "))
13 #define " uc-node-name "_POLL_PERIOD " poll-period "
16 " node-name "_process (vlib_main_t * vm,
17 vlib_node_runtime_t * rt,
20 f64 poll_time_remaining;
21 uword event_type, * event_data = 0;
23 poll_time_remaining = " uc-node-name "_POLL_PERIOD;
28 * Sleep until next periodic call due, or until we receive event(s)
31 vlib_process_wait_for_event_or_clock (vm, poll_time_remaining);
33 event_type = vlib_process_get_events (vm, &event_data);
35 case ~0: /* no events => timeout */
39 * $$$$ FIXME: add cases / handlers for each event type
42 for (i = 0; i < vec_len (event_data); i++)
43 handle_event1 (mm, event_data[i]);
47 for (i = 0; i < vec_len (event_data); i++)
48 handle_event2 (vm, event_data[i]);
51 /* ... and so forth for each event type */
54 /* This should never happen... */
55 clib_warning (\"BUG: unhandled event type %d\", event_type);
59 _vec_len (event_data) = 0;
61 /* Timer expired, call periodic function */
62 if (vlib_process_suspend_time_is_zero (poll_time_remaining)) {
63 " node-name "_periodic (vm);
64 poll_time_remaining = " uc-node-name "_POLL_PERIOD;
72 * " node-name " periodic node declaration
74 static VLIB_REGISTER_NODE (" node-name "_node) = {
75 .function = " node-name "_process,
76 .type = VLIB_NODE_TYPE_PROCESS,
77 .name = \"" node-name "-process\",
83 * vlib_process_signal_event (vm, " node-name "_node.index, EVENTn, datum);