예제 #1
0
파일: client.c 프로젝트: Abioy/kythe
static void call_op(grpc_call_element *elem, grpc_call_element *from_elem,
                    grpc_call_op *op) {
  GRPC_CALL_LOG_OP(GPR_INFO, elem, op);

  switch (op->type) {
    case GRPC_SEND_DEADLINE:
      grpc_call_set_deadline(elem, op->data.deadline);
      grpc_call_next_op(elem, op);
      break;
    case GRPC_RECV_METADATA:
      grpc_call_recv_metadata(elem, op->data.metadata);
      break;
    case GRPC_RECV_DEADLINE:
      gpr_log(GPR_ERROR, "Deadline received by client (ignored)");
      break;
    case GRPC_RECV_MESSAGE:
      grpc_call_recv_message(elem, op->data.message);
      op->done_cb(op->user_data, GRPC_OP_OK);
      break;
    case GRPC_RECV_HALF_CLOSE:
      grpc_call_read_closed(elem);
      break;
    case GRPC_RECV_FINISH:
      grpc_call_stream_closed(elem);
      break;
    case GRPC_RECV_END_OF_INITIAL_METADATA:
      grpc_call_initial_metadata_complete(elem);
      break;
    default:
      GPR_ASSERT(op->dir == GRPC_CALL_DOWN);
      grpc_call_next_op(elem, op);
  }
}
예제 #2
0
파일: client.c 프로젝트: IsaacCisneros/grpc
static void call_op(grpc_call_element *elem, grpc_call_element *from_elem,
                    grpc_call_op *op) {
  GRPC_CALL_LOG_OP(GPR_INFO, elem, op);

  switch (op->type) {
    case GRPC_RECV_METADATA:
      grpc_call_recv_metadata(elem, &op->data.metadata);
      break;
    case GRPC_RECV_MESSAGE:
      grpc_call_recv_message(elem, op->data.message);
      op->done_cb(op->user_data, GRPC_OP_OK);
      break;
    case GRPC_RECV_HALF_CLOSE:
      grpc_call_read_closed(elem);
      break;
    case GRPC_RECV_FINISH:
      grpc_call_stream_closed(elem);
      break;
    case GRPC_RECV_SYNTHETIC_STATUS:
      grpc_call_recv_synthetic_status(elem, op->data.synthetic_status.status,
                                      op->data.synthetic_status.message);
      break;
    default:
      GPR_ASSERT(op->dir == GRPC_CALL_DOWN);
      grpc_call_next_op(elem, op);
  }
}
예제 #3
0
파일: lame_client.c 프로젝트: mindis/grpc
static void call_op(grpc_call_element *elem, grpc_call_element *from_elem,
                    grpc_call_op *op) {
  channel_data *channeld = elem->channel_data;
  GRPC_CALL_LOG_OP(GPR_INFO, elem, op);

  switch (op->type) {
    case GRPC_SEND_START:
      grpc_call_recv_metadata(elem, grpc_mdelem_ref(channeld->status));
      grpc_call_recv_metadata(elem, grpc_mdelem_ref(channeld->message));
      grpc_call_stream_closed(elem);
      break;
    case GRPC_SEND_METADATA:
      grpc_mdelem_unref(op->data.metadata);
      break;
    default:
      break;
  }

  op->done_cb(op->user_data, GRPC_OP_ERROR);
}
예제 #4
0
파일: server.c 프로젝트: mindis/grpc
static void stream_closed(grpc_call_element *elem) {
  call_data *calld = elem->call_data;
  channel_data *chand = elem->channel_data;
  gpr_mu_lock(&chand->server->mu);
  switch (calld->state) {
    case ACTIVATED:
      break;
    case PENDING:
      call_list_remove(calld, PENDING_START);
    /* fallthrough intended */
    case NOT_STARTED:
      calld->state = ZOMBIED;
      grpc_iomgr_add_callback(kill_zombie, elem);
      break;
    case ZOMBIED:
      break;
  }
  gpr_mu_unlock(&chand->server->mu);
  grpc_call_stream_closed(elem);
}