コード例 #1
0
ファイル: gthread.c プロジェクト: Maluuba/c-cometd-client
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;
}
コード例 #2
0
ファイル: cometd.c プロジェクト: GhostGumm/CarbonComet
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;
}