X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Freconnect.c;h=c169016236d9d3a33d65b5787341961aca4e648a;hb=a5ac7299f8042c01fcdb60c5508047146baf3a16;hp=f8463bb0d18b92b70539bd1686a8eba150cb5771;hpb=c36cf65edac28ccd7d2681521a651c35c8b2453e;p=openvswitch diff --git a/lib/reconnect.c b/lib/reconnect.c index f8463bb0..c1690162 100644 --- a/lib/reconnect.c +++ b/lib/reconnect.c @@ -106,8 +106,8 @@ reconnect_create(long long int now) fsm->state_entered = now; fsm->backoff = 0; fsm->last_received = now; - fsm->last_connected = now; - fsm->last_disconnected = now; + fsm->last_connected = LLONG_MAX; + fsm->last_disconnected = LLONG_MAX; fsm->max_tries = UINT_MAX; fsm->creation_time = now; @@ -642,23 +642,26 @@ reconnect_is_connected(const struct reconnect *fsm) return is_connected_state(fsm->state); } -/* Returns the number of milliseconds for which 'fsm' has been continuously - * connected to its peer. (If 'fsm' is not currently connected, this is 0.) */ +/* Returns the number of milliseconds since 'fsm' last successfully connected + * to its peer (even if it has since disconnected). Returns UINT_MAX if never + * connected. */ unsigned int -reconnect_get_connection_duration(const struct reconnect *fsm, - long long int now) +reconnect_get_last_connect_elapsed(const struct reconnect *fsm, + long long int now) { - return reconnect_is_connected(fsm) ? now - fsm->last_connected : 0; + return fsm->last_connected == LLONG_MAX ? UINT_MAX + : now - fsm->last_connected; } -/* Returns the number of milliseconds for which 'fsm' has been continuously - * disconnected from its peer. (If 'fsm' is not currently connected, - * this is 0.) */ +/* Returns the number of milliseconds since 'fsm' last disconnected + * from its peer (even if it has since reconnected). Returns UINT_MAX if never + * disconnected. */ unsigned int -reconnect_get_disconnect_duration(const struct reconnect *fsm, - long long int now) +reconnect_get_last_disconnect_elapsed(const struct reconnect *fsm, + long long int now) { - return reconnect_is_connected(fsm) ? 0 : now - fsm->last_disconnected; + return fsm->last_disconnected == LLONG_MAX ? UINT_MAX + : now - fsm->last_disconnected; } /* Copies various statistics for 'fsm' into '*stats'. */ @@ -673,12 +676,13 @@ reconnect_get_stats(const struct reconnect *fsm, long long int now, stats->backoff = fsm->backoff; stats->seqno = fsm->seqno; stats->is_connected = reconnect_is_connected(fsm); - stats->current_connection_duration - = reconnect_get_connection_duration(fsm, now); - stats->current_disconnect_duration - = reconnect_get_disconnect_duration(fsm, now); - stats->total_connected_duration = (stats->current_connection_duration - + fsm->total_connected_duration); + stats->msec_since_connect + = reconnect_get_last_connect_elapsed(fsm, now); + stats->msec_since_disconnect + = reconnect_get_last_disconnect_elapsed(fsm, now); + stats->total_connected_duration = fsm->total_connected_duration + + (is_connected_state(fsm->state) + ? reconnect_get_last_connect_elapsed(fsm, now) : 0); stats->n_attempted_connections = fsm->n_attempted_connections; stats->n_successful_connections = fsm->n_successful_connections; stats->state = reconnect_state_name__(fsm->state);