Ejemplo n.º 1
0
static void compress_start_transport_stream_op(grpc_exec_ctx *exec_ctx,
        grpc_call_element *elem,
        grpc_transport_stream_op *op) {
    call_data *calld = elem->call_data;

    GPR_TIMER_BEGIN("compress_start_transport_stream_op", 0);

    if (op->send_initial_metadata) {
        process_send_initial_metadata(elem, op->send_initial_metadata);
    }
    if (op->send_message != NULL && !skip_compression(elem) &&
            0 == (op->send_message->flags & GRPC_WRITE_NO_COMPRESS)) {
        calld->send_op = *op;
        calld->send_length = op->send_message->length;
        calld->send_flags = op->send_message->flags;
        continue_send_message(exec_ctx, elem);
    } else {
        /* pass control down the stack */
        grpc_call_next_op(exec_ctx, elem, op);
    }

    GPR_TIMER_END("compress_start_transport_stream_op", 0);
}
Ejemplo n.º 2
0
static void compress_start_transport_stream_op_batch(
    grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
    grpc_transport_stream_op_batch *op) {
  call_data *calld = elem->call_data;

  GPR_TIMER_BEGIN("compress_start_transport_stream_op_batch", 0);

  if (op->cancel_stream) {
    GRPC_ERROR_REF(op->payload->cancel_stream.cancel_error);
    gpr_atm cur = gpr_atm_full_xchg(
        &calld->send_initial_metadata_state,
        CANCELLED_BIT | (gpr_atm)op->payload->cancel_stream.cancel_error);
    switch (cur) {
      case HAS_COMPRESSION_ALGORITHM:
      case NO_COMPRESSION_ALGORITHM:
      case INITIAL_METADATA_UNSEEN:
        break;
      default:
        if ((cur & CANCELLED_BIT) == 0) {
          grpc_transport_stream_op_batch_finish_with_failure(
              exec_ctx, (grpc_transport_stream_op_batch *)cur,
              GRPC_ERROR_REF(op->payload->cancel_stream.cancel_error));
        } else {
          GRPC_ERROR_UNREF((grpc_error *)(cur & ~CANCELLED_BIT));
        }
        break;
    }
  }

  if (op->send_initial_metadata) {
    bool has_compression_algorithm;
    grpc_error *error = process_send_initial_metadata(
        exec_ctx, elem,
        op->payload->send_initial_metadata.send_initial_metadata,
        &has_compression_algorithm);
    if (error != GRPC_ERROR_NONE) {
      grpc_transport_stream_op_batch_finish_with_failure(exec_ctx, op, error);
      return;
    }
    gpr_atm cur;
  retry_send_im:
    cur = gpr_atm_acq_load(&calld->send_initial_metadata_state);
    GPR_ASSERT(cur != HAS_COMPRESSION_ALGORITHM &&
               cur != NO_COMPRESSION_ALGORITHM);
    if ((cur & CANCELLED_BIT) == 0) {
      if (!gpr_atm_rel_cas(&calld->send_initial_metadata_state, cur,
                           has_compression_algorithm
                               ? HAS_COMPRESSION_ALGORITHM
                               : NO_COMPRESSION_ALGORITHM)) {
        goto retry_send_im;
      }
      if (cur != INITIAL_METADATA_UNSEEN) {
        grpc_call_next_op(exec_ctx, elem,
                          (grpc_transport_stream_op_batch *)cur);
      }
    }
  }
  if (op->send_message) {
    gpr_atm cur;
  retry_send:
    cur = gpr_atm_acq_load(&calld->send_initial_metadata_state);
    switch (cur) {
      case INITIAL_METADATA_UNSEEN:
        if (!gpr_atm_rel_cas(&calld->send_initial_metadata_state, cur,
                             (gpr_atm)op)) {
          goto retry_send;
        }
        break;
      case HAS_COMPRESSION_ALGORITHM:
      case NO_COMPRESSION_ALGORITHM:
        if (!skip_compression(elem,
                              op->payload->send_message.send_message->flags,
                              cur == HAS_COMPRESSION_ALGORITHM)) {
          calld->send_op = op;
          calld->send_length = op->payload->send_message.send_message->length;
          calld->send_flags = op->payload->send_message.send_message->flags;
          continue_send_message(exec_ctx, elem);
        } else {
          /* pass control down the stack */
          grpc_call_next_op(exec_ctx, elem, op);
        }
        break;
      default:
        if (cur & CANCELLED_BIT) {
          grpc_transport_stream_op_batch_finish_with_failure(
              exec_ctx, op,
              GRPC_ERROR_REF((grpc_error *)(cur & ~CANCELLED_BIT)));
        } else {
          /* >1 send_message concurrently */
          GPR_UNREACHABLE_CODE(break);
        }
    }
  } else {