Ejemplo n.º 1
0
void grpc_call_stack_init(grpc_exec_ctx *exec_ctx,
                          grpc_channel_stack *channel_stack,
                          const void *transport_server_data,
                          grpc_transport_stream_op *initial_op,
                          grpc_call_stack *call_stack) {
    grpc_channel_element *channel_elems = CHANNEL_ELEMS_FROM_STACK(channel_stack);
    size_t count = channel_stack->count;
    grpc_call_element *call_elems;
    char *user_data;
    size_t i;

    call_stack->count = count;
    call_elems = CALL_ELEMS_FROM_STACK(call_stack);
    user_data = ((char *)call_elems) +
                ROUND_UP_TO_ALIGNMENT_SIZE(count * sizeof(grpc_call_element));

    /* init per-filter data */
    for (i = 0; i < count; i++) {
        call_elems[i].filter = channel_elems[i].filter;
        call_elems[i].channel_data = channel_elems[i].channel_data;
        call_elems[i].call_data = user_data;
        call_elems[i].filter->init_call_elem(exec_ctx, &call_elems[i],
                                             transport_server_data, initial_op);
        user_data +=
            ROUND_UP_TO_ALIGNMENT_SIZE(call_elems[i].filter->sizeof_call_data);
    }
}
Ejemplo n.º 2
0
void grpc_channel_stack_init(const grpc_channel_filter **filters,
                             size_t filter_count, const grpc_channel_args *args,
                             grpc_mdctx *metadata_context,
                             grpc_channel_stack *stack) {
  size_t call_size =
      ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(grpc_call_stack)) +
      ROUND_UP_TO_ALIGNMENT_SIZE(filter_count * sizeof(grpc_call_element));
  grpc_channel_element *elems;
  char *user_data;
  size_t i;

  stack->count = filter_count;
  elems = CHANNEL_ELEMS_FROM_STACK(stack);
  user_data =
      ((char *)elems) +
      ROUND_UP_TO_ALIGNMENT_SIZE(filter_count * sizeof(grpc_channel_element));

  /* init per-filter data */
  for (i = 0; i < filter_count; i++) {
    elems[i].filter = filters[i];
    elems[i].channel_data = user_data;
    elems[i].filter->init_channel_elem(&elems[i], args, metadata_context,
                                       i == 0, i == (filter_count - 1));
    user_data += ROUND_UP_TO_ALIGNMENT_SIZE(filters[i]->sizeof_channel_data);
    call_size += ROUND_UP_TO_ALIGNMENT_SIZE(filters[i]->sizeof_call_data);
  }

  GPR_ASSERT(user_data > (char *)stack);
  GPR_ASSERT((gpr_uintptr)(user_data - (char *)stack) ==
             grpc_channel_stack_size(filters, filter_count));

  stack->call_stack_size = call_size;
}
Ejemplo n.º 3
0
void grpc_channel_stack_destroy(grpc_channel_stack *stack) {
  grpc_channel_element *channel_elems = CHANNEL_ELEMS_FROM_STACK(stack);
  size_t count = stack->count;
  size_t i;

  /* destroy per-filter data */
  for (i = 0; i < count; i++) {
    channel_elems[i].filter->destroy_channel_elem(&channel_elems[i]);
  }
}
Ejemplo n.º 4
0
grpc_channel_element *grpc_channel_stack_element(
    grpc_channel_stack *channel_stack, size_t index) {
    return CHANNEL_ELEMS_FROM_STACK(channel_stack) + index;
}