tcp_server_windows.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 
22 
23 #ifdef GRPC_WINSOCK_SOCKET
24 
25 #include <inttypes.h>
26 #include <io.h>
27 
28 #include <vector>
29 
30 #include "absl/strings/str_cat.h"
31 
32 #include <grpc/support/alloc.h>
33 #include <grpc/support/log.h>
36 #include <grpc/support/sync.h>
37 #include <grpc/support/time.h>
38 
49 
50 #define MIN_SAFE_ACCEPT_QUEUE_SIZE 100
51 
52 /* one listening port */
54 struct grpc_tcp_listener {
55  /* This seemingly magic number comes from AcceptEx's documentation. each
56  address buffer needs to have at least 16 more bytes at their end. */
57  uint8_t addresses[(sizeof(grpc_sockaddr_in6) + 16) * 2];
58  /* This will hold the socket for the next accept. */
59  SOCKET new_socket;
60  /* The listener winsocket. */
61  grpc_winsocket* socket;
62  /* The actual TCP port number. */
63  int port;
64  unsigned port_index;
66  /* The cached AcceptEx for that port. */
67  LPFN_ACCEPTEX AcceptEx;
68  int shutting_down;
69  int outstanding_calls;
70  /* closure for socket notification of accept being ready */
72  /* linked list */
73  struct grpc_tcp_listener* next;
74 };
75 
76 /* the overall server */
77 struct grpc_tcp_server {
79  /* Called whenever accept() succeeds on a server port. */
81  void* on_accept_cb_arg;
82 
83  gpr_mu mu;
84 
85  /* active port count: how many ports are actually still listening */
86  int active_ports;
87 
88  /* linked list of server ports */
91 
92  /* List of closures passed to shutdown_starting_add(). */
94 
95  /* shutdown callback */
97 
99 };
100 
101 /* Public function. Allocates the proper data structures to hold a
102  grpc_tcp_server. */
103 static grpc_error_handle tcp_server_create(grpc_closure* shutdown_complete,
104  const grpc_channel_args* args,
107  s->channel_args = grpc_channel_args_copy(args);
108  gpr_ref_init(&s->refs, 1);
109  gpr_mu_init(&s->mu);
110  s->active_ports = 0;
111  s->on_accept_cb = NULL;
112  s->on_accept_cb_arg = NULL;
113  s->head = NULL;
114  s->tail = NULL;
115  s->shutdown_starting.head = NULL;
116  s->shutdown_starting.tail = NULL;
117  s->shutdown_complete = shutdown_complete;
118  *server = s;
119  return GRPC_ERROR_NONE;
120 }
121 
122 static void destroy_server(void* arg, grpc_error_handle error) {
124 
125  /* Now that the accepts have been aborted, we can destroy the sockets.
126  The IOCP won't get notified on these, so we can flag them as already
127  closed by the system. */
128  while (s->head) {
129  grpc_tcp_listener* sp = s->head;
130  s->head = sp->next;
131  sp->next = NULL;
132  grpc_winsocket_destroy(sp->socket);
133  gpr_free(sp);
134  }
135  grpc_channel_args_destroy(s->channel_args);
136  gpr_mu_destroy(&s->mu);
137  gpr_free(s);
138 }
139 
140 static void finish_shutdown_locked(grpc_tcp_server* s) {
141  if (s->shutdown_complete != NULL) {
142  grpc_core::ExecCtx::Run(DEBUG_LOCATION, s->shutdown_complete,
144  }
145 
148  GRPC_CLOSURE_CREATE(destroy_server, s, grpc_schedule_on_exec_ctx),
150 }
151 
152 static grpc_tcp_server* tcp_server_ref(grpc_tcp_server* s) {
153  gpr_ref_non_zero(&s->refs);
154  return s;
155 }
156 
157 static void tcp_server_shutdown_starting_add(grpc_tcp_server* s,
158  grpc_closure* shutdown_starting) {
159  gpr_mu_lock(&s->mu);
160  grpc_closure_list_append(&s->shutdown_starting, shutdown_starting,
162  gpr_mu_unlock(&s->mu);
163 }
164 
165 static void tcp_server_destroy(grpc_tcp_server* s) {
166  grpc_tcp_listener* sp;
167  gpr_mu_lock(&s->mu);
168  /* First, shutdown all fd's. This will queue abortion calls for all
169  of the pending accepts due to the normal operation mechanism. */
170  if (s->active_ports == 0) {
171  finish_shutdown_locked(s);
172  } else {
173  for (sp = s->head; sp; sp = sp->next) {
174  sp->shutting_down = 1;
175  grpc_winsocket_shutdown(sp->socket);
176  }
177  }
178  gpr_mu_unlock(&s->mu);
179 }
180 
181 static void tcp_server_unref(grpc_tcp_server* s) {
182  if (gpr_unref(&s->refs)) {
184  gpr_mu_lock(&s->mu);
185  grpc_core::ExecCtx::RunList(DEBUG_LOCATION, &s->shutdown_starting);
186  gpr_mu_unlock(&s->mu);
187  tcp_server_destroy(s);
188  }
189 }
190 
191 /* Prepare (bind) a recently-created socket for listening. */
192 static grpc_error_handle prepare_socket(SOCKET sock,
194  int* port) {
195  grpc_resolved_address sockname_temp;
197  int sockname_temp_len;
198 
199  error = grpc_tcp_prepare_socket(sock);
200  if (!GRPC_ERROR_IS_NONE(error)) {
201  goto failure;
202  }
203 
204  if (bind(sock, (const grpc_sockaddr*)addr->addr, (int)addr->len) ==
205  SOCKET_ERROR) {
206  error = GRPC_WSA_ERROR(WSAGetLastError(), "bind");
207  goto failure;
208  }
209 
210  if (listen(sock, SOMAXCONN) == SOCKET_ERROR) {
211  error = GRPC_WSA_ERROR(WSAGetLastError(), "listen");
212  goto failure;
213  }
214 
215  sockname_temp_len = sizeof(struct sockaddr_storage);
216  if (getsockname(sock, (grpc_sockaddr*)sockname_temp.addr,
217  &sockname_temp_len) == SOCKET_ERROR) {
218  error = GRPC_WSA_ERROR(WSAGetLastError(), "getsockname");
219  goto failure;
220  }
221  sockname_temp.len = (size_t)sockname_temp_len;
222 
223  *port = grpc_sockaddr_get_port(&sockname_temp);
224  return GRPC_ERROR_NONE;
225 
226 failure:
228  auto addr_uri = grpc_sockaddr_to_uri(addr);
232  "Failed to prepare server socket", &error, 1),
234  addr_uri.ok() ? *addr_uri : addr_uri.status().ToString()),
235  GRPC_ERROR_INT_FD, (intptr_t)sock);
237  if (sock != INVALID_SOCKET) closesocket(sock);
238  return error;
239 }
240 
241 static void decrement_active_ports_and_notify_locked(grpc_tcp_listener* sp) {
242  sp->shutting_down = 0;
243  GPR_ASSERT(sp->server->active_ports > 0);
244  if (0 == --sp->server->active_ports) {
245  finish_shutdown_locked(sp->server);
246  }
247 }
248 
249 /* In order to do an async accept, we need to create a socket first which
250  will be the one assigned to the new incoming connection. */
251 static grpc_error_handle start_accept_locked(grpc_tcp_listener* port) {
252  SOCKET sock = INVALID_SOCKET;
253  BOOL success;
254  DWORD addrlen = sizeof(grpc_sockaddr_in6) + 16;
255  DWORD bytes_received = 0;
257 
258  if (port->shutting_down) {
259  return GRPC_ERROR_NONE;
260  }
261 
262  sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
263  grpc_get_default_wsa_socket_flags());
264  if (sock == INVALID_SOCKET) {
265  error = GRPC_WSA_ERROR(WSAGetLastError(), "WSASocket");
266  goto failure;
267  }
268 
269  error = grpc_tcp_prepare_socket(sock);
270  if (!GRPC_ERROR_IS_NONE(error)) goto failure;
271 
272  /* Start the "accept" asynchronously. */
273  success = port->AcceptEx(port->socket->socket, sock, port->addresses, 0,
274  addrlen, addrlen, &bytes_received,
275  &port->socket->read_info.overlapped);
276 
277  /* It is possible to get an accept immediately without delay. However, we
278  will still get an IOCP notification for it. So let's just ignore it. */
279  if (!success) {
280  int last_error = WSAGetLastError();
281  if (last_error != ERROR_IO_PENDING) {
282  error = GRPC_WSA_ERROR(last_error, "AcceptEx");
283  goto failure;
284  }
285  }
286 
287  /* We're ready to do the accept. Calling grpc_socket_notify_on_read may
288  immediately process an accept that happened in the meantime. */
289  port->new_socket = sock;
290  grpc_socket_notify_on_read(port->socket, &port->on_accept);
291  port->outstanding_calls++;
292  return error;
293 
294 failure:
296  if (sock != INVALID_SOCKET) closesocket(sock);
297  return error;
298 }
299 
300 /* Event manager callback when reads are ready. */
301 static void on_accept(void* arg, grpc_error_handle error) {
303  SOCKET sock = sp->new_socket;
304  grpc_winsocket_callback_info* info = &sp->socket->read_info;
305  grpc_endpoint* ep = NULL;
306  grpc_resolved_address peer_name;
307  DWORD transfered_bytes;
308  DWORD flags;
309  BOOL wsa_success;
310  int err;
311 
312  gpr_mu_lock(&sp->server->mu);
313 
314  peer_name.len = sizeof(struct sockaddr_storage);
315 
316  /* The general mechanism for shutting down is to queue abortion calls. While
317  this is necessary in the read/write case, it's useless for the accept
318  case. We only need to adjust the pending callback count */
319  if (!GRPC_ERROR_IS_NONE(error)) {
320  gpr_log(GPR_INFO, "Skipping on_accept due to error: %s",
322 
323  gpr_mu_unlock(&sp->server->mu);
324  return;
325  }
326  /* The IOCP notified us of a completed operation. Let's grab the results,
327  and act accordingly. */
328  transfered_bytes = 0;
329  wsa_success = WSAGetOverlappedResult(sock, &info->overlapped,
330  &transfered_bytes, FALSE, &flags);
331  if (!wsa_success) {
332  if (!sp->shutting_down) {
333  char* utf8_message = gpr_format_message(WSAGetLastError());
334  gpr_log(GPR_ERROR, "on_accept error: %s", utf8_message);
335  gpr_free(utf8_message);
336  }
337  closesocket(sock);
338  } else {
339  if (!sp->shutting_down) {
340  err = setsockopt(sock, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
341  (char*)&sp->socket->socket, sizeof(sp->socket->socket));
342  if (err) {
343  char* utf8_message = gpr_format_message(WSAGetLastError());
344  gpr_log(GPR_ERROR, "setsockopt error: %s", utf8_message);
345  gpr_free(utf8_message);
346  }
347  int peer_name_len = (int)peer_name.len;
348  err = getpeername(sock, (grpc_sockaddr*)peer_name.addr, &peer_name_len);
349  peer_name.len = (size_t)peer_name_len;
350  std::string peer_name_string;
351  if (!err) {
352  auto addr_uri = grpc_sockaddr_to_uri(&peer_name);
353  if (addr_uri.ok()) {
354  peer_name_string = addr_uri.value();
355  } else {
356  gpr_log(GPR_ERROR, "invalid peer name: %s",
357  addr_uri.status().ToString().c_str());
358  }
359  } else {
360  char* utf8_message = gpr_format_message(WSAGetLastError());
361  gpr_log(GPR_ERROR, "getpeername error: %s", utf8_message);
362  gpr_free(utf8_message);
363  }
364  std::string fd_name = absl::StrCat("tcp_server:", peer_name_string);
365  ep = grpc_tcp_create(grpc_winsocket_create(sock, fd_name.c_str()),
366  sp->server->channel_args, peer_name_string);
367  } else {
368  closesocket(sock);
369  }
370  }
371 
372  /* The only time we should call our callback, is where we successfully
373  managed to accept a connection, and created an endpoint. */
374  if (ep) {
375  // Create acceptor.
376  grpc_tcp_server_acceptor* acceptor =
377  (grpc_tcp_server_acceptor*)gpr_malloc(sizeof(*acceptor));
378  acceptor->from_server = sp->server;
379  acceptor->port_index = sp->port_index;
380  acceptor->fd_index = 0;
381  acceptor->external_connection = false;
382  sp->server->on_accept_cb(sp->server->on_accept_cb_arg, ep, NULL, acceptor);
383  }
384  /* As we were notified from the IOCP of one and exactly one accept,
385  the former socked we created has now either been destroy or assigned
386  to the new connection. We need to create a new one for the next
387  connection. */
388  GPR_ASSERT(GRPC_LOG_IF_ERROR("start_accept", start_accept_locked(sp)));
389  if (0 == --sp->outstanding_calls) {
390  decrement_active_ports_and_notify_locked(sp);
391  }
392  gpr_mu_unlock(&sp->server->mu);
393 }
394 
395 static grpc_error_handle add_socket_to_server(grpc_tcp_server* s, SOCKET sock,
397  unsigned port_index,
398  grpc_tcp_listener** listener) {
399  grpc_tcp_listener* sp = NULL;
400  int port = -1;
401  int status;
402  GUID guid = WSAID_ACCEPTEX;
403  DWORD ioctl_num_bytes;
404  LPFN_ACCEPTEX AcceptEx;
406 
407  /* We need to grab the AcceptEx pointer for that port, as it may be
408  interface-dependent. We'll cache it to avoid doing that again. */
409  status =
410  WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid),
411  &AcceptEx, sizeof(AcceptEx), &ioctl_num_bytes, NULL, NULL);
412 
413  if (status != 0) {
414  char* utf8_message = gpr_format_message(WSAGetLastError());
415  gpr_log(GPR_ERROR, "on_connect error: %s", utf8_message);
416  gpr_free(utf8_message);
417  closesocket(sock);
418  return GRPC_ERROR_NONE;
419  }
420 
421  error = prepare_socket(sock, addr, &port);
422  if (!GRPC_ERROR_IS_NONE(error)) {
423  return error;
424  }
425 
426  GPR_ASSERT(port >= 0);
427  gpr_mu_lock(&s->mu);
428  GPR_ASSERT(!s->on_accept_cb && "must add ports before starting server");
430  sp->next = NULL;
431  if (s->head == NULL) {
432  s->head = sp;
433  } else {
434  s->tail->next = sp;
435  }
436  s->tail = sp;
437  sp->server = s;
438  sp->socket = grpc_winsocket_create(sock, "listener");
439  sp->shutting_down = 0;
440  sp->outstanding_calls = 0;
441  sp->AcceptEx = AcceptEx;
442  sp->new_socket = INVALID_SOCKET;
443  sp->port = port;
444  sp->port_index = port_index;
445  GRPC_CLOSURE_INIT(&sp->on_accept, on_accept, sp, grpc_schedule_on_exec_ctx);
446  GPR_ASSERT(sp->socket);
447  gpr_mu_unlock(&s->mu);
448  *listener = sp;
449 
450  return GRPC_ERROR_NONE;
451 }
452 
453 static grpc_error_handle tcp_server_add_port(grpc_tcp_server* s,
455  int* port) {
456  grpc_tcp_listener* sp = NULL;
457  SOCKET sock;
458  grpc_resolved_address addr6_v4mapped;
459  grpc_resolved_address wildcard;
460  grpc_resolved_address* allocated_addr = NULL;
461  grpc_resolved_address sockname_temp;
462  unsigned port_index = 0;
464 
465  if (s->tail != NULL) {
466  port_index = s->tail->port_index + 1;
467  }
468 
469  /* Check if this is a wildcard port, and if so, try to keep the port the same
470  as some previously created listener. */
471  if (grpc_sockaddr_get_port(addr) == 0) {
472  for (sp = s->head; sp; sp = sp->next) {
473  int sockname_temp_len = sizeof(struct sockaddr_storage);
474  if (0 == getsockname(sp->socket->socket,
475  (grpc_sockaddr*)sockname_temp.addr,
476  &sockname_temp_len)) {
477  sockname_temp.len = (size_t)sockname_temp_len;
478  *port = grpc_sockaddr_get_port(&sockname_temp);
479  if (*port > 0) {
480  allocated_addr =
482  memcpy(allocated_addr, addr, sizeof(grpc_resolved_address));
483  grpc_sockaddr_set_port(allocated_addr, *port);
484  addr = allocated_addr;
485  break;
486  }
487  }
488  }
489  }
490 
491  if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) {
492  addr = &addr6_v4mapped;
493  }
494 
495  /* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */
497  grpc_sockaddr_make_wildcard6(*port, &wildcard);
498 
499  addr = &wildcard;
500  }
501 
502  sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
503  grpc_get_default_wsa_socket_flags());
504  if (sock == INVALID_SOCKET) {
505  error = GRPC_WSA_ERROR(WSAGetLastError(), "WSASocket");
506  goto done;
507  }
508 
509  error = add_socket_to_server(s, sock, addr, port_index, &sp);
510 
511 done:
512  gpr_free(allocated_addr);
513 
514  if (!GRPC_ERROR_IS_NONE(error)) {
515  grpc_error_handle error_out =
517  "Failed to add port to server", &error, 1);
519  error = error_out;
520  *port = -1;
521  } else {
522  GPR_ASSERT(sp != NULL);
523  *port = sp->port;
524  }
525  return error;
526 }
527 
528 static void tcp_server_start(grpc_tcp_server* s,
529  const std::vector<grpc_pollset*>* /*pollsets*/,
530  grpc_tcp_server_cb on_accept_cb,
531  void* on_accept_cb_arg) {
532  grpc_tcp_listener* sp;
533  GPR_ASSERT(on_accept_cb);
534  gpr_mu_lock(&s->mu);
535  GPR_ASSERT(!s->on_accept_cb);
536  GPR_ASSERT(s->active_ports == 0);
537  s->on_accept_cb = on_accept_cb;
538  s->on_accept_cb_arg = on_accept_cb_arg;
539  for (sp = s->head; sp; sp = sp->next) {
540  GPR_ASSERT(GRPC_LOG_IF_ERROR("start_accept", start_accept_locked(sp)));
541  s->active_ports++;
542  }
543  gpr_mu_unlock(&s->mu);
544 }
545 
546 static unsigned tcp_server_port_fd_count(grpc_tcp_server* s,
547  unsigned port_index) {
548  return 0;
549 }
550 
551 static int tcp_server_port_fd(grpc_tcp_server* s, unsigned port_index,
552  unsigned fd_index) {
553  return -1;
554 }
555 
556 static grpc_core::TcpServerFdHandler* tcp_server_create_fd_handler(
557  grpc_tcp_server* s) {
558  return nullptr;
559 }
560 
561 static void tcp_server_shutdown_listeners(grpc_tcp_server* s) {}
562 
563 grpc_tcp_server_vtable grpc_windows_tcp_server_vtable = {
564  tcp_server_create, tcp_server_start,
565  tcp_server_add_port, tcp_server_create_fd_handler,
566  tcp_server_port_fd_count, tcp_server_port_fd,
567  tcp_server_ref, tcp_server_shutdown_starting_add,
568  tcp_server_unref, tcp_server_shutdown_listeners};
569 #endif /* GRPC_WINSOCK_SOCKET */
GRPC_CLOSURE_INIT
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
Definition: closure.h:115
grpc_tcp_server_shutdown_listeners
void grpc_tcp_server_shutdown_listeners(grpc_tcp_server *s)
Definition: tcp_server.cc:71
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
grpc_core::TcpServerFdHandler
Definition: tcp_server.h:57
gpr_mu_unlock
GPRAPI void gpr_mu_unlock(gpr_mu *mu)
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
log.h
sockaddr_utils.h
AF_INET6
#define AF_INET6
Definition: ares_setup.h:208
pollset_windows.h
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
grpc_core::ExecCtx::RunList
static void RunList(const DebugLocation &location, grpc_closure_list *list)
Definition: exec_ctx.cc:129
grpc_tcp_server::on_accept_cb
grpc_tcp_server_cb on_accept_cb
Definition: tcp_server_utils_posix.h:56
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
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
error_ref_leak.err
err
Definition: error_ref_leak.py:35
bytes_received
static int bytes_received
Definition: test-callback-stack.c:44
gpr_format_message
GPRAPI char * gpr_format_message(int messageid)
grpc_resolved_address
Definition: resolved_address.h:34
gpr_malloc
GPRAPI void * gpr_malloc(size_t size)
Definition: alloc.cc:29
grpc_tcp_server_acceptor::fd_index
unsigned fd_index
Definition: tcp_server.h:42
GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(desc, errs, count)
Definition: error.h:307
grpc_tcp_server
Definition: tcp_server_utils_posix.h:53
status
absl::Status status
Definition: rls.cc:251
socket_windows.h
absl::FormatConversionChar::s
@ s
GRPC_LOG_IF_ERROR
#define GRPC_LOG_IF_ERROR(what, error)
Definition: error.h:398
time.h
GRPC_ERROR_INT_FD
@ GRPC_ERROR_INT_FD
File descriptor associated with this error.
Definition: error.h:86
grpc_tcp_listener::server
grpc_tcp_server * server
Definition: tcp_server_utils_posix.h:34
GRPC_CLOSURE_CREATE
#define GRPC_CLOSURE_CREATE(cb, cb_arg, scheduler)
Definition: closure.h:160
sockaddr.h
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
new_socket
static int new_socket(uv_tcp_t *handle, int domain, unsigned long flags)
Definition: unix/tcp.c:31
iocp_windows.h
grpc_channel_args
Definition: grpc_types.h:132
grpc_tcp_listener::next
struct grpc_tcp_listener * next
Definition: tcp_server_utils_posix.h:41
gpr_refcount
Definition: impl/codegen/sync_generic.h:39
BOOL
int BOOL
Definition: undname.c:46
grpc_tcp_server_cb
void(* grpc_tcp_server_cb)(void *arg, grpc_endpoint *ep, grpc_pollset *accepting_pollset, grpc_tcp_server_acceptor *acceptor)
Definition: tcp_server.h:51
grpc_closure_list_append
bool grpc_closure_list_append(grpc_closure_list *closure_list, grpc_closure *closure)
Definition: closure.h:176
WSAID_ACCEPTEX
#define WSAID_ACCEPTEX
Definition: win.h:109
grpc_error_set_str
grpc_error_handle grpc_error_set_str(grpc_error_handle src, grpc_error_strs which, absl::string_view str)
Definition: error.cc:650
GRPC_ERROR_STR_TARGET_ADDRESS
@ GRPC_ERROR_STR_TARGET_ADDRESS
peer that we were trying to communicate when this error occurred
Definition: error.h:117
gpr_mu_destroy
GPRAPI void gpr_mu_destroy(gpr_mu *mu)
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
GRPC_WSA_ERROR
#define GRPC_WSA_ERROR(err, call_name)
windows only: create an error associated with WSAGetLastError()!=0
Definition: error.h:357
string_util.h
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
xds_interop_client.int
int
Definition: xds_interop_client.py:113
grpc_tcp_server::channel_args
grpc_channel_args * channel_args
Definition: tcp_server_utils_posix.h:94
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
grpc_tcp_server::shutdown_starting
grpc_closure_list shutdown_starting
Definition: tcp_server_utils_posix.h:81
grpc_tcp_server::refs
gpr_refcount refs
Definition: tcp_server_utils_posix.h:54
grpc_sockaddr_set_port
int grpc_sockaddr_set_port(grpc_resolved_address *resolved_addr, int port)
Definition: sockaddr_utils.cc:324
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
gpr_mu_init
GPRAPI void gpr_mu_init(gpr_mu *mu)
grpc_tcp_create
grpc_endpoint * grpc_tcp_create(grpc_fd *fd, const grpc_channel_args *args, absl::string_view peer_string)
grpc_tcp_server::active_ports
size_t active_ports
Definition: tcp_server_utils_posix.h:62
done
struct tab * done
Definition: bloaty/third_party/zlib/examples/enough.c:176
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
arg
Definition: cmdline.cc:40
grpc_tcp_server::mu
gpr_mu mu
Definition: tcp_server_utils_posix.h:59
grpc_channel_args_copy
grpc_channel_args * grpc_channel_args_copy(const grpc_channel_args *src)
Definition: channel_args.cc:285
grpc_tcp_listener
Definition: tcp_server_utils_posix.h:31
intptr_t
_W64 signed int intptr_t
Definition: stdint-msvc2008.h:118
gpr_mu_lock
GPRAPI void gpr_mu_lock(gpr_mu *mu)
grpc_resolved_address::len
socklen_t len
Definition: resolved_address.h:36
slice_internal.h
grpc_tcp_server_acceptor::from_server
grpc_tcp_server * from_server
Definition: tcp_server.h:39
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
grpc_sockaddr_to_v4mapped
int grpc_sockaddr_to_v4mapped(const grpc_resolved_address *resolved_addr, grpc_resolved_address *resolved_addr6_out)
Definition: sockaddr_utils.cc:111
grpc_closure_list
Definition: closure.h:41
tests.unit._exit_scenarios.port
port
Definition: _exit_scenarios.py:179
grpc_tcp_listener::port_index
unsigned port_index
Definition: tcp_server_utils_posix.h:37
tcp_windows.h
grpc_tcp_server_acceptor::port_index
unsigned port_index
Definition: tcp_server.h:41
grpc_sockaddr_get_port
int grpc_sockaddr_get_port(const grpc_resolved_address *resolved_addr)
Definition: sockaddr_utils.cc:303
FALSE
const BOOL FALSE
Definition: undname.c:47
grpc_tcp_server_acceptor::external_connection
bool external_connection
Definition: tcp_server.h:44
LPFN_ACCEPTEX
BOOL(PASCAL * LPFN_ACCEPTEX)(SOCKET sListenSocket, SOCKET sAcceptSocket, PVOID lpOutputBuffer, DWORD dwReceiveDataLength, DWORD dwLocalAddressLength, DWORD dwRemoteAddressLength, LPDWORD lpdwBytesReceived, LPOVERLAPPED lpOverlapped)
Definition: win.h:130
grpc_error_set_int
grpc_error_handle grpc_error_set_int(grpc_error_handle src, grpc_error_ints which, intptr_t value)
Definition: error.cc:613
grpc_tcp_server::on_accept_cb_arg
void * on_accept_cb_arg
Definition: tcp_server_utils_posix.h:57
gpr_ref_non_zero
GPRAPI void gpr_ref_non_zero(gpr_refcount *r)
Definition: sync.cc:90
absl::flags_internal
Definition: abseil-cpp/absl/flags/commandlineflag.h:40
server
Definition: examples/python/async_streaming/server.py:1
gpr_mu
pthread_mutex_t gpr_mu
Definition: impl/codegen/sync_posix.h:47
grpc_tcp_server_acceptor
Definition: tcp_server.h:36
port.h
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
http2_test_server.listen
def listen(endpoint, test_case)
Definition: http2_test_server.py:87
grpc_tcp_server::head
grpc_tcp_listener * head
Definition: tcp_server_utils_posix.h:76
alloc.h
on_accept
static void on_accept(void *arg, grpc_endpoint *endpoint, grpc_pollset *, grpc_tcp_server_acceptor *acceptor)
Definition: http_proxy_fixture.cc:567
grpc_tcp_server::tail
grpc_tcp_listener * tail
Definition: tcp_server_utils_posix.h:77
grpc_sockaddr_make_wildcard6
void grpc_sockaddr_make_wildcard6(int port, grpc_resolved_address *resolved_wild_out)
Definition: sockaddr_utils.cc:183
log_windows.h
GRPC_ERROR_UNREF
#define GRPC_ERROR_UNREF(err)
Definition: error.h:262
grpc_core::ExecCtx::Run
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
Definition: exec_ctx.cc:98
grpc_tcp_server::shutdown_complete
grpc_closure * shutdown_complete
Definition: tcp_server_utils_posix.h:84
channel_args.h
test_server.socket
socket
Definition: test_server.py:65
closesocket
static int closesocket(int sock)
Definition: bio_test.cc:46
flags
uint32_t flags
Definition: retry_filter.cc:632
gpr_ref_init
GPRAPI void gpr_ref_init(gpr_refcount *r, int n)
Definition: sync.cc:86
grpc_sockaddr_is_wildcard
int grpc_sockaddr_is_wildcard(const grpc_resolved_address *resolved_addr, int *port_out)
Definition: sockaddr_utils.cc:132
gpr_unref
GPRAPI int gpr_unref(gpr_refcount *r)
Definition: sync.cc:103
grpc_error
Definition: error_internal.h:42
tcp_server.h
sync.h
grpc_closure
Definition: closure.h:56
grpc_sockaddr_to_uri
absl::StatusOr< std::string > grpc_sockaddr_to_uri(const grpc_resolved_address *resolved_addr)
Definition: sockaddr_utils.cc:260
grpc_tcp_server_vtable
Definition: tcp_server.h:65
grpc_resolved_address::addr
char addr[GRPC_MAX_SOCKADDR_SIZE]
Definition: resolved_address.h:35
grpc_endpoint
Definition: endpoint.h:105
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
grpc_tcp_listener::port
int port
Definition: tcp_server_utils_posix.h:36
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
port_platform.h


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:25