static void rpc_clnt_start_ping (void *rpc_ptr) { struct rpc_clnt *rpc = NULL; rpc_clnt_connection_t *conn = NULL; struct timespec timeout = {0, }; int frame_count = 0; int unref = 0; rpc = (struct rpc_clnt*) rpc_ptr; conn = &rpc->conn; if (conn->ping_timeout == 0) { gf_log (THIS->name, GF_LOG_DEBUG, "ping timeout is 0," " returning"); return; } pthread_mutex_lock (&conn->lock); { unref = rpc_clnt_remove_ping_timer_locked (rpc); if (conn->saved_frames) { GF_ASSERT (conn->saved_frames->count >= 0); /* treat the case where conn->saved_frames is NULL as no pending frames */ frame_count = conn->saved_frames->count; } if ((frame_count == 0) || !conn->connected) { gf_log (THIS->name, GF_LOG_DEBUG, "returning as transport is already disconnected" " OR there are no frames (%d || %d)", !conn->connected, frame_count); pthread_mutex_unlock (&conn->lock); if (unref) rpc_clnt_unref (rpc); return; } if (__rpc_clnt_rearm_ping_timer (rpc, rpc_clnt_ping_timer_expired) == -1) { gf_log (THIS->name, GF_LOG_WARNING, "unable to setup ping timer"); pthread_mutex_unlock (&conn->lock); if (unref) rpc_clnt_unref (rpc); return; } } pthread_mutex_unlock (&conn->lock); if (unref) rpc_clnt_unref (rpc); rpc_clnt_ping(rpc); }
static void rpc_clnt_start_ping (void *rpc_ptr) { struct rpc_clnt *rpc = NULL; rpc_clnt_connection_t *conn = NULL; struct timespec timeout = {0, }; int frame_count = 0; rpc = (struct rpc_clnt*) rpc_ptr; conn = &rpc->conn; if (conn->ping_timeout == 0) { gf_log (THIS->name, GF_LOG_DEBUG, "ping timeout is 0," " returning"); return; } pthread_mutex_lock (&conn->lock); { if (conn->ping_timer) { gf_timer_call_cancel (rpc->ctx, conn->ping_timer); conn->ping_timer = NULL; conn->ping_started = 0; rpc_clnt_unref (rpc); } if (conn->saved_frames) { GF_ASSERT (conn->saved_frames->count >= 0); /* treat the case where conn->saved_frames is NULL as no pending frames */ frame_count = conn->saved_frames->count; } if ((frame_count == 0) || !conn->connected) { gf_log (THIS->name, GF_LOG_DEBUG, "returning as transport is already disconnected" " OR there are no frames (%d || %d)", !conn->connected, frame_count); pthread_mutex_unlock (&conn->lock); return; } timeout.tv_sec = conn->ping_timeout; timeout.tv_nsec = 0; rpc_clnt_ref (rpc); conn->ping_timer = gf_timer_call_after (rpc->ctx, timeout, rpc_clnt_ping_timer_expired, (void *) rpc); if (conn->ping_timer == NULL) { gf_log (THIS->name, GF_LOG_WARNING, "unable to setup ping timer"); rpc_clnt_unref (rpc); pthread_mutex_unlock (&conn->lock); return; } else { conn->ping_started = 1; } } pthread_mutex_unlock (&conn->lock); rpc_clnt_ping(rpc); }