proxy.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
20 
21 #include <string.h>
22 
23 #include <grpc/support/alloc.h>
24 #include <grpc/support/log.h>
25 #include <grpc/support/sync.h>
26 
30 #include "src/core/lib/gprpp/thd.h"
32 #include "test/core/util/port.h"
33 
36  : cq(nullptr),
37  server(nullptr),
38  client(nullptr),
39  shutdown(false),
40  new_call(nullptr) {
43  }
50 
51  int shutdown;
52 
53  /* requested call */
57 };
58 
59 typedef struct {
60  void (*func)(void* arg, int success);
61  void* arg;
62 } closure;
63 
64 typedef struct {
67 
70 
73 
76 
80 
82 } proxy_call;
83 
84 static void thread_main(void* arg);
85 static void request_call(grpc_end2end_proxy* proxy);
86 
88  const grpc_end2end_proxy_def* def, const grpc_channel_args* client_args,
89  const grpc_channel_args* server_args) {
90  int proxy_port = grpc_pick_unused_port_or_die();
92 
94 
95  proxy->proxy_port = grpc_core::JoinHostPort("localhost", proxy_port);
96  proxy->server_port = grpc_core::JoinHostPort("localhost", server_port);
97 
98  gpr_log(GPR_DEBUG, "PROXY ADDR:%s BACKEND:%s", proxy->proxy_port.c_str(),
99  proxy->server_port.c_str());
100 
101  proxy->cq = grpc_completion_queue_create_for_next(nullptr);
102  proxy->server = def->create_server(proxy->proxy_port.c_str(), server_args);
103 
104  const char* arg_to_remove = GRPC_ARG_ENABLE_RETRIES;
106  const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 0);
107  const grpc_channel_args* proxy_client_args =
108  grpc_channel_args_copy_and_add_and_remove(client_args, &arg_to_remove, 1,
109  &arg_to_add, 1);
110  proxy->client =
111  def->create_client(proxy->server_port.c_str(), proxy_client_args);
112  grpc_channel_args_destroy(proxy_client_args);
113 
114  grpc_server_register_completion_queue(proxy->server, proxy->cq, nullptr);
115  grpc_server_start(proxy->server);
116 
118  proxy->thd = grpc_core::Thread("grpc_end2end_proxy", thread_main, proxy);
119  proxy->thd.Start();
120 
121  request_call(proxy);
122 
123  return proxy;
124 }
125 
126 static closure* new_closure(void (*func)(void* arg, int success), void* arg) {
127  closure* cl = static_cast<closure*>(gpr_malloc(sizeof(*cl)));
128  cl->func = func;
129  cl->arg = arg;
130  return cl;
131 }
132 
133 static void shutdown_complete(void* arg, int /*success*/) {
134  grpc_end2end_proxy* proxy = static_cast<grpc_end2end_proxy*>(arg);
135  proxy->shutdown = 1;
137 }
138 
142  proxy->thd.Join();
143  grpc_server_destroy(proxy->server);
147  delete proxy;
148 }
149 
150 static void unrefpc(proxy_call* pc, const char* /*reason*/) {
151  if (gpr_unref(&pc->refs)) {
152  grpc_call_unref(pc->c2p);
153  grpc_call_unref(pc->p2s);
158  gpr_free(pc);
159  }
160 }
161 
162 static void refpc(proxy_call* pc, const char* /*reason*/) {
163  gpr_ref(&pc->refs);
164 }
165 
166 static void on_c2p_sent_initial_metadata(void* arg, int /*success*/) {
167  proxy_call* pc = static_cast<proxy_call*>(arg);
168  unrefpc(pc, "on_c2p_sent_initial_metadata");
169 }
170 
171 static void on_p2s_recv_initial_metadata(void* arg, int /*success*/) {
172  proxy_call* pc = static_cast<proxy_call*>(arg);
173  grpc_op op;
175 
176  memset(&op, 0, sizeof(op));
177  if (!pc->proxy->shutdown && !grpc_call_is_trailers_only(pc->p2s)) {
179  op.flags = 0;
180  op.reserved = nullptr;
183  refpc(pc, "on_c2p_sent_initial_metadata");
184  err = grpc_call_start_batch(pc->c2p, &op, 1,
186  nullptr);
188  }
189 
190  unrefpc(pc, "on_p2s_recv_initial_metadata");
191 }
192 
193 static void on_p2s_sent_initial_metadata(void* arg, int /*success*/) {
194  proxy_call* pc = static_cast<proxy_call*>(arg);
195  unrefpc(pc, "on_p2s_sent_initial_metadata");
196 }
197 
198 static void on_c2p_recv_msg(void* arg, int success);
199 
200 static void on_p2s_sent_message(void* arg, int success) {
201  proxy_call* pc = static_cast<proxy_call*>(arg);
202  grpc_op op;
204 
206  if (!pc->proxy->shutdown && success) {
208  op.flags = 0;
209  op.reserved = nullptr;
211  refpc(pc, "on_c2p_recv_msg");
212  err = grpc_call_start_batch(pc->c2p, &op, 1,
213  new_closure(on_c2p_recv_msg, pc), nullptr);
215  }
216 
217  unrefpc(pc, "on_p2s_sent_message");
218 }
219 
220 static void on_p2s_sent_close(void* arg, int /*success*/) {
221  proxy_call* pc = static_cast<proxy_call*>(arg);
222  unrefpc(pc, "on_p2s_sent_close");
223 }
224 
225 static void on_c2p_recv_msg(void* arg, int success) {
226  proxy_call* pc = static_cast<proxy_call*>(arg);
227  grpc_op op;
229 
230  if (!pc->proxy->shutdown && success) {
231  if (pc->c2p_msg != nullptr) {
233  op.flags = 0;
234  op.reserved = nullptr;
236  refpc(pc, "on_p2s_sent_message");
238  pc->p2s, &op, 1, new_closure(on_p2s_sent_message, pc), nullptr);
240  } else {
242  op.flags = 0;
243  op.reserved = nullptr;
244  refpc(pc, "on_p2s_sent_close");
245  err = grpc_call_start_batch(pc->p2s, &op, 1,
246  new_closure(on_p2s_sent_close, pc), nullptr);
248  }
249  } else {
250  if (pc->c2p_msg != nullptr) {
252  }
253  }
254 
255  unrefpc(pc, "on_c2p_recv_msg");
256 }
257 
258 static void on_p2s_recv_msg(void* arg, int success);
259 
260 static void on_c2p_sent_message(void* arg, int success) {
261  proxy_call* pc = static_cast<proxy_call*>(arg);
262  grpc_op op;
264 
266  if (!pc->proxy->shutdown && success) {
268  op.flags = 0;
269  op.reserved = nullptr;
271  refpc(pc, "on_p2s_recv_msg");
272  err = grpc_call_start_batch(pc->p2s, &op, 1,
273  new_closure(on_p2s_recv_msg, pc), nullptr);
275  }
276 
277  unrefpc(pc, "on_c2p_sent_message");
278 }
279 
280 static void on_p2s_recv_msg(void* arg, int success) {
281  proxy_call* pc = static_cast<proxy_call*>(arg);
282  grpc_op op;
284 
285  if (!pc->proxy->shutdown && success && pc->p2s_msg) {
287  op.flags = 0;
288  op.reserved = nullptr;
290  refpc(pc, "on_c2p_sent_message");
291  err = grpc_call_start_batch(pc->c2p, &op, 1,
292  new_closure(on_c2p_sent_message, pc), nullptr);
294  } else {
296  }
297  unrefpc(pc, "on_p2s_recv_msg");
298 }
299 
300 static void on_c2p_sent_status(void* arg, int /*success*/) {
301  proxy_call* pc = static_cast<proxy_call*>(arg);
302  unrefpc(pc, "on_c2p_sent_status");
303 }
304 
305 static void on_p2s_status(void* arg, int success) {
306  proxy_call* pc = static_cast<proxy_call*>(arg);
307  grpc_op op[2]; // Possibly send empty initial metadata also if trailers-only
309 
310  memset(op, 0, sizeof(op));
311 
312  if (!pc->proxy->shutdown) {
313  GPR_ASSERT(success);
314 
315  int op_count = 0;
316  if (grpc_call_is_trailers_only(pc->p2s)) {
317  op[op_count].op = GRPC_OP_SEND_INITIAL_METADATA;
318  op_count++;
319  }
320 
322  op[op_count].flags = 0;
323  op[op_count].reserved = nullptr;
330  &pc->p2s_status_details;
331  op_count++;
332  refpc(pc, "on_c2p_sent_status");
333  err = grpc_call_start_batch(pc->c2p, op, op_count,
334  new_closure(on_c2p_sent_status, pc), nullptr);
336  }
337 
338  unrefpc(pc, "on_p2s_status");
339 }
340 
341 static void on_c2p_closed(void* arg, int /*success*/) {
342  proxy_call* pc = static_cast<proxy_call*>(arg);
343  unrefpc(pc, "on_c2p_closed");
344 }
345 
346 static void on_new_call(void* arg, int success) {
347  grpc_end2end_proxy* proxy = static_cast<grpc_end2end_proxy*>(arg);
349 
350  if (success) {
351  grpc_op op;
352  memset(&op, 0, sizeof(op));
353  proxy_call* pc = static_cast<proxy_call*>(gpr_malloc(sizeof(*pc)));
354  memset(pc, 0, sizeof(*pc));
355  pc->proxy = proxy;
357  pc->c2p = proxy->new_call;
359  proxy->client, pc->c2p, GRPC_PROPAGATE_DEFAULTS, proxy->cq,
361  proxy->new_call_details.deadline, nullptr);
362  gpr_ref_init(&pc->refs, 1);
363 
364  op.reserved = nullptr;
365 
367  op.flags = 0;
370  refpc(pc, "on_p2s_recv_initial_metadata");
371  err = grpc_call_start_batch(pc->p2s, &op, 1,
373  nullptr);
375 
377  op.flags = proxy->new_call_details.flags;
380  refpc(pc, "on_p2s_sent_initial_metadata");
381  err = grpc_call_start_batch(pc->p2s, &op, 1,
383  nullptr);
385 
387  op.flags = 0;
389  refpc(pc, "on_c2p_recv_msg");
390  err = grpc_call_start_batch(pc->c2p, &op, 1,
391  new_closure(on_c2p_recv_msg, pc), nullptr);
393 
395  op.flags = 0;
397  refpc(pc, "on_p2s_recv_msg");
398  err = grpc_call_start_batch(pc->p2s, &op, 1,
399  new_closure(on_p2s_recv_msg, pc), nullptr);
401 
403  op.flags = 0;
408  refpc(pc, "on_p2s_status");
410  nullptr);
412 
414  op.flags = 0;
416  refpc(pc, "on_c2p_closed");
418  nullptr);
420 
421  request_call(proxy);
422 
425 
426  unrefpc(pc, "init");
427  } else {
428  GPR_ASSERT(proxy->new_call == nullptr);
429  }
430 }
431 
432 static void request_call(grpc_end2end_proxy* proxy) {
433  proxy->new_call = nullptr;
435  proxy->server, &proxy->new_call,
436  &proxy->new_call_details,
437  &proxy->new_call_metadata, proxy->cq,
438  proxy->cq, new_closure(on_new_call, proxy)));
439 }
440 
441 static void thread_main(void* arg) {
442  grpc_end2end_proxy* proxy = static_cast<grpc_end2end_proxy*>(arg);
443  closure* cl;
444  for (;;) {
446  proxy->cq, gpr_inf_future(GPR_CLOCK_MONOTONIC), nullptr);
447  switch (ev.type) {
448  case GRPC_QUEUE_TIMEOUT:
449  gpr_log(GPR_ERROR, "Should never reach here");
450  abort();
451  case GRPC_QUEUE_SHUTDOWN:
452  return;
453  case GRPC_OP_COMPLETE:
454  cl = static_cast<closure*>(ev.tag);
455  cl->func(cl->arg, ev.success);
456  gpr_free(cl);
457  break;
458  }
459  }
460 }
461 
463  return proxy->proxy_port.c_str();
464 }
465 
467  return proxy->server_port.c_str();
468 }
grpc_arg
Definition: grpc_types.h:103
grpc_slice_unref
GPRAPI void grpc_slice_unref(grpc_slice s)
Definition: slice_api.cc:32
grpc_op::grpc_op_data::grpc_op_send_message::send_message
struct grpc_byte_buffer * send_message
Definition: grpc_types.h:668
grpc_op::flags
uint32_t flags
Definition: grpc_types.h:644
grpc_call_error
grpc_call_error
Definition: grpc_types.h:464
grpc_call_details_destroy
GRPCAPI void grpc_call_details_destroy(grpc_call_details *details)
Definition: call_details.cc:36
grpc_call_details_init
GRPCAPI void grpc_call_details_init(grpc_call_details *details)
Definition: call_details.cc:30
grpc_metadata_array::metadata
grpc_metadata * metadata
Definition: grpc_types.h:582
proxy_call::c2p_msg
grpc_byte_buffer * c2p_msg
Definition: proxy.cc:74
grpc_op::grpc_op_data::grpc_op_recv_status_on_client::trailing_metadata
grpc_metadata_array * trailing_metadata
Definition: grpc_types.h:701
log.h
port.h
grpc_op::grpc_op_data::grpc_op_recv_status_on_client::status
grpc_status_code * status
Definition: grpc_types.h:702
memset
return memset(p, 0, total)
grpc_call_details::flags
uint32_t flags
Definition: grpc_types.h:589
request_call
static void request_call(grpc_end2end_proxy *proxy)
Definition: proxy.cc:432
grpc_end2end_proxy::server_port
std::string server_port
Definition: proxy.cc:46
grpc_op::grpc_op_data::send_initial_metadata
struct grpc_op::grpc_op_data::grpc_op_send_initial_metadata send_initial_metadata
false
#define false
Definition: setup_once.h:323
grpc_end2end_proxy_def
Definition: proxy.h:28
grpc_end2end_proxy::shutdown
int shutdown
Definition: proxy.cc:51
grpc_metadata_array
Definition: grpc_types.h:579
client
Definition: examples/python/async_streaming/client.py:1
grpc_call_details
Definition: grpc_types.h:585
grpc_op::reserved
void * reserved
Definition: grpc_types.h:646
string.h
server_port
static int server_port
Definition: bad_server_response_test.cc:86
shutdown_complete
static void shutdown_complete(void *arg, int)
Definition: proxy.cc:133
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
useful.h
grpc_end2end_proxy::new_call_details
grpc_call_details new_call_details
Definition: proxy.cc:55
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc_end2end_proxy::thd
grpc_core::Thread thd
Definition: proxy.cc:44
grpc_status_code
grpc_status_code
Definition: include/grpc/impl/codegen/status.h:28
GRPC_QUEUE_SHUTDOWN
@ GRPC_QUEUE_SHUTDOWN
Definition: grpc_types.h:554
error_ref_leak.err
err
Definition: error_ref_leak.py:35
GRPC_OP_COMPLETE
@ GRPC_OP_COMPLETE
Definition: grpc_types.h:558
grpc_end2end_proxy::server
grpc_server * server
Definition: proxy.cc:48
gpr_malloc
GPRAPI void * gpr_malloc(size_t size)
Definition: alloc.cc:29
grpc_channel_args_copy_and_add_and_remove
grpc_channel_args * grpc_channel_args_copy_and_add_and_remove(const grpc_channel_args *src, const char **to_remove, size_t num_to_remove, const grpc_arg *to_add, size_t num_to_add)
Definition: channel_args.cc:246
GRPC_CALL_OK
@ GRPC_CALL_OK
Definition: grpc_types.h:466
grpc_server_register_completion_queue
GRPCAPI void grpc_server_register_completion_queue(grpc_server *server, grpc_completion_queue *cq, void *reserved)
Definition: src/core/lib/surface/server.cc:1466
gpr_inf_future
GPRAPI gpr_timespec gpr_inf_future(gpr_clock_type type)
Definition: src/core/lib/gpr/time.cc:55
grpc_call_is_trailers_only
bool grpc_call_is_trailers_only(const grpc_call *call)
Definition: call.cc:1872
on_c2p_recv_msg
static void on_c2p_recv_msg(void *arg, int success)
Definition: proxy.cc:225
on_p2s_sent_close
static void on_p2s_sent_close(void *arg, int)
Definition: proxy.cc:220
grpc_metadata_array::count
size_t count
Definition: grpc_types.h:580
grpc_call_details::method
grpc_slice method
Definition: grpc_types.h:586
proxy_call::p2s_initial_metadata
grpc_metadata_array p2s_initial_metadata
Definition: proxy.cc:72
grpc_end2end_proxy_get_server_port
const char * grpc_end2end_proxy_get_server_port(grpc_end2end_proxy *proxy)
Definition: proxy.cc:466
on_c2p_sent_message
static void on_c2p_sent_message(void *arg, int success)
Definition: proxy.cc:260
grpc_channel_args
Definition: grpc_types.h:132
gpr_refcount
Definition: impl/codegen/sync_generic.h:39
grpc_op::grpc_op_data::recv_message
struct grpc_op::grpc_op_data::grpc_op_recv_message recv_message
unrefpc
static void unrefpc(proxy_call *pc, const char *)
Definition: proxy.cc:150
grpc_op::data
union grpc_op::grpc_op_data data
memory.h
grpc_metadata_array_destroy
GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array *array)
Definition: metadata_array.cc:35
GRPC_ARG_ENABLE_RETRIES
#define GRPC_ARG_ENABLE_RETRIES
Definition: grpc_types.h:396
grpc_op::grpc_op_data::grpc_op_recv_message::recv_message
struct grpc_byte_buffer ** recv_message
Definition: grpc_types.h:693
grpc_server_request_call
GRPCAPI grpc_call_error grpc_server_request_call(grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new)
Definition: src/core/lib/surface/server.cc:1526
grpc_end2end_proxy_create
grpc_end2end_proxy * grpc_end2end_proxy_create(const grpc_end2end_proxy_def *def, const grpc_channel_args *client_args, const grpc_channel_args *server_args)
Definition: proxy.cc:87
proxy_call::c2p_server_cancelled
int c2p_server_cancelled
Definition: proxy.cc:81
proxy_call::p2s_status
grpc_status_code p2s_status
Definition: proxy.cc:78
grpc_end2end_proxy::new_call_metadata
grpc_metadata_array new_call_metadata
Definition: proxy.cc:56
GRPC_OP_RECV_INITIAL_METADATA
@ GRPC_OP_RECV_INITIAL_METADATA
Definition: grpc_types.h:617
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
on_p2s_recv_msg
static void on_p2s_recv_msg(void *arg, int success)
Definition: proxy.cc:280
GRPC_OP_SEND_STATUS_FROM_SERVER
@ GRPC_OP_SEND_STATUS_FROM_SERVER
Definition: grpc_types.h:612
proxy_call
Definition: proxy.cc:64
on_p2s_recv_initial_metadata
static void on_p2s_recv_initial_metadata(void *arg, int)
Definition: proxy.cc:171
grpc_call_unref
GRPCAPI void grpc_call_unref(grpc_call *call)
Definition: call.cc:1770
grpc_op::grpc_op_data::grpc_op_send_status_from_server::status
grpc_status_code status
Definition: grpc_types.h:673
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_event
Definition: grpc_types.h:564
grpc_completion_queue
Definition: completion_queue.cc:347
proxy_call::refs
gpr_refcount refs
Definition: proxy.cc:65
closure
grpc_closure closure
Definition: src/core/lib/surface/server.cc:466
grpc_call
struct grpc_call grpc_call
Definition: grpc_types.h:70
grpc_byte_buffer
Definition: grpc_types.h:43
grpc_end2end_proxy::proxy_port
std::string proxy_port
Definition: proxy.cc:45
grpc_core::JoinHostPort
std::string JoinHostPort(absl::string_view host, int port)
Definition: host_port.cc:32
def
int def(FILE *source, FILE *dest, int level)
Definition: bloaty/third_party/zlib/examples/zpipe.c:36
grpc_op
Definition: grpc_types.h:640
on_c2p_closed
static void on_c2p_closed(void *arg, int)
Definition: proxy.cc:341
GRPC_OP_SEND_MESSAGE
@ GRPC_OP_SEND_MESSAGE
Definition: grpc_types.h:602
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
arg
Definition: cmdline.cc:40
std::swap
void swap(Json::Value &a, Json::Value &b)
Specialize std::swap() for Json::Value.
Definition: third_party/bloaty/third_party/protobuf/conformance/third_party/jsoncpp/json.h:1226
grpc_op::grpc_op_data::grpc_op_send_status_from_server::trailing_metadata
grpc_metadata * trailing_metadata
Definition: grpc_types.h:672
grpc_end2end_proxy
struct grpc_end2end_proxy grpc_end2end_proxy
Definition: proxy.h:26
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
GPR_CLOCK_MONOTONIC
@ GPR_CLOCK_MONOTONIC
Definition: gpr_types.h:36
grpc_server
struct grpc_server grpc_server
Definition: grpc_types.h:65
grpc_core::Thread::Join
void Join()
Definition: thd.h:141
grpc_server_destroy
GRPCAPI void grpc_server_destroy(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1519
host_port.h
proxy_call::p2s
grpc_call * p2s
Definition: proxy.cc:69
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
refpc
static void refpc(proxy_call *pc, const char *)
Definition: proxy.cc:162
grpc_pick_unused_port_or_die
int grpc_pick_unused_port_or_die(void)
grpc_core::Thread::Start
void Start()
Definition: thd.h:125
thread_main
static void thread_main(void *arg)
Definition: proxy.cc:441
grpc_end2end_proxy
Definition: proxy.cc:34
grpc_op::op
grpc_op_type op
Definition: grpc_types.h:642
proxy_call::p2s_msg
grpc_byte_buffer * p2s_msg
Definition: proxy.cc:75
grpc_op::grpc_op_data::grpc_op_send_initial_metadata::count
size_t count
Definition: grpc_types.h:653
on_new_call
static void on_new_call(void *arg, int success)
Definition: proxy.cc:346
grpc_op::grpc_op_data::grpc_op_recv_status_on_client::status_details
grpc_slice * status_details
Definition: grpc_types.h:703
proxy.h
grpc_end2end_proxy::cq
grpc_completion_queue * cq
Definition: proxy.cc:47
grpc_channel_create_call
GRPCAPI grpc_call * grpc_channel_create_call(grpc_channel *channel, grpc_call *parent_call, uint32_t propagation_mask, grpc_completion_queue *completion_queue, grpc_slice method, const grpc_slice *host, gpr_timespec deadline, void *reserved)
Definition: channel.cc:311
grpc_op::grpc_op_data::recv_close_on_server
struct grpc_op::grpc_op_data::grpc_op_recv_close_on_server recv_close_on_server
GRPC_OP_RECV_MESSAGE
@ GRPC_OP_RECV_MESSAGE
Definition: grpc_types.h:621
grpc_end2end_proxy::grpc_end2end_proxy
grpc_end2end_proxy()
Definition: proxy.cc:35
func
const EVP_CIPHER *(* func)(void)
Definition: cipher_extra.c:73
GRPC_PROPAGATE_DEFAULTS
#define GRPC_PROPAGATE_DEFAULTS
Definition: propagation_bits.h:45
proxy_call::c2p
grpc_call * c2p
Definition: proxy.cc:68
grpc_op::grpc_op_data::send_status_from_server
struct grpc_op::grpc_op_data::grpc_op_send_status_from_server send_status_from_server
closure::arg
void * arg
Definition: proxy.cc:61
grpc_channel_arg_integer_create
grpc_arg grpc_channel_arg_integer_create(char *name, int value)
Definition: channel_args.cc:484
grpc_call_details::host
grpc_slice host
Definition: grpc_types.h:587
server
Definition: examples/python/async_streaming/server.py:1
proxy_call::proxy
grpc_end2end_proxy * proxy
Definition: proxy.cc:66
grpc_completion_queue_destroy
GRPCAPI void grpc_completion_queue_destroy(grpc_completion_queue *cq)
Definition: completion_queue.cc:1424
GRPC_OP_SEND_INITIAL_METADATA
@ GRPC_OP_SEND_INITIAL_METADATA
Definition: grpc_types.h:598
on_c2p_sent_status
static void on_c2p_sent_status(void *arg, int)
Definition: proxy.cc:300
grpc_end2end_proxy::client
grpc_channel * client
Definition: proxy.cc:49
grpc_op::grpc_op_data::send_message
struct grpc_op::grpc_op_data::grpc_op_send_message send_message
alloc.h
grpc_op::grpc_op_data::grpc_op_send_initial_metadata::metadata
grpc_metadata * metadata
Definition: grpc_types.h:654
grpc_op::grpc_op_data::recv_status_on_client
struct grpc_op::grpc_op_data::grpc_op_recv_status_on_client recv_status_on_client
grpc_op::grpc_op_data::grpc_op_send_status_from_server::trailing_metadata_count
size_t trailing_metadata_count
Definition: grpc_types.h:671
grpc_end2end_proxy::new_call
grpc_call * new_call
Definition: proxy.cc:54
thd.h
grpc_server_shutdown_and_notify
GRPCAPI void grpc_server_shutdown_and_notify(grpc_server *server, grpc_completion_queue *cq, void *tag)
Definition: src/core/lib/surface/server.cc:1503
grpc_byte_buffer_destroy
GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer *bb)
Definition: byte_buffer.cc:81
grpc_completion_queue_next
GRPCAPI grpc_event grpc_completion_queue_next(grpc_completion_queue *cq, gpr_timespec deadline, void *reserved)
Definition: completion_queue.cc:1133
grpc_completion_queue_shutdown
GRPCAPI void grpc_completion_queue_shutdown(grpc_completion_queue *cq)
Definition: completion_queue.cc:1416
arg
struct arg arg
grpc_channel_destroy
GRPCAPI void grpc_channel_destroy(grpc_channel *channel)
Definition: channel.cc:437
closure
Definition: proxy.cc:59
on_c2p_sent_initial_metadata
static void on_c2p_sent_initial_metadata(void *arg, int)
Definition: proxy.cc:166
grpc_core::Thread
Definition: thd.h:43
on_p2s_sent_message
static void on_p2s_sent_message(void *arg, int success)
Definition: proxy.cc:200
grpc_channel
struct grpc_channel grpc_channel
Definition: grpc_types.h:62
GRPC_OP_RECV_CLOSE_ON_SERVER
@ GRPC_OP_RECV_CLOSE_ON_SERVER
Definition: grpc_types.h:633
new_closure
static closure * new_closure(void(*func)(void *arg, int success), void *arg)
Definition: proxy.cc:126
GPR_DEBUG
#define GPR_DEBUG
Definition: include/grpc/impl/codegen/log.h:55
grpc_end2end_proxy_get_client_target
const char * grpc_end2end_proxy_get_client_target(grpc_end2end_proxy *proxy)
Definition: proxy.cc:462
grpc_end2end_proxy_destroy
void grpc_end2end_proxy_destroy(grpc_end2end_proxy *proxy)
Definition: proxy.cc:139
grpc_completion_queue_create_for_next
GRPCAPI grpc_completion_queue * grpc_completion_queue_create_for_next(void *reserved)
Definition: completion_queue_factory.cc:62
gpr_ref_init
GPRAPI void gpr_ref_init(gpr_refcount *r, int n)
Definition: sync.cc:86
grpc_op::grpc_op_data::recv_initial_metadata
struct grpc_op::grpc_op_data::grpc_op_recv_initial_metadata recv_initial_metadata
grpc_op::grpc_op_data::grpc_op_send_status_from_server::status_details
grpc_slice * status_details
Definition: grpc_types.h:677
grpc_event::type
grpc_completion_type type
Definition: grpc_types.h:566
gpr_unref
GPRAPI int gpr_unref(gpr_refcount *r)
Definition: sync.cc:103
grpc_server_start
GRPCAPI void grpc_server_start(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1497
GRPC_OP_RECV_STATUS_ON_CLIENT
@ GRPC_OP_RECV_STATUS_ON_CLIENT
Definition: grpc_types.h:627
grpc_op::grpc_op_data::grpc_op_recv_initial_metadata::recv_initial_metadata
grpc_metadata_array * recv_initial_metadata
Definition: grpc_types.h:685
proxy_call::p2s_status_details
grpc_slice p2s_status_details
Definition: proxy.cc:79
proxy_call::c2p_initial_metadata
grpc_metadata_array c2p_initial_metadata
Definition: proxy.cc:71
sync.h
op
static grpc_op * op
Definition: test/core/fling/client.cc:47
grpc_call_details::deadline
gpr_timespec deadline
Definition: grpc_types.h:588
grpc_event::success
int success
Definition: grpc_types.h:572
GRPC_QUEUE_TIMEOUT
@ GRPC_QUEUE_TIMEOUT
Definition: grpc_types.h:556
grpc_call_start_batch
GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops, size_t nops, void *tag, void *reserved)
Definition: call.cc:1831
gpr_ref
GPRAPI void gpr_ref(gpr_refcount *r)
Definition: sync.cc:88
on_p2s_status
static void on_p2s_status(void *arg, int success)
Definition: proxy.cc:305
on_p2s_sent_initial_metadata
static void on_p2s_sent_initial_metadata(void *arg, int)
Definition: proxy.cc:193
grpc_event::tag
void * tag
Definition: grpc_types.h:576
grpc_op::grpc_op_data::grpc_op_recv_close_on_server::cancelled
int * cancelled
Definition: grpc_types.h:714
call.h
GRPC_OP_SEND_CLOSE_FROM_CLIENT
@ GRPC_OP_SEND_CLOSE_FROM_CLIENT
Definition: grpc_types.h:607
proxy_call::p2s_trailing_metadata
grpc_metadata_array p2s_trailing_metadata
Definition: proxy.cc:77
closure::func
void(* func)(void *arg, int success)
Definition: proxy.cc:60


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:00:58