static void nn_timer_handler (struct nn_fsm *self, int src, int type, void *srcptr) { struct nn_timer *timer; timer = nn_cont (self, struct nn_timer, fsm); switch (timer->state) { /******************************************************************************/ /* IDLE state. */ /******************************************************************************/ case NN_TIMER_STATE_IDLE: switch (src) { case NN_FSM_ACTION: switch (type) { case NN_FSM_START: /* Send start event to the worker thread. */ nn_worker_execute (timer->worker, &timer->start_task); timer->state = NN_TIMER_STATE_ACTIVE; return; default: nn_fsm_bad_action (timer->state, src, type); } default: nn_fsm_bad_source (timer->state, src, type); } /******************************************************************************/ /* ACTIVE state. */ /******************************************************************************/ case NN_TIMER_STATE_ACTIVE: if (src == NN_TIMER_SRC_START_TASK) { nn_assert (type == NN_WORKER_TASK_EXECUTE); nn_assert (timer->timeout >= 0); nn_worker_add_timer (timer->worker, timer->timeout, &timer->wtimer); timer->timeout = -1; return; } if (srcptr == &timer->wtimer) { switch (type) { case NN_WORKER_TIMER_TIMEOUT: /* Notify the user about the timeout. */ nn_assert (timer->timeout == -1); nn_fsm_raise (&timer->fsm, &timer->done, NN_TIMER_TIMEOUT); return; default: nn_fsm_bad_action (timer->state, src, type); } } nn_fsm_bad_source (timer->state, src, type); /******************************************************************************/ /* Invalid state. */ /******************************************************************************/ default: nn_fsm_bad_state (timer->state, src, type); } }
static void nn_timer_handler (struct nn_fsm *self, int src, int type, void *srcptr) { struct nn_timer *timer; timer = nn_cont (self, struct nn_timer, fsm); /******************************************************************************/ /* STOP procedure. */ /******************************************************************************/ if (nn_slow (srcptr == NULL && type == NN_FSM_STOP)) { nn_worker_execute (timer->worker, &timer->stop_task); timer->state = NN_TIMER_STATE_STOPPING; return; } if (nn_slow (timer->state == NN_TIMER_STATE_STOPPING)) { if (srcptr != &timer->stop_task) return; nn_assert (type == NN_WORKER_TASK_EXECUTE); nn_worker_rm_timer (timer->worker, &timer->wtimer); timer->state = NN_TIMER_STATE_IDLE; nn_fsm_stopped (&timer->fsm, NN_TIMER_STOPPED); return; } switch (timer->state) { /******************************************************************************/ /* IDLE state. */ /******************************************************************************/ case NN_TIMER_STATE_IDLE: if (srcptr == NULL) { switch (type) { case NN_FSM_START: /* Send start event to the worker thread. */ nn_worker_execute (timer->worker, &timer->start_task); timer->state = NN_TIMER_STATE_ACTIVE; return; default: nn_assert (0); } } nn_assert (0); /******************************************************************************/ /* ACTIVE state. */ /******************************************************************************/ case NN_TIMER_STATE_ACTIVE: if (srcptr == &timer->start_task) { nn_assert (type == NN_WORKER_TASK_EXECUTE); nn_assert (timer->timeout >= 0); nn_worker_add_timer (timer->worker, timer->timeout, &timer->wtimer); timer->timeout = -1; return; } if (srcptr == &timer->wtimer) { switch (type) { case NN_WORKER_TIMER_TIMEOUT: /* Notify the user about the timeout. */ nn_assert (timer->timeout == -1); nn_fsm_raise (&timer->fsm, &timer->done, NN_TIMER_TIMEOUT); return; default: nn_assert (0); } } nn_assert (0); /******************************************************************************/ /* Invalid state. */ /******************************************************************************/ default: nn_assert (0); } }