gpointer cometd_loop_gthread_run(gpointer data) { const cometd* h = (const cometd*) data; cometd_conn* conn = h->conn; cometd_loop* loop = h->loop; JsonNode *connect = NULL, *payload = NULL; long backoff = 0; guint attempt; for (attempt = 1; cometd_should_recv(h); ++attempt) { cometd_loop_wait(loop, backoff); payload = cometd_recv(h); connect = cometd_msg_extract_connect(payload); cometd_inbox_push(h->inbox, payload); cometd_process_msg(h, connect); if (cometd_should_retry_recv(h)) backoff = cometd_get_backoff(h, attempt); else backoff = attempt = 0; json_node_free(payload); json_node_free(connect); // bail out if we should no longer backoff if (backoff == -1) break; } // If we've bailed from the loop, it's because we gave up // on the COMETD_UNCONNECTED state and we are no longer retrying or we // have intentially disconnected. // // If we gave up retrying, then this ensures that our state gets set correctly // and it should be a signal to the inbox queue to stop waiting. cometd_conn_set_state(conn, COMETD_DISCONNECTED); return NULL; }
int cometd_handshake(const cometd* h, cometd_callback cb) { cometd_loop* loop = h->loop; cometd_conn* conn = h->conn; int code = ECOMETD_UNKNOWN; long backoff = 0; guint attempt; for (attempt = 1; cometd_should_handshake(h); ++attempt) { cometd_loop_wait(loop, backoff); code = cometd_impl_handshake(h, cb); backoff = cometd_get_backoff(h, attempt); if (backoff == -1) break; } return code; }