concurrent_connectivity_test.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2016 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 
19 #include <memory.h>
20 #include <stdio.h>
21 
22 #include <atomic>
23 #include <string>
24 
25 #include "absl/strings/str_cat.h"
26 
27 #include <grpc/grpc.h>
28 #include <grpc/grpc_security.h>
29 #include <grpc/support/alloc.h>
30 #include <grpc/support/log.h>
31 
33 #include "src/core/lib/gprpp/thd.h"
41 #include "test/core/util/port.h"
43 
44 /* TODO(yashykt): When our macos testing infrastructure becomes good enough, we
45  * wouldn't need to reduce the number of threads on MacOS */
46 #ifdef __APPLE__
47 #define NUM_THREADS 10
48 #else
49 #define NUM_THREADS 100
50 #endif /* __APPLE */
51 
52 #define NUM_OUTER_LOOPS 10
53 #define NUM_INNER_LOOPS 10
54 #define DELAY_MILLIS 10
55 #define POLL_MILLIS 15000
56 
57 #define NUM_OUTER_LOOPS_SHORT_TIMEOUTS 10
58 #define NUM_INNER_LOOPS_SHORT_TIMEOUTS 100
59 #define DELAY_MILLIS_SHORT_TIMEOUTS 1
60 // in a successful test run, POLL_MILLIS should never be reached because all
61 // runs should end after the shorter delay_millis
62 #define POLL_MILLIS_SHORT_TIMEOUTS 30000
63 // it should never take longer that this to shutdown the server
64 #define SERVER_SHUTDOWN_TIMEOUT 30000
65 
66 static void* tag(int n) { return reinterpret_cast<void*>(n); }
67 
69  for (int i = 0; i < NUM_OUTER_LOOPS; ++i) {
72  grpc_channel* chan =
73  grpc_channel_create(static_cast<char*>(addr), creds, nullptr);
75 
76  for (int j = 0; j < NUM_INNER_LOOPS; ++j) {
77  gpr_timespec later_time =
82  nullptr);
83  gpr_timespec poll_time =
85  GPR_ASSERT(grpc_completion_queue_next(cq, poll_time, nullptr).type ==
87  /* check that the watcher from "watch state" was free'd */
89  }
92  }
93 }
94 
95 // Always stack-allocate or new ServerThreadArgs; never use gpr_malloc since
96 // this contains C++ objects.
99  grpc_server* server = nullptr;
101  std::vector<grpc_pollset*> pollset;
102  gpr_mu* mu = nullptr;
104  std::atomic_bool stop{false};
105 };
106 
107 void server_thread(void* vargs) {
108  struct ServerThreadArgs* args = static_cast<struct ServerThreadArgs*>(vargs);
109  grpc_event ev;
110  gpr_timespec deadline =
112  ev = grpc_completion_queue_next(args->cq, deadline, nullptr);
114  GPR_ASSERT(ev.tag == tag(0xd1e));
115 }
116 
117 static void on_connect(void* vargs, grpc_endpoint* tcp,
118  grpc_pollset* /*accepting_pollset*/,
119  grpc_tcp_server_acceptor* acceptor) {
120  gpr_free(acceptor);
121  struct ServerThreadArgs* args = static_cast<struct ServerThreadArgs*>(vargs);
125  gpr_mu_lock(args->mu);
126  GRPC_LOG_IF_ERROR("pollset_kick",
127  grpc_pollset_kick(args->pollset[0], nullptr));
128  gpr_mu_unlock(args->mu);
129 }
130 
131 void bad_server_thread(void* vargs) {
132  struct ServerThreadArgs* args = static_cast<struct ServerThreadArgs*>(vargs);
133 
135  grpc_resolved_address resolved_addr;
136  grpc_sockaddr* addr = reinterpret_cast<grpc_sockaddr*>(resolved_addr.addr);
137  int port;
138  grpc_tcp_server* s;
141  .PreconditionChannelArgs(nullptr)
142  .ToC();
143  grpc_error_handle error = grpc_tcp_server_create(nullptr, channel_args, &s);
144  grpc_channel_args_destroy(channel_args);
146  memset(&resolved_addr, 0, sizeof(resolved_addr));
147  addr->sa_family = GRPC_AF_INET;
148  error = grpc_tcp_server_add_port(s, &resolved_addr, &port);
149  GPR_ASSERT(GRPC_LOG_IF_ERROR("grpc_tcp_server_add_port", error));
150  GPR_ASSERT(port > 0);
151  args->addr = absl::StrCat("localhost:", port);
152 
153  grpc_tcp_server_start(s, &args->pollset, on_connect, args);
154  gpr_event_set(&args->ready, reinterpret_cast<void*>(1));
155 
156  gpr_mu_lock(args->mu);
157  while (!args->stop.load(std::memory_order_acquire)) {
160 
161  grpc_pollset_worker* worker = nullptr;
162  if (!GRPC_LOG_IF_ERROR(
163  "pollset_work",
164  grpc_pollset_work(args->pollset[0], &worker, deadline))) {
165  args->stop.store(true, std::memory_order_release);
166  }
167  gpr_mu_unlock(args->mu);
168 
169  gpr_mu_lock(args->mu);
170  }
171  gpr_mu_unlock(args->mu);
172 
174 }
175 
176 static void done_pollset_shutdown(void* pollset, grpc_error_handle /*error*/) {
177  grpc_pollset_destroy(static_cast<grpc_pollset*>(pollset));
178  gpr_free(pollset);
179 }
180 
182  struct ServerThreadArgs args;
183 
184  grpc_init();
185 
186  /* First round, no server */
187  {
188  gpr_log(GPR_DEBUG, "Wave 1");
190  args.addr = "localhost:54321";
191  for (auto& th : threads) {
192  th = grpc_core::Thread("grpc_wave_1", create_loop_destroy,
193  const_cast<char*>(args.addr.c_str()));
194  th.Start();
195  }
196  for (auto& th : threads) {
197  th.Join();
198  }
199  }
200 
201  {
202  /* Second round, actual grpc server */
203  gpr_log(GPR_DEBUG, "Wave 2");
205  args.addr = absl::StrCat("localhost:", port);
206  args.server = grpc_server_create(nullptr, nullptr);
207  grpc_server_credentials* server_creds =
209  grpc_server_add_http2_port(args.server, args.addr.c_str(), server_creds);
210  grpc_server_credentials_release(server_creds);
212  grpc_server_register_completion_queue(args.server, args.cq, nullptr);
213  grpc_server_start(args.server);
214  grpc_core::Thread server2("grpc_wave_2_server", server_thread, &args);
215  server2.Start();
216 
218  for (auto& th : threads) {
219  th = grpc_core::Thread("grpc_wave_2", create_loop_destroy,
220  const_cast<char*>(args.addr.c_str()));
221  th.Start();
222  }
223  for (auto& th : threads) {
224  th.Join();
225  }
226  grpc_server_shutdown_and_notify(args.server, args.cq, tag(0xd1e));
227 
228  server2.Join();
229  grpc_server_destroy(args.server);
231  }
232 
233  {
234  /* Third round, bogus tcp server */
235  gpr_log(GPR_DEBUG, "Wave 3");
236  auto* pollset = static_cast<grpc_pollset*>(gpr_zalloc(grpc_pollset_size()));
238  args.pollset.push_back(pollset);
239  gpr_event_init(&args.ready);
240  grpc_core::Thread server3("grpc_wave_3_server", bad_server_thread, &args);
241  server3.Start();
243 
245  for (auto& th : threads) {
246  th = grpc_core::Thread("grpc_wave_3", create_loop_destroy,
247  const_cast<char*>(args.addr.c_str()));
248  th.Start();
249  }
250  for (auto& th : threads) {
251  th.Join();
252  }
253 
254  args.stop.store(true, std::memory_order_release);
255  server3.Join();
256  {
259  args.pollset[0],
261  grpc_schedule_on_exec_ctx));
262  }
263  }
264 
265  grpc_shutdown();
266  return 0;
267 }
268 
270  for (int i = 0; i < NUM_OUTER_LOOPS_SHORT_TIMEOUTS; ++i) {
273  grpc_channel* chan =
274  grpc_channel_create(static_cast<char*>(addr), creds, nullptr);
276 
277  for (int j = 0; j < NUM_INNER_LOOPS_SHORT_TIMEOUTS; ++j) {
278  gpr_timespec later_time =
284  nullptr);
285  gpr_timespec poll_time =
287  grpc_event ev = grpc_completion_queue_next(cq, poll_time, nullptr);
289  GPR_ASSERT(ev.success == false);
290  /* check that the watcher from "watch state" was free'd */
292  }
293  grpc_channel_destroy(chan);
295  }
296 }
297 
298 // This test tries to catch deadlock situations.
299 // With short timeouts on "watches" and long timeouts on cq next calls,
300 // so that a QUEUE_TIMEOUT likely means that something is stuck.
302  grpc_init();
303 
305 
306  for (auto& th : threads) {
307  th = grpc_core::Thread("grpc_short_watches", watches_with_short_timeouts,
308  const_cast<char*>("localhost:54321"));
309  th.Start();
310  }
311  for (auto& th : threads) {
312  th.Join();
313  }
314 
315  grpc_shutdown();
316  return 0;
317 }
318 
319 int main(int argc, char** argv) {
320  grpc::testing::TestEnvironment env(&argc, argv);
321 
324 }
grpc_pollset_worker
struct grpc_pollset_worker grpc_pollset_worker
Definition: pollset.h:39
grpc_pollset_size
size_t grpc_pollset_size(void)
Definition: pollset.cc:56
SERVER_SHUTDOWN_TIMEOUT
#define SERVER_SHUTDOWN_TIMEOUT
Definition: concurrent_connectivity_test.cc:64
ServerThreadArgs
Definition: concurrent_connectivity_test.cc:97
iomgr.h
gpr_mu_unlock
GPRAPI void gpr_mu_unlock(gpr_mu *mu)
log.h
port.h
sockaddr_utils.h
generate.env
env
Definition: generate.py:37
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
memset
return memset(p, 0, total)
POLL_MILLIS
#define POLL_MILLIS
Definition: concurrent_connectivity_test.cc:55
NUM_INNER_LOOPS
#define NUM_INNER_LOOPS
Definition: concurrent_connectivity_test.cc:53
ServerThreadArgs::ready
gpr_event ready
Definition: concurrent_connectivity_test.cc:103
server_thread
void server_thread(void *vargs)
Definition: concurrent_connectivity_test.cc:107
grpc_channel_check_connectivity_state
GRPCAPI grpc_connectivity_state grpc_channel_check_connectivity_state(grpc_channel *channel, int try_to_connect)
Definition: channel_connectivity.cc:56
grpc_core::Timestamp
Definition: src/core/lib/gprpp/time.h:62
gpr_event_set
GPRAPI void gpr_event_set(gpr_event *ev, void *value)
Definition: sync.cc:59
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
resolve_address.h
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error
grpc_error_handle error
Definition: retry_filter.cc:499
done_pollset_shutdown
static void done_pollset_shutdown(void *pollset, grpc_error_handle)
Definition: concurrent_connectivity_test.cc:176
main
int main(int argc, char **argv)
Definition: concurrent_connectivity_test.cc:319
GRPC_OP_COMPLETE
@ GRPC_OP_COMPLETE
Definition: grpc_types.h:558
grpc_resolved_address
Definition: resolved_address.h:34
tcp
static uv_tcp_t tcp
Definition: test-connection-fail.c:29
grpc_server_create
GRPCAPI grpc_server * grpc_server_create(const grpc_channel_args *args, void *reserved)
Definition: src/core/lib/surface/server.cc:1456
grpc_tcp_server
Definition: tcp_server_utils_posix.h:53
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
ServerThreadArgs::mu
gpr_mu * mu
Definition: concurrent_connectivity_test.cc:102
grpc_pollset_work
grpc_error_handle grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker **worker, grpc_core::Timestamp deadline)
Definition: pollset.cc:45
on_connect
static void on_connect(void *vargs, grpc_endpoint *tcp, grpc_pollset *, grpc_tcp_server_acceptor *acceptor)
Definition: concurrent_connectivity_test.cc:117
GRPC_LOG_IF_ERROR
#define GRPC_LOG_IF_ERROR(what, error)
Definition: error.h:398
GRPC_CLOSURE_CREATE
#define GRPC_CLOSURE_CREATE(cb, cb_arg, scheduler)
Definition: closure.h:160
grpc_security.h
sockaddr.h
grpc_tcp_server_unref
void grpc_tcp_server_unref(grpc_tcp_server *s)
Definition: tcp_server.cc:67
grpc_channel_args
Definition: grpc_types.h:132
DELAY_MILLIS
#define DELAY_MILLIS
Definition: concurrent_connectivity_test.cc:54
threads
static uv_thread_t * threads
Definition: threadpool.c:38
gen_build_yaml.struct
def struct(**kwargs)
Definition: test/core/end2end/gen_build_yaml.py:30
grpc_pollset_init
void grpc_pollset_init(grpc_pollset *pollset, gpr_mu **mu)
Definition: pollset.cc:33
DELAY_MILLIS_SHORT_TIMEOUTS
#define DELAY_MILLIS_SHORT_TIMEOUTS
Definition: concurrent_connectivity_test.cc:59
grpc_connectivity_state
grpc_connectivity_state
Definition: include/grpc/impl/codegen/connectivity_state.h:30
grpc_tcp_server_start
void grpc_tcp_server_start(grpc_tcp_server *server, const std::vector< grpc_pollset * > *pollsets, grpc_tcp_server_cb on_accept_cb, void *cb_arg)
Definition: tcp_server.cc:31
create_loop_destroy
void create_loop_destroy(void *addr)
Definition: concurrent_connectivity_test.cc:68
gpr_zalloc
GPRAPI void * gpr_zalloc(size_t size)
Definition: alloc.cc:40
grpc_insecure_server_credentials_create
GRPCAPI grpc_server_credentials * grpc_insecure_server_credentials_create()
Definition: core/lib/security/credentials/insecure/insecure_credentials.cc:71
grpc_tcp_server_add_port
grpc_error_handle grpc_tcp_server_add_port(grpc_tcp_server *s, const grpc_resolved_address *addr, int *out_port)
Definition: tcp_server.cc:37
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
run_concurrent_watches_with_short_timeouts_test
int run_concurrent_watches_with_short_timeouts_test()
Definition: concurrent_connectivity_test.cc:301
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
grpc_channel_num_external_connectivity_watchers
GRPCAPI int grpc_channel_num_external_connectivity_watchers(grpc_channel *channel)
Definition: channel_connectivity.cc:79
grpc_core::CoreConfiguration::Get
static const CoreConfiguration & Get()
Definition: core_configuration.h:82
NUM_INNER_LOOPS_SHORT_TIMEOUTS
#define NUM_INNER_LOOPS_SHORT_TIMEOUTS
Definition: concurrent_connectivity_test.cc:58
grpc_server_credentials_release
GRPCAPI void grpc_server_credentials_release(grpc_server_credentials *creds)
Definition: credentials.cc:95
grpc_server_add_http2_port
GRPCAPI int grpc_server_add_http2_port(grpc_server *server, const char *addr, grpc_server_credentials *creds)
Definition: chttp2_server.cc:1029
ServerThreadArgs::pollset
std::vector< grpc_pollset * > pollset
Definition: concurrent_connectivity_test.cc:101
grpc_timeout_milliseconds_to_deadline
gpr_timespec grpc_timeout_milliseconds_to_deadline(int64_t time_ms)
Definition: test/core/util/test_config.cc:89
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
worker
Definition: worker.py:1
grpc_event
Definition: grpc_types.h:564
grpc_completion_queue
Definition: completion_queue.cc:347
grpc.h
grpc_insecure_credentials_create
GRPCAPI grpc_channel_credentials * grpc_insecure_credentials_create()
Definition: core/lib/security/credentials/insecure/insecure_credentials.cc:64
grpc_core::ChannelArgs::ToC
const grpc_channel_args * ToC() const
Definition: channel_args.cc:94
GRPC_CHANNEL_IDLE
@ GRPC_CHANNEL_IDLE
Definition: include/grpc/impl/codegen/connectivity_state.h:32
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
time.h
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
gpr_mu_lock
GPRAPI void gpr_mu_lock(gpr_mu *mu)
gpr_event_init
GPRAPI void gpr_event_init(gpr_event *ev)
Definition: sync.cc:54
grpc_endpoint_shutdown
void grpc_endpoint_shutdown(grpc_endpoint *ep, grpc_error_handle why)
Definition: endpoint.cc:49
grpc_server_destroy
GRPCAPI void grpc_server_destroy(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1519
run_concurrent_connectivity_test
int run_concurrent_connectivity_test()
Definition: concurrent_connectivity_test.cc:181
grpc_pick_unused_port_or_die
int grpc_pick_unused_port_or_die(void)
grpc_endpoint_destroy
void grpc_endpoint_destroy(grpc_endpoint *ep)
Definition: endpoint.cc:53
grpc_pollset_kick
grpc_error_handle grpc_pollset_kick(grpc_pollset *pollset, grpc_pollset_worker *specific_worker)
Definition: pollset.cc:51
NUM_OUTER_LOOPS
#define NUM_OUTER_LOOPS
Definition: concurrent_connectivity_test.cc:52
NUM_OUTER_LOOPS_SHORT_TIMEOUTS
#define NUM_OUTER_LOOPS_SHORT_TIMEOUTS
Definition: concurrent_connectivity_test.cc:57
grpc_core::CoreConfiguration::channel_args_preconditioning
const ChannelArgsPreconditioning & channel_args_preconditioning() const
Definition: core_configuration.h:139
grpc_core::ExecCtx
Definition: exec_ctx.h:97
grpc_core::Thread::Start
void Start()
Definition: thd.h:125
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
gpr_event_wait
GPRAPI void * gpr_event_wait(gpr_event *ev, gpr_timespec abs_deadline)
Definition: sync.cc:73
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
ServerThreadArgs::cq
grpc_completion_queue * cq
Definition: concurrent_connectivity_test.cc:100
tests.unit._exit_scenarios.port
port
Definition: _exit_scenarios.py:179
NUM_THREADS
#define NUM_THREADS
Definition: concurrent_connectivity_test.cc:49
bad_server_thread
void bad_server_thread(void *vargs)
Definition: concurrent_connectivity_test.cc:131
test_config.h
grpc_channel_credentials_release
GRPCAPI void grpc_channel_credentials_release(grpc_channel_credentials *creds)
Definition: credentials.cc:36
grpc_server_credentials
Definition: src/core/lib/security/credentials/credentials.h:259
grpc_core::Duration::Milliseconds
static constexpr Duration Milliseconds(int64_t millis)
Definition: src/core/lib/gprpp/time.h:155
gpr_event
Definition: impl/codegen/sync_generic.h:31
grpc_channel_create
GRPCAPI grpc_channel * grpc_channel_create(const char *target, grpc_channel_credentials *creds, const grpc_channel_args *args)
Definition: chttp2_connector.cc:366
server
Definition: examples/python/async_streaming/server.py:1
gpr_mu
pthread_mutex_t gpr_mu
Definition: impl/codegen/sync_posix.h:47
grpc_completion_queue_destroy
GRPCAPI void grpc_completion_queue_destroy(grpc_completion_queue *cq)
Definition: completion_queue.cc:1424
grpc_tcp_server_acceptor
Definition: tcp_server.h:36
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
grpc_pollset_shutdown
void grpc_pollset_shutdown(grpc_pollset *pollset, grpc_closure *closure)
Definition: pollset.cc:37
tag
static void * tag(int n)
Definition: concurrent_connectivity_test.cc:66
alloc.h
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h: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_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_channel_destroy
GRPCAPI void grpc_channel_destroy(grpc_channel *channel)
Definition: channel.cc:437
state
Definition: bloaty/third_party/zlib/contrib/blast/blast.c:41
exec_ctx.h
grpc_core::Thread
Definition: thd.h:43
grpc_tcp_server_create
grpc_error_handle grpc_tcp_server_create(grpc_closure *shutdown_complete, const grpc_channel_args *args, grpc_tcp_server **server)
Definition: tcp_server.cc:25
grpc_channel
struct grpc_channel grpc_channel
Definition: grpc_types.h:62
grpc_channel_watch_connectivity_state
GRPCAPI void grpc_channel_watch_connectivity_state(grpc_channel *channel, grpc_connectivity_state last_observed_state, gpr_timespec deadline, grpc_completion_queue *cq, void *tag)
Definition: channel_connectivity.cc:227
GPR_DEBUG
#define GPR_DEBUG
Definition: include/grpc/impl/codegen/log.h:55
watches_with_short_timeouts
void watches_with_short_timeouts(void *addr)
Definition: concurrent_connectivity_test.cc:269
POLL_MILLIS_SHORT_TIMEOUTS
#define POLL_MILLIS_SHORT_TIMEOUTS
Definition: concurrent_connectivity_test.cc:62
grpc_completion_queue_create_for_next
GRPCAPI grpc_completion_queue * grpc_completion_queue_create_for_next(void *reserved)
Definition: completion_queue_factory.cc:62
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
grpc_core::ExecCtx::Now
Timestamp Now()
Definition: exec_ctx.cc:90
gpr_timespec
Definition: gpr_types.h:50
grpc_event::type
grpc_completion_type type
Definition: grpc_types.h:566
grpc_init
GRPCAPI void grpc_init(void)
Definition: init.cc:146
grpc_server_start
GRPCAPI void grpc_server_start(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1497
grpc_error
Definition: error_internal.h:42
tcp_server.h
grpc_pollset
Definition: bm_cq_multiple_threads.cc:37
grpc_pollset_destroy
void grpc_pollset_destroy(grpc_pollset *pollset)
Definition: pollset.cc:41
grpc_resolved_address::addr
char addr[GRPC_MAX_SOCKADDR_SIZE]
Definition: resolved_address.h:35
grpc_event::success
int success
Definition: grpc_types.h:572
grpc_endpoint
Definition: endpoint.h:105
grpc_shutdown
GRPCAPI void grpc_shutdown(void)
Definition: init.cc:209
grpc_channel_credentials
Definition: src/core/lib/security/credentials/credentials.h:96
ServerThreadArgs::addr
std::string addr
Definition: concurrent_connectivity_test.cc:98
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
grpc_core::ChannelArgsPreconditioning::PreconditionChannelArgs
ChannelArgs PreconditionChannelArgs(const grpc_channel_args *args) const
Definition: channel_args_preconditioning.cc:34
ServerThreadArgs::stop
std::atomic_bool stop
Definition: concurrent_connectivity_test.cc:104
grpc_event::tag
void * tag
Definition: grpc_types.h:576
cq
static grpc_completion_queue * cq
Definition: test/core/fling/client.cc:37
grpc_core::ExecCtx::Get
static ExecCtx * Get()
Definition: exec_ctx.h:205
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
api.h


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:58:52