|
|
|
@ -47,6 +47,10 @@ |
|
|
|
|
|
|
|
|
|
grpc_core::TraceFlag grpc_server_channel_trace(false, "server_channel"); |
|
|
|
|
|
|
|
|
|
static void server_on_recv_initial_metadata(void* ptr, grpc_error* error); |
|
|
|
|
static void server_recv_trailing_metadata_ready(void* user_data, |
|
|
|
|
grpc_error* error); |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
struct listener { |
|
|
|
|
void* arg; |
|
|
|
@ -128,38 +132,62 @@ typedef enum { |
|
|
|
|
typedef struct request_matcher request_matcher; |
|
|
|
|
|
|
|
|
|
struct call_data { |
|
|
|
|
call_data(grpc_call_element* elem, const grpc_call_element_args& args) |
|
|
|
|
: call(grpc_call_from_top_element(elem)), |
|
|
|
|
call_combiner(args.call_combiner) { |
|
|
|
|
GRPC_CLOSURE_INIT(&server_on_recv_initial_metadata, |
|
|
|
|
::server_on_recv_initial_metadata, elem, |
|
|
|
|
grpc_schedule_on_exec_ctx); |
|
|
|
|
GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready, |
|
|
|
|
server_recv_trailing_metadata_ready, elem, |
|
|
|
|
grpc_schedule_on_exec_ctx); |
|
|
|
|
} |
|
|
|
|
~call_data() { |
|
|
|
|
GPR_ASSERT(state != PENDING); |
|
|
|
|
GRPC_ERROR_UNREF(recv_initial_metadata_error); |
|
|
|
|
if (host_set) { |
|
|
|
|
grpc_slice_unref_internal(host); |
|
|
|
|
} |
|
|
|
|
if (path_set) { |
|
|
|
|
grpc_slice_unref_internal(path); |
|
|
|
|
} |
|
|
|
|
grpc_metadata_array_destroy(&initial_metadata); |
|
|
|
|
grpc_byte_buffer_destroy(payload); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grpc_call* call; |
|
|
|
|
|
|
|
|
|
gpr_atm state; |
|
|
|
|
gpr_atm state = NOT_STARTED; |
|
|
|
|
|
|
|
|
|
bool path_set; |
|
|
|
|
bool host_set; |
|
|
|
|
bool path_set = false; |
|
|
|
|
bool host_set = false; |
|
|
|
|
grpc_slice path; |
|
|
|
|
grpc_slice host; |
|
|
|
|
grpc_millis deadline; |
|
|
|
|
grpc_millis deadline = GRPC_MILLIS_INF_FUTURE; |
|
|
|
|
|
|
|
|
|
grpc_completion_queue* cq_new; |
|
|
|
|
grpc_completion_queue* cq_new = nullptr; |
|
|
|
|
|
|
|
|
|
grpc_metadata_batch* recv_initial_metadata; |
|
|
|
|
uint32_t recv_initial_metadata_flags; |
|
|
|
|
grpc_metadata_array initial_metadata; |
|
|
|
|
grpc_metadata_batch* recv_initial_metadata = nullptr; |
|
|
|
|
uint32_t recv_initial_metadata_flags = 0; |
|
|
|
|
grpc_metadata_array initial_metadata = |
|
|
|
|
grpc_metadata_array(); // Zero-initialize the C struct.
|
|
|
|
|
|
|
|
|
|
request_matcher* matcher; |
|
|
|
|
grpc_byte_buffer* payload; |
|
|
|
|
request_matcher* matcher = nullptr; |
|
|
|
|
grpc_byte_buffer* payload = nullptr; |
|
|
|
|
|
|
|
|
|
grpc_closure got_initial_metadata; |
|
|
|
|
grpc_closure server_on_recv_initial_metadata; |
|
|
|
|
grpc_closure kill_zombie_closure; |
|
|
|
|
grpc_closure* on_done_recv_initial_metadata; |
|
|
|
|
grpc_closure recv_trailing_metadata_ready; |
|
|
|
|
grpc_error* recv_initial_metadata_error; |
|
|
|
|
grpc_error* recv_initial_metadata_error = GRPC_ERROR_NONE; |
|
|
|
|
grpc_closure* original_recv_trailing_metadata_ready; |
|
|
|
|
grpc_error* recv_trailing_metadata_error; |
|
|
|
|
bool seen_recv_trailing_metadata_ready; |
|
|
|
|
grpc_error* recv_trailing_metadata_error = GRPC_ERROR_NONE; |
|
|
|
|
bool seen_recv_trailing_metadata_ready = false; |
|
|
|
|
|
|
|
|
|
grpc_closure publish; |
|
|
|
|
|
|
|
|
|
call_data* pending_next; |
|
|
|
|
call_data* pending_next = nullptr; |
|
|
|
|
grpc_call_combiner* call_combiner; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -875,40 +903,18 @@ static void channel_connectivity_changed(void* cd, grpc_error* error) { |
|
|
|
|
|
|
|
|
|
static grpc_error* init_call_elem(grpc_call_element* elem, |
|
|
|
|
const grpc_call_element_args* args) { |
|
|
|
|
call_data* calld = static_cast<call_data*>(elem->call_data); |
|
|
|
|
channel_data* chand = static_cast<channel_data*>(elem->channel_data); |
|
|
|
|
memset(calld, 0, sizeof(call_data)); |
|
|
|
|
calld->deadline = GRPC_MILLIS_INF_FUTURE; |
|
|
|
|
calld->call = grpc_call_from_top_element(elem); |
|
|
|
|
calld->call_combiner = args->call_combiner; |
|
|
|
|
|
|
|
|
|
GRPC_CLOSURE_INIT(&calld->server_on_recv_initial_metadata, |
|
|
|
|
server_on_recv_initial_metadata, elem, |
|
|
|
|
grpc_schedule_on_exec_ctx); |
|
|
|
|
GRPC_CLOSURE_INIT(&calld->recv_trailing_metadata_ready, |
|
|
|
|
server_recv_trailing_metadata_ready, elem, |
|
|
|
|
grpc_schedule_on_exec_ctx); |
|
|
|
|
server_ref(chand->server); |
|
|
|
|
new (elem->call_data) call_data(elem, *args); |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void destroy_call_elem(grpc_call_element* elem, |
|
|
|
|
const grpc_call_final_info* final_info, |
|
|
|
|
grpc_closure* ignored) { |
|
|
|
|
channel_data* chand = static_cast<channel_data*>(elem->channel_data); |
|
|
|
|
call_data* calld = static_cast<call_data*>(elem->call_data); |
|
|
|
|
|
|
|
|
|
GPR_ASSERT(calld->state != PENDING); |
|
|
|
|
GRPC_ERROR_UNREF(calld->recv_initial_metadata_error); |
|
|
|
|
if (calld->host_set) { |
|
|
|
|
grpc_slice_unref_internal(calld->host); |
|
|
|
|
} |
|
|
|
|
if (calld->path_set) { |
|
|
|
|
grpc_slice_unref_internal(calld->path); |
|
|
|
|
} |
|
|
|
|
grpc_metadata_array_destroy(&calld->initial_metadata); |
|
|
|
|
grpc_byte_buffer_destroy(calld->payload); |
|
|
|
|
|
|
|
|
|
calld->~call_data(); |
|
|
|
|
channel_data* chand = static_cast<channel_data*>(elem->channel_data); |
|
|
|
|
server_unref(chand->server); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|