static void nn_atcp_shutdown (struct nn_fsm *self, int src, int type, NN_UNUSED void *srcptr) { struct nn_atcp *atcp; atcp = nn_cont (self, struct nn_atcp, fsm); if (nn_slow (src == NN_FSM_ACTION && type == NN_FSM_STOP)) { if (!nn_stcp_isidle (&atcp->stcp)) { nn_epbase_stat_increment (atcp->epbase, NN_STAT_DROPPED_CONNECTIONS, 1); nn_stcp_stop (&atcp->stcp); } atcp->state = NN_ATCP_STATE_STOPPING_STCP_FINAL; } if (nn_slow (atcp->state == NN_ATCP_STATE_STOPPING_STCP_FINAL)) { if (!nn_stcp_isidle (&atcp->stcp)) return; nn_usock_stop (&atcp->usock); atcp->state = NN_ATCP_STATE_STOPPING; } if (nn_slow (atcp->state == NN_ATCP_STATE_STOPPING)) { if (!nn_usock_isidle (&atcp->usock)) return; if (atcp->listener) { nn_assert (atcp->listener_owner.fsm); nn_usock_swap_owner (atcp->listener, &atcp->listener_owner); atcp->listener = NULL; atcp->listener_owner.src = -1; atcp->listener_owner.fsm = NULL; } atcp->state = NN_ATCP_STATE_IDLE; nn_fsm_stopped (&atcp->fsm, NN_ATCP_STOPPED); return; } nn_fsm_bad_action(atcp->state, src, type); }
static void nn_ctcp_shutdown (struct nn_fsm *self, int src, int type, NN_UNUSED void *srcptr) { struct nn_ctcp *ctcp; ctcp = nn_cont (self, struct nn_ctcp, fsm); if (nn_slow (src == NN_FSM_ACTION && type == NN_FSM_STOP)) { if (!nn_stcp_isidle (&ctcp->stcp)) { nn_epbase_stat_increment (&ctcp->epbase, NN_STAT_DROPPED_CONNECTIONS, 1); nn_stcp_stop (&ctcp->stcp); } ctcp->state = NN_CTCP_STATE_STOPPING_STCP_FINAL; } if (nn_slow (ctcp->state == NN_CTCP_STATE_STOPPING_STCP_FINAL)) { if (!nn_stcp_isidle (&ctcp->stcp)) return; nn_backoff_stop (&ctcp->retry); nn_usock_stop (&ctcp->usock); nn_dns_stop (&ctcp->dns); ctcp->state = NN_CTCP_STATE_STOPPING; } if (nn_slow (ctcp->state == NN_CTCP_STATE_STOPPING)) { if (!nn_backoff_isidle (&ctcp->retry) || !nn_usock_isidle (&ctcp->usock) || !nn_dns_isidle (&ctcp->dns)) return; ctcp->state = NN_CTCP_STATE_IDLE; nn_fsm_stopped_noevent (&ctcp->fsm); nn_epbase_stopped (&ctcp->epbase); return; } nn_fsm_bad_state (ctcp->state, src, type); }