Skip to content

Instantly share code, notes, and snippets.

@SilverRainZ
Created January 21, 2018 13:05
Show Gist options
  • Save SilverRainZ/cfd5b96b995d4d69e10b44f1fce61f07 to your computer and use it in GitHub Desktop.
Save SilverRainZ/cfd5b96b995d4d69e10b44f1fce61f07 to your computer and use it in GitHub Desktop.
Srain connection state machine
SrnRet server_state_machine(Server *srv, ServerAction act){
ServerState cur_state;
ServerState next_state;
cur_state = srv->stat;
next_state = SERVER_STATE_UNKNOWN;
/* State machine starts */
switch (srv->stat) {
case SERVER_STATE_UNKNOWN:
switch (act) {
case SERVER_ACTION_INIT:
srv->negotiated = FALSE;
srv->registered = FALSE;
srv->loggedin = FALSE;
srv->reconn_interval = 0;
next_state = SERVER_STATE_DISCONNECTED;
break;
default:
g_warn_if_reached();
}
break;
case SERVER_STATE_DISCONNECTED:
switch (act) {
case SERVER_ACTION_CONNECT:
sirc_connect(srv->irc, srv->prefs->host, srv->prefs->host);
next_state = SERVER_STATE_CONNECTING;
break;
default:
g_warn_if_reached();
}
break;
case SERVER_STATE_CONNECTING:
switch (act) {
case SERVER_ACTION_CONNECT_FINISH:
// srv->ping_timer = server_period_ping
next_state = SERVER_STATE_CONNECTED;
break;
case SERVER_ACTION_LOCAL_CLOSE:
sirc_cancel_connect(srv->irc);
next_state = SERVER_STATE_CONNECTING;
break;
case SERVER_ACTION_CONNECT_FAIL:
srv->reconn_interval += SERVER_RECONN_STEP;
srv->reconn_timer = g_timeout_add(srv->reconn_interval,
server_reconnect, srv);
next_state = SERVER_STATE_RECONNECTING;
break;
default:
g_warn_if_reached();
}
break;
case SERVER_STATE_CONNECTED:
switch (act) {
case SERVER_ACTION_LOCAL_CLOSE:
sirc_cancel_connect(srv->irc);
next_state = SERVER_STATE_DISCONNECTING;
break;
default:
g_warn_if_reached();
}
break;
case SERVER_STATE_DISCONNECTING:
switch (act) {
default:
g_warn_if_reached();
}
break;
case SERVER_STATE_RECONNECTING:
switch (act) {
case SERVER_ACTION_CONNECT:
sirc_connect(srv->irc);
next_state = SERVER_STATE_CONNECTING;
break;
case SERVER_ACTION_LOCAL_CLOSE:
g_source_remove(srv->reconn_timer);
srv->reconn_timer = 0;
next_state = SERVER_STATE_DISCONNECTED;
break;
default:
g_warn_if_reached();
}
break;
default:
g_warn_if_reached();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment