コード例 #1
0
ファイル: fd_posix.c プロジェクト: Infixz/grpc
static void process_callback(grpc_iomgr_closure *closure, int success,
                          int allow_synchronous_callback) {
  if (allow_synchronous_callback) {
    closure->cb(closure->cb_arg, success);
  } else {
    grpc_iomgr_add_delayed_callback(closure, success);
  }
}
コード例 #2
0
ファイル: socket_windows.c プロジェクト: rootusr/grpc
/* Schedule a shutdown of the socket operations. Will call the pending
   operations to abort them. We need to do that this way because of the
   various callsites of that function, which happens to be in various
   mutex hold states, and that'd be unsafe to call them directly. */
int grpc_winsocket_shutdown(grpc_winsocket *winsocket) {
  int callbacks_set = 0;
  SOCKET socket;
  gpr_mu_lock(&winsocket->state_mu);
  socket = winsocket->socket;
  if (winsocket->read_info.cb) {
    callbacks_set++;
    grpc_iomgr_closure_init(&winsocket->shutdown_closure,
                            winsocket->read_info.cb,
                            winsocket->read_info.opaque);
    grpc_iomgr_add_delayed_callback(&winsocket->shutdown_closure, 0);
  }
  if (winsocket->write_info.cb) {
    callbacks_set++;
    grpc_iomgr_closure_init(&winsocket->shutdown_closure,
                            winsocket->write_info.cb,
                            winsocket->write_info.opaque);
    grpc_iomgr_add_delayed_callback(&winsocket->shutdown_closure, 0);
  }
  gpr_mu_unlock(&winsocket->state_mu);
  closesocket(socket);
  return callbacks_set;
}
コード例 #3
0
ファイル: chttp2_transport.c プロジェクト: larsonmpdx/grpc
static void destruct_transport(grpc_chttp2_transport *t) {
  size_t i;

  gpr_mu_lock(&t->mu);

  GPR_ASSERT(t->ep == NULL);

  gpr_slice_buffer_destroy(&t->global.qbuf);

  gpr_slice_buffer_destroy(&t->writing.outbuf);
  grpc_chttp2_hpack_compressor_destroy(&t->writing.hpack_compressor);

  gpr_slice_buffer_destroy(&t->parsing.qbuf);
  gpr_slice_buffer_destroy(&t->read_buffer);
  grpc_chttp2_hpack_parser_destroy(&t->parsing.hpack_parser);
  grpc_chttp2_goaway_parser_destroy(&t->parsing.goaway_parser);

  GRPC_MDSTR_UNREF(t->parsing.str_grpc_timeout);

  for (i = 0; i < STREAM_LIST_COUNT; i++) {
    GPR_ASSERT(t->lists[i].head == NULL);
    GPR_ASSERT(t->lists[i].tail == NULL);
  }

  GPR_ASSERT(grpc_chttp2_stream_map_size(&t->parsing_stream_map) == 0);
  GPR_ASSERT(grpc_chttp2_stream_map_size(&t->new_stream_map) == 0);

  grpc_chttp2_stream_map_destroy(&t->parsing_stream_map);
  grpc_chttp2_stream_map_destroy(&t->new_stream_map);
  grpc_connectivity_state_destroy(&t->channel_callback.state_tracker);

  gpr_mu_unlock(&t->mu);
  gpr_mu_destroy(&t->mu);

  /* callback remaining pings: they're not allowed to call into the transpot,
     and maybe they hold resources that need to be freed */
  while (t->global.pings.next != &t->global.pings) {
    grpc_chttp2_outstanding_ping *ping = t->global.pings.next;
    grpc_iomgr_add_delayed_callback(ping->on_recv, 0);
    ping->next->prev = ping->prev;
    ping->prev->next = ping->next;
    gpr_free(ping);
  }

  grpc_mdctx_unref(t->metadata_context);

  gpr_free(t->peer_string);
  gpr_free(t);
}
コード例 #4
0
ファイル: connectivity_state.c プロジェクト: larsonmpdx/grpc
void grpc_connectivity_state_destroy(grpc_connectivity_state_tracker *tracker) {
    grpc_connectivity_state_watcher *w;
    while ((w = tracker->watchers)) {
        tracker->watchers = w->next;

        if (GRPC_CHANNEL_FATAL_FAILURE != *w->current) {
            *w->current = GRPC_CHANNEL_FATAL_FAILURE;
            grpc_iomgr_add_callback(w->notify);
        } else {
            grpc_iomgr_add_delayed_callback(w->notify, 0);
        }
        gpr_free(w);
    }
    gpr_free(tracker->name);
}
コード例 #5
0
ファイル: pick_first.c プロジェクト: JoeWoo/grpc
void pf_shutdown(grpc_lb_policy *pol) {
  pick_first_lb_policy *p = (pick_first_lb_policy *)pol;
  pending_pick *pp;
  gpr_mu_lock(&p->mu);
  del_interested_parties_locked(p);
  p->shutdown = 1;
  while ((pp = p->pending_picks)) {
    p->pending_picks = pp->next;
    *pp->target = NULL;
    grpc_iomgr_add_delayed_callback(pp->on_complete, 0);
    gpr_free(pp);
  }
  grpc_connectivity_state_set(&p->state_tracker, GRPC_CHANNEL_FATAL_FAILURE,
                              "shutdown");
  gpr_mu_unlock(&p->mu);
}
コード例 #6
0
static grpc_endpoint_op_status tcp_read(grpc_endpoint *ep,
                                        gpr_slice_buffer *incoming_buffer,
                                        grpc_iomgr_closure *cb) {
  grpc_tcp *tcp = (grpc_tcp *)ep;
  GPR_ASSERT(tcp->read_cb == NULL);
  tcp->read_cb = cb;
  tcp->incoming_buffer = incoming_buffer;
  gpr_slice_buffer_reset_and_unref(incoming_buffer);
  TCP_REF(tcp, "read");
  if (tcp->finished_edge) {
    tcp->finished_edge = 0;
    grpc_fd_notify_on_read(tcp->em_fd, &tcp->read_closure);
  } else {
    grpc_iomgr_add_delayed_callback(&tcp->read_closure, 1);
  }
  /* TODO(ctiller): immediate return */
  return GRPC_ENDPOINT_PENDING;
}
コード例 #7
0
ファイル: iomgr.c プロジェクト: Abioy/kythe
void grpc_iomgr_add_callback(grpc_iomgr_cb_func cb, void *cb_arg) {
  grpc_iomgr_add_delayed_callback(cb, cb_arg, 1);
}
コード例 #8
0
void grpc_iomgr_add_callback(grpc_iomgr_closure *closure) {
  grpc_iomgr_add_delayed_callback(closure, 1 /* GPR_TRUE */);
}
コード例 #9
0
ファイル: pick_first.c プロジェクト: JoeWoo/grpc
static void pf_connectivity_changed(void *arg, int iomgr_success) {
  pick_first_lb_policy *p = arg;
  pending_pick *pp;
  int unref = 0;

  gpr_mu_lock(&p->mu);

  if (p->shutdown) {
    unref = 1;
  } else if (p->selected != NULL) {
    grpc_connectivity_state_set(&p->state_tracker, p->checking_connectivity,
                                "selected_changed");
    if (p->checking_connectivity != GRPC_CHANNEL_FATAL_FAILURE) {
      grpc_subchannel_notify_on_state_change(
          p->selected, &p->checking_connectivity, &p->connectivity_changed);
    } else {
      unref = 1;
    }
  } else {
  loop:
    switch (p->checking_connectivity) {
      case GRPC_CHANNEL_READY:
        grpc_connectivity_state_set(&p->state_tracker, GRPC_CHANNEL_READY,
                                    "connecting_ready");
        p->selected = p->subchannels[p->checking_subchannel];
        while ((pp = p->pending_picks)) {
          p->pending_picks = pp->next;
          *pp->target = p->selected;
          grpc_subchannel_del_interested_party(p->selected, pp->pollset);
          grpc_iomgr_add_delayed_callback(pp->on_complete, 1);
          gpr_free(pp);
        }
        grpc_subchannel_notify_on_state_change(
            p->selected, &p->checking_connectivity, &p->connectivity_changed);
        break;
      case GRPC_CHANNEL_TRANSIENT_FAILURE:
        grpc_connectivity_state_set(&p->state_tracker,
                                    GRPC_CHANNEL_TRANSIENT_FAILURE,
                                    "connecting_transient_failure");
        del_interested_parties_locked(p);
        p->checking_subchannel =
            (p->checking_subchannel + 1) % p->num_subchannels;
        p->checking_connectivity = grpc_subchannel_check_connectivity(
            p->subchannels[p->checking_subchannel]);
        add_interested_parties_locked(p);
        if (p->checking_connectivity == GRPC_CHANNEL_TRANSIENT_FAILURE) {
          grpc_subchannel_notify_on_state_change(
              p->subchannels[p->checking_subchannel], &p->checking_connectivity,
              &p->connectivity_changed);
        } else {
          goto loop;
        }
        break;
      case GRPC_CHANNEL_CONNECTING:
      case GRPC_CHANNEL_IDLE:
        grpc_connectivity_state_set(&p->state_tracker, p->checking_connectivity,
                                    "connecting_changed");
        grpc_subchannel_notify_on_state_change(
            p->subchannels[p->checking_subchannel], &p->checking_connectivity,
            &p->connectivity_changed);
        break;
      case GRPC_CHANNEL_FATAL_FAILURE:
        del_interested_parties_locked(p);
        GPR_SWAP(grpc_subchannel *, p->subchannels[p->checking_subchannel],
                 p->subchannels[p->num_subchannels - 1]);
        p->num_subchannels--;
        GRPC_SUBCHANNEL_UNREF(p->subchannels[p->num_subchannels], "pick_first");
        if (p->num_subchannels == 0) {
          grpc_connectivity_state_set(&p->state_tracker,
                                      GRPC_CHANNEL_FATAL_FAILURE,
                                      "no_more_channels");
          while ((pp = p->pending_picks)) {
            p->pending_picks = pp->next;
            *pp->target = NULL;
            grpc_iomgr_add_delayed_callback(pp->on_complete, 1);
            gpr_free(pp);
          }
          unref = 1;
        } else {
          grpc_connectivity_state_set(&p->state_tracker,
                                      GRPC_CHANNEL_TRANSIENT_FAILURE,
                                      "subchannel_failed");
          p->checking_subchannel %= p->num_subchannels;
          p->checking_connectivity = grpc_subchannel_check_connectivity(
              p->subchannels[p->checking_subchannel]);
          add_interested_parties_locked(p);
          goto loop;
        }
    }
  }

  gpr_mu_unlock(&p->mu);

  if (unref) {
    GRPC_LB_POLICY_UNREF(&p->base, "pick_first_connectivity");
  }
}