From 5eb4e1caef902d65df7c7d519b2c2890998d153f Mon Sep 17 00:00:00 2001 From: Nicolas Noble Date: Wed, 18 Nov 2015 17:19:45 -0800 Subject: [PATCH 01/13] Adding grpc_tcp_listener as an actual object being returned. --- src/core/iomgr/tcp_server.h | 20 ++-- src/core/iomgr/tcp_server_posix.c | 136 +++++++++++++++-------- src/core/iomgr/tcp_server_windows.c | 111 ++++++++++-------- src/core/security/server_secure_chttp2.c | 4 +- src/core/surface/server_chttp2.c | 4 +- test/core/util/reconnect_server.c | 4 +- 6 files changed, 177 insertions(+), 102 deletions(-) diff --git a/src/core/iomgr/tcp_server.h b/src/core/iomgr/tcp_server.h index 882635f6388..3df36174e7b 100644 --- a/src/core/iomgr/tcp_server.h +++ b/src/core/iomgr/tcp_server.h @@ -39,6 +39,9 @@ /* Forward decl of grpc_tcp_server */ typedef struct grpc_tcp_server grpc_tcp_server; +/* Forward decl of grpc_tcp_listener */ +typedef struct grpc_tcp_listener grpc_tcp_listener; + /* Called for newly connected TCP connections. */ typedef void (*grpc_tcp_server_cb)(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *ep); @@ -51,19 +54,18 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *server, grpc_pollset **pollsets, size_t pollset_count, grpc_tcp_server_cb on_accept_cb, void *cb_arg); -/* Add a port to the server, returning port number on success, or negative - on failure. +/* Add a port to the server, returning the newly created listener on success, + or a null pointer on failure. The :: and 0.0.0.0 wildcard addresses are treated identically, accepting both IPv4 and IPv6 connections, but :: is the preferred style. This usually creates one socket, but possibly two on systems which support IPv6, - but not dualstack sockets. - - For raw access to the underlying sockets, see grpc_tcp_server_get_fd(). */ + but not dualstack sockets. */ /* TODO(ctiller): deprecate this, and make grpc_tcp_server_add_ports to handle all of the multiple socket port matching logic in one place */ -int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, - size_t addr_len); +grpc_tcp_listener *grpc_tcp_server_add_port(grpc_tcp_server *s, + const void *addr, + size_t addr_len); /* Returns the file descriptor of the Nth listening socket on this server, or -1 if the index is out of bounds. @@ -75,4 +77,8 @@ int grpc_tcp_server_get_fd(grpc_tcp_server *s, unsigned index); void grpc_tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *server, grpc_closure *closure); +int grpc_tcp_listener_get_port(grpc_tcp_listener *listener); +void grpc_tcp_listener_ref(grpc_tcp_listener *listener); +void grpc_tcp_listener_unref(grpc_tcp_listener *listener); + #endif /* GRPC_INTERNAL_CORE_IOMGR_TCP_SERVER_H */ diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c index 99c76dcbe9a..3dab652efa3 100644 --- a/src/core/iomgr/tcp_server_posix.c +++ b/src/core/iomgr/tcp_server_posix.c @@ -74,7 +74,7 @@ static gpr_once s_init_max_accept_queue_size; static int s_max_accept_queue_size; /* one listening port */ -typedef struct { +typedef struct server_port { int fd; grpc_fd *emfd; grpc_tcp_server *server; @@ -84,8 +84,13 @@ typedef struct { struct sockaddr_un un; } addr; size_t addr_len; + int port; grpc_closure read_closure; grpc_closure destroyed_closure; + gpr_refcount refs; + struct server_port *next; + struct server_port *dual_stack_second_port; + int is_dual_stack_second_port; } server_port; static void unlink_if_unix_domain_socket(const struct sockaddr_un *un) { @@ -112,10 +117,9 @@ struct grpc_tcp_server { /* is this server shutting down? (boolean) */ int shutdown; - /* all listening ports */ - server_port *ports; - size_t nports; - size_t port_capacity; + /* linked list of server ports */ + server_port *head; + unsigned nports; /* shutdown callback */ grpc_closure *shutdown_complete; @@ -134,18 +138,22 @@ grpc_tcp_server *grpc_tcp_server_create(void) { s->shutdown = 0; s->on_accept_cb = NULL; s->on_accept_cb_arg = NULL; - s->ports = gpr_malloc(sizeof(server_port) * INIT_PORT_CAP); + s->head = NULL; s->nports = 0; - s->port_capacity = INIT_PORT_CAP; return s; } static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { + server_port *sp; + grpc_exec_ctx_enqueue(exec_ctx, s->shutdown_complete, 1); gpr_mu_destroy(&s->mu); - gpr_free(s->ports); + for (sp = s->head; sp; sp = sp->next) { + grpc_tcp_listener_unref((grpc_tcp_listener *)sp); + } + gpr_free(s); } @@ -166,8 +174,6 @@ static void destroyed_port(grpc_exec_ctx *exec_ctx, void *server, int success) { events will be received on them - at this point it's safe to destroy things */ static void deactivated_all_ports(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { - size_t i; - /* delete ALL the things */ gpr_mu_lock(&s->mu); @@ -176,9 +182,9 @@ static void deactivated_all_ports(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { return; } - if (s->nports) { - for (i = 0; i < s->nports; i++) { - server_port *sp = &s->ports[i]; + if (s->head) { + server_port *sp; + for (sp = s->head; sp; sp = sp->next) { if (sp->addr.sockaddr.sa_family == AF_UNIX) { unlink_if_unix_domain_socket(&sp->addr.un); } @@ -196,7 +202,6 @@ static void deactivated_all_ports(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { void grpc_tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, grpc_closure *closure) { - size_t i; gpr_mu_lock(&s->mu); GPR_ASSERT(!s->shutdown); @@ -206,8 +211,9 @@ void grpc_tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, /* shutdown all fd's */ if (s->active_ports) { - for (i = 0; i < s->nports; i++) { - grpc_fd_shutdown(exec_ctx, s->ports[i].emfd); + server_port *sp; + for (sp = s->head; sp; sp = sp->next) { + grpc_fd_shutdown(exec_ctx, sp->emfd); } gpr_mu_unlock(&s->mu); } else { @@ -364,9 +370,10 @@ error: } } -static int add_socket_to_server(grpc_tcp_server *s, int fd, - const struct sockaddr *addr, size_t addr_len) { - server_port *sp; +static server_port *add_socket_to_server(grpc_tcp_server *s, int fd, + const struct sockaddr *addr, + size_t addr_len) { + server_port *sp = NULL; int port; char *addr_str; char *name; @@ -376,32 +383,35 @@ static int add_socket_to_server(grpc_tcp_server *s, int fd, grpc_sockaddr_to_string(&addr_str, (struct sockaddr *)&addr, 1); gpr_asprintf(&name, "tcp-server-listener:%s", addr_str); gpr_mu_lock(&s->mu); + s->nports++; GPR_ASSERT(!s->on_accept_cb && "must add ports before starting server"); - /* append it to the list under a lock */ - if (s->nports == s->port_capacity) { - s->port_capacity *= 2; - s->ports = gpr_realloc(s->ports, sizeof(server_port) * s->port_capacity); - } - sp = &s->ports[s->nports++]; + sp = gpr_malloc(sizeof(server_port)); + sp->next = s->head; + s->head = sp; sp->server = s; sp->fd = fd; sp->emfd = grpc_fd_create(fd, name); memcpy(sp->addr.untyped, addr, addr_len); sp->addr_len = addr_len; + sp->port = port; + sp->is_dual_stack_second_port = 0; + sp->dual_stack_second_port = NULL; + gpr_ref_init(&sp->refs, 1); GPR_ASSERT(sp->emfd); gpr_mu_unlock(&s->mu); gpr_free(addr_str); gpr_free(name); } - return port; + return sp; } -int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, - size_t addr_len) { - int allocated_port1 = -1; - int allocated_port2 = -1; - unsigned i; +grpc_tcp_listener *grpc_tcp_server_add_port(grpc_tcp_server *s, + const void *addr, + size_t addr_len) { + int allocated_port = -1; + server_port *sp; + server_port *sp2 = NULL; int fd; grpc_dualstack_mode dsmode; struct sockaddr_in6 addr6_v4mapped; @@ -420,9 +430,9 @@ int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, /* Check if this is a wildcard port, and if so, try to keep the port the same as some previously created listener. */ if (grpc_sockaddr_get_port(addr) == 0) { - for (i = 0; i < s->nports; i++) { + for (sp = s->head; sp; sp = sp->next) { sockname_len = sizeof(sockname_temp); - if (0 == getsockname(s->ports[i].fd, (struct sockaddr *)&sockname_temp, + if (0 == getsockname(sp->fd, (struct sockaddr *)&sockname_temp, &sockname_len)) { port = grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp); if (port > 0) { @@ -436,6 +446,8 @@ int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, } } + sp = NULL; + if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) { addr = (const struct sockaddr *)&addr6_v4mapped; addr_len = sizeof(addr6_v4mapped); @@ -449,14 +461,16 @@ int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, addr = (struct sockaddr *)&wild6; addr_len = sizeof(wild6); fd = grpc_create_dualstack_socket(addr, SOCK_STREAM, 0, &dsmode); - allocated_port1 = add_socket_to_server(s, fd, addr, addr_len); + sp = add_socket_to_server(s, fd, addr, addr_len); + allocated_port = sp->port; if (fd >= 0 && dsmode == GRPC_DSMODE_DUALSTACK) { goto done; } /* If we didn't get a dualstack socket, also listen on 0.0.0.0. */ - if (port == 0 && allocated_port1 > 0) { - grpc_sockaddr_set_port((struct sockaddr *)&wild4, allocated_port1); + if (port == 0 && allocated_port > 0) { + grpc_sockaddr_set_port((struct sockaddr *)&wild4, allocated_port); + sp2 = sp; } addr = (struct sockaddr *)&wild4; addr_len = sizeof(wild4); @@ -471,22 +485,31 @@ int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, addr = (struct sockaddr *)&addr4_copy; addr_len = sizeof(addr4_copy); } - allocated_port2 = add_socket_to_server(s, fd, addr, addr_len); + sp = add_socket_to_server(s, fd, addr, addr_len); + sp->dual_stack_second_port = sp2; + if (sp2) sp2->is_dual_stack_second_port = 1; done: gpr_free(allocated_addr); - return allocated_port1 >= 0 ? allocated_port1 : allocated_port2; + return (grpc_tcp_listener *)sp; } int grpc_tcp_server_get_fd(grpc_tcp_server *s, unsigned port_index) { - return (port_index < s->nports) ? s->ports[port_index].fd : -1; + server_port *sp; + for (sp = s->head; sp && port_index != 0; sp = sp->next, port_index--); + if (port_index == 0 && sp) { + return sp->fd; + } else { + return -1; + } } void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, grpc_pollset **pollsets, size_t pollset_count, grpc_tcp_server_cb on_accept_cb, void *on_accept_cb_arg) { - size_t i, j; + size_t i; + server_port *sp; GPR_ASSERT(on_accept_cb); gpr_mu_lock(&s->mu); GPR_ASSERT(!s->on_accept_cb); @@ -495,17 +518,36 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, s->on_accept_cb_arg = on_accept_cb_arg; s->pollsets = pollsets; s->pollset_count = pollset_count; - for (i = 0; i < s->nports; i++) { - for (j = 0; j < pollset_count; j++) { - grpc_pollset_add_fd(exec_ctx, pollsets[j], s->ports[i].emfd); + for (sp = s->head; sp; sp = sp->next) { + for (i = 0; i < pollset_count; i++) { + grpc_pollset_add_fd(exec_ctx, pollsets[i], sp->emfd); } - s->ports[i].read_closure.cb = on_read; - s->ports[i].read_closure.cb_arg = &s->ports[i]; - grpc_fd_notify_on_read(exec_ctx, s->ports[i].emfd, - &s->ports[i].read_closure); + sp->read_closure.cb = on_read; + sp->read_closure.cb_arg = sp; + grpc_fd_notify_on_read(exec_ctx, sp->emfd, + &sp->read_closure); s->active_ports++; } gpr_mu_unlock(&s->mu); } +int grpc_tcp_listener_get_port(grpc_tcp_listener *listener) { + server_port *sp = (server_port *)listener; + return sp->port; +} + +void grpc_tcp_listener_ref(grpc_tcp_listener *listener) { + server_port *sp = (server_port *)listener; + gpr_ref(&sp->refs); +} + +void grpc_tcp_listener_unref(grpc_tcp_listener *listener) { + server_port *sp = (server_port *)listener; + if (sp->is_dual_stack_second_port) return; + if (gpr_unref(&sp->refs)) { + if (sp->dual_stack_second_port) gpr_free(sp->dual_stack_second_port); + gpr_free(listener); + } +} + #endif diff --git a/src/core/iomgr/tcp_server_windows.c b/src/core/iomgr/tcp_server_windows.c index 3fea8b5b350..c7a9fffa101 100644 --- a/src/core/iomgr/tcp_server_windows.c +++ b/src/core/iomgr/tcp_server_windows.c @@ -35,7 +35,8 @@ #ifdef GPR_WINSOCK_SOCKET -#define _GNU_SOURCE +#include + #include "src/core/iomgr/sockaddr_utils.h" #include @@ -51,7 +52,6 @@ #include "src/core/iomgr/tcp_server.h" #include "src/core/iomgr/tcp_windows.h" -#define INIT_PORT_CAP 2 #define MIN_SAFE_ACCEPT_QUEUE_SIZE 100 /* one listening port */ @@ -61,14 +61,19 @@ typedef struct server_port { gpr_uint8 addresses[(sizeof(struct sockaddr_in6) + 16) * 2]; /* This will hold the socket for the next accept. */ SOCKET new_socket; - /* The listener winsocked. */ + /* The listener winsocket. */ grpc_winsocket *socket; + /* The actual TCP port number. */ + int port; grpc_tcp_server *server; /* The cached AcceptEx for that port. */ LPFN_ACCEPTEX AcceptEx; int shutting_down; /* closure for socket notification of accept being ready */ grpc_closure on_accept; + gpr_refcount refs; + /* linked list */ + struct server_port *next; } server_port; /* the overall server */ @@ -82,10 +87,8 @@ struct grpc_tcp_server { /* active port count: how many ports are actually still listening */ int active_ports; - /* all listening ports */ - server_port *ports; - size_t nports; - size_t port_capacity; + /* linked list of server ports */ + server_port *head; /* shutdown callback */ grpc_closure *shutdown_complete; @@ -99,9 +102,7 @@ grpc_tcp_server *grpc_tcp_server_create(void) { s->active_ports = 0; s->on_accept_cb = NULL; s->on_accept_cb_arg = NULL; - s->ports = gpr_malloc(sizeof(server_port) * INIT_PORT_CAP); - s->nports = 0; - s->port_capacity = INIT_PORT_CAP; + s->head = NULL; s->shutdown_complete = NULL; return s; } @@ -109,26 +110,26 @@ grpc_tcp_server *grpc_tcp_server_create(void) { static void dont_care_about_shutdown_completion(void *arg) {} static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { - size_t i; - grpc_exec_ctx_enqueue(exec_ctx, s->shutdown_complete, 1); /* Now that the accepts have been aborted, we can destroy the sockets. The IOCP won't get notified on these, so we can flag them as already closed by the system. */ - for (i = 0; i < s->nports; i++) { - server_port *sp = &s->ports[i]; + while (s->head) { + server_port *sp = s->head; + s->head = sp->next; + sp->next = NULL; grpc_winsocket_destroy(sp->socket); + grpc_tcp_listener_unref((grpc_tcp_listener *) sp); } - gpr_free(s->ports); gpr_free(s); } /* Public function. Stops and destroys a grpc_tcp_server. */ void grpc_tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, grpc_closure *shutdown_complete) { - size_t i; int immediately_done = 0; + server_port *sp; gpr_mu_lock(&s->mu); s->shutdown_complete = shutdown_complete; @@ -138,8 +139,7 @@ void grpc_tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, if (s->active_ports == 0) { immediately_done = 1; } - for (i = 0; i < s->nports; i++) { - server_port *sp = &s->ports[i]; + for (sp = s->head; sp; sp = sp->next) { sp->shutting_down = 1; grpc_winsocket_shutdown(sp->socket); } @@ -351,16 +351,17 @@ static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, int from_iocp) { start_accept(exec_ctx, sp); } -static int add_socket_to_server(grpc_tcp_server *s, SOCKET sock, - const struct sockaddr *addr, size_t addr_len) { - server_port *sp; +static server_port *add_socket_to_server(grpc_tcp_server *s, SOCKET sock, + const struct sockaddr *addr, + size_t addr_len) { + server_port *sp = NULL; int port; int status; GUID guid = WSAID_ACCEPTEX; DWORD ioctl_num_bytes; LPFN_ACCEPTEX AcceptEx; - if (sock == INVALID_SOCKET) return -1; + if (sock == INVALID_SOCKET) return NULL; /* We need to grab the AcceptEx pointer for that port, as it may be interface-dependent. We'll cache it to avoid doing that again. */ @@ -373,37 +374,35 @@ static int add_socket_to_server(grpc_tcp_server *s, SOCKET sock, gpr_log(GPR_ERROR, "on_connect error: %s", utf8_message); gpr_free(utf8_message); closesocket(sock); - return -1; + return NULL; } port = prepare_socket(sock, addr, addr_len); if (port >= 0) { gpr_mu_lock(&s->mu); GPR_ASSERT(!s->on_accept_cb && "must add ports before starting server"); - /* append it to the list under a lock */ - if (s->nports == s->port_capacity) { - /* too many ports, and we need to store their address in a closure */ - /* TODO(ctiller): make server_port a linked list */ - abort(); - } - sp = &s->ports[s->nports++]; + sp = gpr_malloc(sizeof(server_port)); + sp->next = s->head; + s->head = sp; sp->server = s; sp->socket = grpc_winsocket_create(sock, "listener"); sp->shutting_down = 0; sp->AcceptEx = AcceptEx; sp->new_socket = INVALID_SOCKET; + sp->port = port; + gpr_ref_init(&sp->refs, 1); grpc_closure_init(&sp->on_accept, on_accept, sp); GPR_ASSERT(sp->socket); gpr_mu_unlock(&s->mu); } - return port; + return sp; } -int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, - size_t addr_len) { - int allocated_port = -1; - unsigned i; +grpc_tcp_listener *grpc_tcp_server_add_port(grpc_tcp_server *s, + const void *addr, + size_t addr_len) { + server_port *sp; SOCKET sock; struct sockaddr_in6 addr6_v4mapped; struct sockaddr_in6 wildcard; @@ -415,9 +414,9 @@ int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, /* Check if this is a wildcard port, and if so, try to keep the port the same as some previously created listener. */ if (grpc_sockaddr_get_port(addr) == 0) { - for (i = 0; i < s->nports; i++) { + for (sp = s->head; sp; sp = sp->next) { sockname_len = sizeof(sockname_temp); - if (0 == getsockname(s->ports[i].socket->socket, + if (0 == getsockname(sp->socket->socket, (struct sockaddr *)&sockname_temp, &sockname_len)) { port = grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp); if (port > 0) { @@ -452,33 +451,55 @@ int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, gpr_free(utf8_message); } - allocated_port = add_socket_to_server(s, sock, addr, addr_len); + sp = add_socket_to_server(s, sock, addr, addr_len); gpr_free(allocated_addr); - return allocated_port; + return (grpc_tcp_listener *)sp; } -SOCKET -grpc_tcp_server_get_socket(grpc_tcp_server *s, unsigned index) { - return (index < s->nports) ? s->ports[index].socket->socket : INVALID_SOCKET; +int grpc_tcp_server_get_fd(grpc_tcp_server *s, unsigned port_index) { + server_port *sp; + for (sp = s->head; sp && port_index != 0; sp = sp->next, port_index--); + if (port_index == 0 && sp) { + return _open_osfhandle(sp->socket->socket, 0); + } else { + return -1; + } } void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, grpc_pollset **pollset, size_t pollset_count, grpc_tcp_server_cb on_accept_cb, void *on_accept_cb_arg) { - size_t i; + server_port *sp; GPR_ASSERT(on_accept_cb); gpr_mu_lock(&s->mu); GPR_ASSERT(!s->on_accept_cb); GPR_ASSERT(s->active_ports == 0); s->on_accept_cb = on_accept_cb; s->on_accept_cb_arg = on_accept_cb_arg; - for (i = 0; i < s->nports; i++) { - start_accept(exec_ctx, s->ports + i); + for (sp = s->head; sp; sp = sp->next) { + start_accept(exec_ctx, sp); s->active_ports++; } gpr_mu_unlock(&s->mu); } +int grpc_tcp_listener_get_port(grpc_tcp_listener *listener) { + server_port *sp = (server_port *)listener; + return sp->port; +} + +void grpc_tcp_listener_ref(grpc_tcp_listener *listener) { + server_port *sp = (server_port *)listener; + gpr_ref(&sp->refs); +} + +void grpc_tcp_listener_unref(grpc_tcp_listener *listener) { + server_port *sp = (server_port *)listener; + if (gpr_unref(&sp->refs)) { + gpr_free(listener); + } +} + #endif /* GPR_WINSOCK_SOCKET */ diff --git a/src/core/security/server_secure_chttp2.c b/src/core/security/server_secure_chttp2.c index 851e0cfab31..1ea269bf8f0 100644 --- a/src/core/security/server_secure_chttp2.c +++ b/src/core/security/server_secure_chttp2.c @@ -249,9 +249,11 @@ int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr, } for (i = 0; i < resolved->naddrs; i++) { - port_temp = grpc_tcp_server_add_port( + grpc_tcp_listener *listener; + listener = grpc_tcp_server_add_port( tcp, (struct sockaddr *)&resolved->addrs[i].addr, resolved->addrs[i].len); + port_temp = grpc_tcp_listener_get_port(listener); if (port_temp >= 0) { if (port_num == -1) { port_num = port_temp; diff --git a/src/core/surface/server_chttp2.c b/src/core/surface/server_chttp2.c index 580b91573c2..1408f9c1592 100644 --- a/src/core/surface/server_chttp2.c +++ b/src/core/surface/server_chttp2.c @@ -107,9 +107,11 @@ int grpc_server_add_insecure_http2_port(grpc_server *server, const char *addr) { } for (i = 0; i < resolved->naddrs; i++) { - port_temp = grpc_tcp_server_add_port( + grpc_tcp_listener *listener; + listener = grpc_tcp_server_add_port( tcp, (struct sockaddr *)&resolved->addrs[i].addr, resolved->addrs[i].len); + port_temp = grpc_tcp_listener_get_port(listener); if (port_temp >= 0) { if (port_num == -1) { port_num = port_temp; diff --git a/test/core/util/reconnect_server.c b/test/core/util/reconnect_server.c index ee481ef6749..c064fb32c6e 100644 --- a/test/core/util/reconnect_server.c +++ b/test/core/util/reconnect_server.c @@ -113,6 +113,7 @@ void reconnect_server_init(reconnect_server *server) { void reconnect_server_start(reconnect_server *server, int port) { struct sockaddr_in addr; + grpc_tcp_listener *listener; int port_added; grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; @@ -121,8 +122,9 @@ void reconnect_server_start(reconnect_server *server, int port) { memset(&addr.sin_addr, 0, sizeof(addr.sin_addr)); server->tcp_server = grpc_tcp_server_create(); - port_added = + listener = grpc_tcp_server_add_port(server->tcp_server, &addr, sizeof(addr)); + port_added = grpc_tcp_listener_get_port(listener); GPR_ASSERT(port_added == port); grpc_tcp_server_start(&exec_ctx, server->tcp_server, server->pollsets, 1, From 8f714620b21d6c25b9d67d6d36b1e216dc8cbe94 Mon Sep 17 00:00:00 2001 From: Nicolas Noble Date: Thu, 19 Nov 2015 11:16:54 -0800 Subject: [PATCH 02/13] Renaming server_port to grpc_tcp_listener - there's no need for casting... --- src/core/iomgr/tcp_server_posix.c | 42 ++++++++++++++--------------- src/core/iomgr/tcp_server_windows.c | 40 +++++++++++++-------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c index 3dab652efa3..fbc0e974e67 100644 --- a/src/core/iomgr/tcp_server_posix.c +++ b/src/core/iomgr/tcp_server_posix.c @@ -74,7 +74,7 @@ static gpr_once s_init_max_accept_queue_size; static int s_max_accept_queue_size; /* one listening port */ -typedef struct server_port { +struct grpc_tcp_listener { int fd; grpc_fd *emfd; grpc_tcp_server *server; @@ -88,10 +88,10 @@ typedef struct server_port { grpc_closure read_closure; grpc_closure destroyed_closure; gpr_refcount refs; - struct server_port *next; - struct server_port *dual_stack_second_port; + struct grpc_tcp_listener *next; + struct grpc_tcp_listener *dual_stack_second_port; int is_dual_stack_second_port; -} server_port; +}; static void unlink_if_unix_domain_socket(const struct sockaddr_un *un) { struct stat st; @@ -118,7 +118,7 @@ struct grpc_tcp_server { int shutdown; /* linked list of server ports */ - server_port *head; + grpc_tcp_listener *head; unsigned nports; /* shutdown callback */ @@ -144,14 +144,14 @@ grpc_tcp_server *grpc_tcp_server_create(void) { } static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { - server_port *sp; + grpc_tcp_listener *sp; grpc_exec_ctx_enqueue(exec_ctx, s->shutdown_complete, 1); gpr_mu_destroy(&s->mu); for (sp = s->head; sp; sp = sp->next) { - grpc_tcp_listener_unref((grpc_tcp_listener *)sp); + grpc_tcp_listener_unref(sp); } gpr_free(s); @@ -183,7 +183,7 @@ static void deactivated_all_ports(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { } if (s->head) { - server_port *sp; + grpc_tcp_listener *sp; for (sp = s->head; sp; sp = sp->next) { if (sp->addr.sockaddr.sa_family == AF_UNIX) { unlink_if_unix_domain_socket(&sp->addr.un); @@ -211,7 +211,7 @@ void grpc_tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, /* shutdown all fd's */ if (s->active_ports) { - server_port *sp; + grpc_tcp_listener *sp; for (sp = s->head; sp; sp = sp->next) { grpc_fd_shutdown(exec_ctx, sp->emfd); } @@ -304,7 +304,7 @@ error: /* event manager callback when reads are ready */ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, int success) { - server_port *sp = arg; + grpc_tcp_listener *sp = arg; grpc_fd *fdobj; size_t i; @@ -370,10 +370,10 @@ error: } } -static server_port *add_socket_to_server(grpc_tcp_server *s, int fd, +static grpc_tcp_listener *add_socket_to_server(grpc_tcp_server *s, int fd, const struct sockaddr *addr, size_t addr_len) { - server_port *sp = NULL; + grpc_tcp_listener *sp = NULL; int port; char *addr_str; char *name; @@ -385,7 +385,7 @@ static server_port *add_socket_to_server(grpc_tcp_server *s, int fd, gpr_mu_lock(&s->mu); s->nports++; GPR_ASSERT(!s->on_accept_cb && "must add ports before starting server"); - sp = gpr_malloc(sizeof(server_port)); + sp = gpr_malloc(sizeof(grpc_tcp_listener)); sp->next = s->head; s->head = sp; sp->server = s; @@ -410,8 +410,8 @@ grpc_tcp_listener *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, size_t addr_len) { int allocated_port = -1; - server_port *sp; - server_port *sp2 = NULL; + grpc_tcp_listener *sp; + grpc_tcp_listener *sp2 = NULL; int fd; grpc_dualstack_mode dsmode; struct sockaddr_in6 addr6_v4mapped; @@ -491,11 +491,11 @@ grpc_tcp_listener *grpc_tcp_server_add_port(grpc_tcp_server *s, done: gpr_free(allocated_addr); - return (grpc_tcp_listener *)sp; + return sp; } int grpc_tcp_server_get_fd(grpc_tcp_server *s, unsigned port_index) { - server_port *sp; + grpc_tcp_listener *sp; for (sp = s->head; sp && port_index != 0; sp = sp->next, port_index--); if (port_index == 0 && sp) { return sp->fd; @@ -509,7 +509,7 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, grpc_tcp_server_cb on_accept_cb, void *on_accept_cb_arg) { size_t i; - server_port *sp; + grpc_tcp_listener *sp; GPR_ASSERT(on_accept_cb); gpr_mu_lock(&s->mu); GPR_ASSERT(!s->on_accept_cb); @@ -532,17 +532,17 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, } int grpc_tcp_listener_get_port(grpc_tcp_listener *listener) { - server_port *sp = (server_port *)listener; + grpc_tcp_listener *sp = listener; return sp->port; } void grpc_tcp_listener_ref(grpc_tcp_listener *listener) { - server_port *sp = (server_port *)listener; + grpc_tcp_listener *sp = listener; gpr_ref(&sp->refs); } void grpc_tcp_listener_unref(grpc_tcp_listener *listener) { - server_port *sp = (server_port *)listener; + grpc_tcp_listener *sp = listener; if (sp->is_dual_stack_second_port) return; if (gpr_unref(&sp->refs)) { if (sp->dual_stack_second_port) gpr_free(sp->dual_stack_second_port); diff --git a/src/core/iomgr/tcp_server_windows.c b/src/core/iomgr/tcp_server_windows.c index c7a9fffa101..e4a1d7f498c 100644 --- a/src/core/iomgr/tcp_server_windows.c +++ b/src/core/iomgr/tcp_server_windows.c @@ -55,7 +55,7 @@ #define MIN_SAFE_ACCEPT_QUEUE_SIZE 100 /* one listening port */ -typedef struct server_port { +struct grpc_tcp_listener { /* This seemingly magic number comes from AcceptEx's documentation. each address buffer needs to have at least 16 more bytes at their end. */ gpr_uint8 addresses[(sizeof(struct sockaddr_in6) + 16) * 2]; @@ -73,8 +73,8 @@ typedef struct server_port { grpc_closure on_accept; gpr_refcount refs; /* linked list */ - struct server_port *next; -} server_port; + struct grpc_tcp_listener *next; +}; /* the overall server */ struct grpc_tcp_server { @@ -88,7 +88,7 @@ struct grpc_tcp_server { int active_ports; /* linked list of server ports */ - server_port *head; + grpc_tcp_listener *head; /* shutdown callback */ grpc_closure *shutdown_complete; @@ -116,11 +116,11 @@ static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { The IOCP won't get notified on these, so we can flag them as already closed by the system. */ while (s->head) { - server_port *sp = s->head; + grpc_tcp_listener *sp = s->head; s->head = sp->next; sp->next = NULL; grpc_winsocket_destroy(sp->socket); - grpc_tcp_listener_unref((grpc_tcp_listener *) sp); + grpc_tcp_listener_unref(sp); } gpr_free(s); } @@ -129,7 +129,7 @@ static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { void grpc_tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, grpc_closure *shutdown_complete) { int immediately_done = 0; - server_port *sp; + grpc_tcp_listener *sp; gpr_mu_lock(&s->mu); s->shutdown_complete = shutdown_complete; @@ -199,7 +199,7 @@ error: } static void decrement_active_ports_and_notify(grpc_exec_ctx *exec_ctx, - server_port *sp) { + grpc_tcp_listener *sp) { int notify = 0; sp->shutting_down = 0; gpr_mu_lock(&sp->server->mu); @@ -216,7 +216,7 @@ static void decrement_active_ports_and_notify(grpc_exec_ctx *exec_ctx, /* In order to do an async accept, we need to create a socket first which will be the one assigned to the new incoming connection. */ -static void start_accept(grpc_exec_ctx *exec_ctx, server_port *port) { +static void start_accept(grpc_exec_ctx *exec_ctx, grpc_tcp_listener *port) { SOCKET sock = INVALID_SOCKET; char *message; char *utf8_message; @@ -276,7 +276,7 @@ failure: /* Event manager callback when reads are ready. */ static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, int from_iocp) { - server_port *sp = arg; + grpc_tcp_listener *sp = arg; SOCKET sock = sp->new_socket; grpc_winsocket_callback_info *info = &sp->socket->read_info; grpc_endpoint *ep = NULL; @@ -351,10 +351,10 @@ static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, int from_iocp) { start_accept(exec_ctx, sp); } -static server_port *add_socket_to_server(grpc_tcp_server *s, SOCKET sock, +static grpc_tcp_listener *add_socket_to_server(grpc_tcp_server *s, SOCKET sock, const struct sockaddr *addr, size_t addr_len) { - server_port *sp = NULL; + grpc_tcp_listener *sp = NULL; int port; int status; GUID guid = WSAID_ACCEPTEX; @@ -381,7 +381,7 @@ static server_port *add_socket_to_server(grpc_tcp_server *s, SOCKET sock, if (port >= 0) { gpr_mu_lock(&s->mu); GPR_ASSERT(!s->on_accept_cb && "must add ports before starting server"); - sp = gpr_malloc(sizeof(server_port)); + sp = gpr_malloc(sizeof(grpc_tcp_listener)); sp->next = s->head; s->head = sp; sp->server = s; @@ -402,7 +402,7 @@ static server_port *add_socket_to_server(grpc_tcp_server *s, SOCKET sock, grpc_tcp_listener *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr, size_t addr_len) { - server_port *sp; + grpc_tcp_listener *sp; SOCKET sock; struct sockaddr_in6 addr6_v4mapped; struct sockaddr_in6 wildcard; @@ -454,11 +454,11 @@ grpc_tcp_listener *grpc_tcp_server_add_port(grpc_tcp_server *s, sp = add_socket_to_server(s, sock, addr, addr_len); gpr_free(allocated_addr); - return (grpc_tcp_listener *)sp; + return sp; } int grpc_tcp_server_get_fd(grpc_tcp_server *s, unsigned port_index) { - server_port *sp; + grpc_tcp_listener *sp; for (sp = s->head; sp && port_index != 0; sp = sp->next, port_index--); if (port_index == 0 && sp) { return _open_osfhandle(sp->socket->socket, 0); @@ -471,7 +471,7 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, grpc_pollset **pollset, size_t pollset_count, grpc_tcp_server_cb on_accept_cb, void *on_accept_cb_arg) { - server_port *sp; + grpc_tcp_listener *sp; GPR_ASSERT(on_accept_cb); gpr_mu_lock(&s->mu); GPR_ASSERT(!s->on_accept_cb); @@ -486,17 +486,17 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, } int grpc_tcp_listener_get_port(grpc_tcp_listener *listener) { - server_port *sp = (server_port *)listener; + grpc_tcp_listener *sp = listener; return sp->port; } void grpc_tcp_listener_ref(grpc_tcp_listener *listener) { - server_port *sp = (server_port *)listener; + grpc_tcp_listener *sp = listener; gpr_ref(&sp->refs); } void grpc_tcp_listener_unref(grpc_tcp_listener *listener) { - server_port *sp = (server_port *)listener; + grpc_tcp_listener *sp = listener; if (gpr_unref(&sp->refs)) { gpr_free(listener); } From c6a7c6e02cdf52c0ff99f4451923e3858db74ed4 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Thu, 19 Nov 2015 21:55:44 +0100 Subject: [PATCH 03/13] Fixing use after free under Posix (was already fixed for Windows.) --- src/core/iomgr/tcp_server_posix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c index fbc0e974e67..5daf406c99d 100644 --- a/src/core/iomgr/tcp_server_posix.c +++ b/src/core/iomgr/tcp_server_posix.c @@ -144,13 +144,13 @@ grpc_tcp_server *grpc_tcp_server_create(void) { } static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { - grpc_tcp_listener *sp; - grpc_exec_ctx_enqueue(exec_ctx, s->shutdown_complete, 1); gpr_mu_destroy(&s->mu); - for (sp = s->head; sp; sp = sp->next) { + while (s->head) { + grpc_tcp_listener *sp = s->head; + s->head = sp->next; grpc_tcp_listener_unref(sp); } From d86115e2f6f1797adaa9a2ab8864f1feb9615dfa Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Fri, 20 Nov 2015 05:56:25 +0100 Subject: [PATCH 04/13] Renaming dual_stack_second_port to sibling. --- src/core/iomgr/tcp_server_posix.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c index 5daf406c99d..1439dfcd6ed 100644 --- a/src/core/iomgr/tcp_server_posix.c +++ b/src/core/iomgr/tcp_server_posix.c @@ -67,7 +67,6 @@ #include #include -#define INIT_PORT_CAP 2 #define MIN_SAFE_ACCEPT_QUEUE_SIZE 100 static gpr_once s_init_max_accept_queue_size; @@ -89,8 +88,12 @@ struct grpc_tcp_listener { grpc_closure destroyed_closure; gpr_refcount refs; struct grpc_tcp_listener *next; - struct grpc_tcp_listener *dual_stack_second_port; - int is_dual_stack_second_port; + /* When we add a listener, more than one can be created, mainly because of + IPv6. A sibling will still be in the normal list, but will be flagged + as such. Any action, such as ref or unref, will affect all of the + siblings in the list. */ + struct grpc_tcp_listener *sibling; + int is_sibling; }; static void unlink_if_unix_domain_socket(const struct sockaddr_un *un) { @@ -394,8 +397,8 @@ static grpc_tcp_listener *add_socket_to_server(grpc_tcp_server *s, int fd, memcpy(sp->addr.untyped, addr, addr_len); sp->addr_len = addr_len; sp->port = port; - sp->is_dual_stack_second_port = 0; - sp->dual_stack_second_port = NULL; + sp->is_sibling = 0; + sp->sibling = NULL; gpr_ref_init(&sp->refs, 1); GPR_ASSERT(sp->emfd); gpr_mu_unlock(&s->mu); @@ -486,8 +489,8 @@ grpc_tcp_listener *grpc_tcp_server_add_port(grpc_tcp_server *s, addr_len = sizeof(addr4_copy); } sp = add_socket_to_server(s, fd, addr, addr_len); - sp->dual_stack_second_port = sp2; - if (sp2) sp2->is_dual_stack_second_port = 1; + sp->sibling = sp2; + if (sp2) sp2->is_sibling = 1; done: gpr_free(allocated_addr); @@ -543,9 +546,14 @@ void grpc_tcp_listener_ref(grpc_tcp_listener *listener) { void grpc_tcp_listener_unref(grpc_tcp_listener *listener) { grpc_tcp_listener *sp = listener; - if (sp->is_dual_stack_second_port) return; + if (sp->is_sibling) return; if (gpr_unref(&sp->refs)) { - if (sp->dual_stack_second_port) gpr_free(sp->dual_stack_second_port); + grpc_tcp_listener *sibling = sp->sibling; + while (sibling) { + sp = sibling; + sibling = sp->sibling; + gpr_free(sp); + } gpr_free(listener); } } From ed67356bd06024a40cb3f8b5ffd577dd88219453 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 20 Nov 2015 14:58:04 -0800 Subject: [PATCH 05/13] improve comments on benchmark protos --- test/proto/benchmarks/control.proto | 22 +++++++++++++++++++--- test/proto/benchmarks/services.proto | 14 ++++++++++++-- test/proto/benchmarks/stats.proto | 8 ++++---- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/test/proto/benchmarks/control.proto b/test/proto/benchmarks/control.proto index 962bd2f8cc3..42a5dd0a859 100644 --- a/test/proto/benchmarks/control.proto +++ b/test/proto/benchmarks/control.proto @@ -49,7 +49,10 @@ enum RpcType { STREAMING = 1; } +// Parameters of poisson process distribution, which is a good representation +// of activity coming in from independent identical stationary sources. message PoissonParams { + // The rate of arrivals (a.k.a. lambda parameter of the exp distribution). double offered_load = 1; } @@ -67,6 +70,8 @@ message ParetoParams { double alpha = 2; } +// Once an RPC finishes, immediately start a new one. +// No configuration parameters needed. message ClosedLoopParams { } @@ -87,14 +92,20 @@ message SecurityParams { } message ClientConfig { + // List of targets to connect to. At least one target needs to be specified. repeated string server_targets = 1; ClientType client_type = 2; SecurityParams security_params = 3; + // How many concurrent RPCs to start for each channel. + // For synchronous client, use a separate thread for each outstanding RPC. int32 outstanding_rpcs_per_channel = 4; + // Number of independent client channels to create. + // i-th channel will connect to server_target[i % server_targets.size()] int32 client_channels = 5; - // only for async client: + // Only for async client. Number of threads to use to start/manage RPCs. int32 async_client_threads = 7; RpcType rpc_type = 8; + // The requested load for the entire client (aggregated over all the threads). LoadParams load_params = 10; PayloadConfig payload_config = 11; HistogramParams histogram_params = 12; @@ -106,6 +117,7 @@ message ClientStatus { // Request current stats message Mark { + // if true, the stats will be reset after taking their snapshot. bool reset = 1; } @@ -119,11 +131,13 @@ message ClientArgs { message ServerConfig { ServerType server_type = 1; SecurityParams security_params = 2; + // Host on which to listen. string host = 3; + // Port on which to listen. Zero means pick unused port. int32 port = 4; - // only for async server + // Only for async server. Number of threads used to serve the requests. int32 async_server_threads = 7; - // restrict core usage + // restrict core usage, currently unused int32 core_limit = 8; PayloadConfig payload_config = 9; } @@ -137,6 +151,8 @@ message ServerArgs { message ServerStatus { ServerStats stats = 1; + // the port bound by the server int32 port = 2; + // Number of cores on the server. See gpr_cpu_num_cores. int32 cores = 3; } diff --git a/test/proto/benchmarks/services.proto b/test/proto/benchmarks/services.proto index 4c2cbabdf87..ff295ed9702 100644 --- a/test/proto/benchmarks/services.proto +++ b/test/proto/benchmarks/services.proto @@ -47,9 +47,19 @@ service BenchmarkService { } service WorkerService { - // Start server with specified workload + // Start server with specified workload. + // First request sent specifies the ServerConfig followed by ServerStatus + // response. After that, a "Mark" can be sent anytime to request the latest + // stats. Closing the stream will initiate shutdown of the test server + // and once the shutdown has finished, the OK status is sent to terminate + // this RPC. rpc RunServer(stream ServerArgs) returns (stream ServerStatus); - // Start client with specified workload + // Start client with specified workload. + // First request sent specifies the ClientConfig followed by ClientStatus + // response. After that, a "Mark" can be sent anytime to request the latest + // stats. Closing the stream will initiate shutdown of the test client + // and once the shutdown has finished, the OK status is sent to terminate + // this RPC. rpc RunClient(stream ClientArgs) returns (stream ClientStatus); } diff --git a/test/proto/benchmarks/stats.proto b/test/proto/benchmarks/stats.proto index 194db47caa5..6b045b31198 100644 --- a/test/proto/benchmarks/stats.proto +++ b/test/proto/benchmarks/stats.proto @@ -32,14 +32,14 @@ syntax = "proto3"; package grpc.testing; message ServerStats { - // wall clock time change since last reset + // wall clock time change in seconds since last reset double time_elapsed = 1; - // change in user time used by the server since last reset + // change in user time (in seconds) used by the server since last reset double time_user = 2; - // change in server time used by the server process and all threads since - // last reset + // change in server time (in seconds) used by the server process and all + // threads since last reset double time_system = 3; } From 6b9527c0c1a5b2581fff3a75edfb5654d3aeecc7 Mon Sep 17 00:00:00 2001 From: Adele Zhou Date: Fri, 20 Nov 2015 15:56:35 -0800 Subject: [PATCH 06/13] Skip OjbC when running code coverage. --- tools/run_tests/run_tests.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index 7fd7cff8d61..2d12adebbb6 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -624,10 +624,15 @@ build_configs = set(cfg.build_config for cfg in run_configs) if args.travis: _FORCE_ENVIRON_FOR_WRAPPERS = {'GRPC_TRACE': 'api'} -languages = set(_LANGUAGES[l] - for l in itertools.chain.from_iterable( - _LANGUAGES.iterkeys() if x == 'all' else [x] - for x in args.language)) +if 'all' in args.language: + lang_list = _LANGUAGES.keys() +else: + lang_list = args.language +# We don't support code coverage on ObjC +if 'gcov' in args.config and 'objc' in lang_list: + lang_list.remove('objc') + +languages = set(_LANGUAGES[l] for l in lang_list) if len(build_configs) > 1: for language in languages: @@ -840,6 +845,7 @@ def _calculate_num_runs_failures(list_of_results): num_failures += jobresult.num_failures return num_runs, num_failures + def _build_and_run( check_cancelled, newline_on_success, cache, xml_report=None): """Do one pass of building & running tests.""" From fba79f213f94c69c3b095ea44f059bfa04d623d5 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 23 Nov 2015 11:06:55 -0800 Subject: [PATCH 07/13] AVL: creation, destroy, add --- BUILD | 4 + Makefile | 36 ++- binding.gyp | 1 + build.yaml | 10 + gRPC.podspec | 2 + include/grpc/support/avl.h | 67 +++++ src/core/support/avl.c | 233 ++++++++++++++++++ test/core/support/avl_test.c | 174 +++++++++++++ tools/doxygen/Doxyfile.core | 1 + tools/doxygen/Doxyfile.core.internal | 2 + tools/run_tests/sources_and_headers.json | 15 ++ tools/run_tests/tests.json | 18 ++ vsprojects/buildtests_c.sln | 25 ++ vsprojects/vcxproj/gpr/gpr.vcxproj | 3 + vsprojects/vcxproj/gpr/gpr.vcxproj.filters | 6 + .../test/gpr_avl_test/gpr_avl_test.vcxproj | 178 +++++++++++++ .../gpr_avl_test/gpr_avl_test.vcxproj.filters | 21 ++ 17 files changed, 795 insertions(+), 1 deletion(-) create mode 100644 include/grpc/support/avl.h create mode 100644 src/core/support/avl.c create mode 100644 test/core/support/avl_test.c create mode 100644 vsprojects/vcxproj/test/gpr_avl_test/gpr_avl_test.vcxproj create mode 100644 vsprojects/vcxproj/test/gpr_avl_test/gpr_avl_test.vcxproj.filters diff --git a/BUILD b/BUILD index b66becf290f..67365dcd0fb 100644 --- a/BUILD +++ b/BUILD @@ -57,6 +57,7 @@ cc_library( "src/core/profiling/basic_timers.c", "src/core/profiling/stap_timers.c", "src/core/support/alloc.c", + "src/core/support/avl.c", "src/core/support/cmdline.c", "src/core/support/cpu_iphone.c", "src/core/support/cpu_linux.c", @@ -101,6 +102,7 @@ cc_library( "include/grpc/support/atm_gcc_atomic.h", "include/grpc/support/atm_gcc_sync.h", "include/grpc/support/atm_win32.h", + "include/grpc/support/avl.h", "include/grpc/support/cmdline.h", "include/grpc/support/cpu.h", "include/grpc/support/histogram.h", @@ -975,6 +977,7 @@ objc_library( "src/core/profiling/basic_timers.c", "src/core/profiling/stap_timers.c", "src/core/support/alloc.c", + "src/core/support/avl.c", "src/core/support/cmdline.c", "src/core/support/cpu_iphone.c", "src/core/support/cpu_linux.c", @@ -1019,6 +1022,7 @@ objc_library( "include/grpc/support/atm_gcc_atomic.h", "include/grpc/support/atm_gcc_sync.h", "include/grpc/support/atm_win32.h", + "include/grpc/support/avl.h", "include/grpc/support/cmdline.h", "include/grpc/support/cpu.h", "include/grpc/support/histogram.h", diff --git a/Makefile b/Makefile index 419715c2825..960fd771414 100644 --- a/Makefile +++ b/Makefile @@ -793,6 +793,7 @@ fling_stream_test: $(BINDIR)/$(CONFIG)/fling_stream_test fling_test: $(BINDIR)/$(CONFIG)/fling_test gen_hpack_tables: $(BINDIR)/$(CONFIG)/gen_hpack_tables gen_legal_metadata_characters: $(BINDIR)/$(CONFIG)/gen_legal_metadata_characters +gpr_avl_test: $(BINDIR)/$(CONFIG)/gpr_avl_test gpr_cmdline_test: $(BINDIR)/$(CONFIG)/gpr_cmdline_test gpr_cpu_test: $(BINDIR)/$(CONFIG)/gpr_cpu_test gpr_env_test: $(BINDIR)/$(CONFIG)/gpr_env_test @@ -1871,7 +1872,7 @@ endif buildtests: buildtests_c buildtests_cxx buildtests_zookeeper -buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/chttp2_hpack_encoder_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/compression_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/endpoint_pair_test $(BINDIR)/$(CONFIG)/fd_conservation_posix_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_cpu_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_stack_lockfree_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_auth_context_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_args_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_jwt_verifier_test $(BINDIR)/$(CONFIG)/grpc_security_connector_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/lb_policies_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/multiple_server_queues_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timer_heap_test $(BINDIR)/$(CONFIG)/timer_list_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/udp_server_test $(BINDIR)/$(CONFIG)/uri_parser_test $(BINDIR)/$(CONFIG)/workqueue_test $(BINDIR)/$(CONFIG)/h2_compress_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_compress_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_compress_call_creds_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_compress_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_compress_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_compress_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_compress_default_host_test $(BINDIR)/$(CONFIG)/h2_compress_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_compress_empty_batch_test $(BINDIR)/$(CONFIG)/h2_compress_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_compress_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_compress_hpack_size_test $(BINDIR)/$(CONFIG)/h2_compress_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_compress_large_metadata_test $(BINDIR)/$(CONFIG)/h2_compress_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_compress_max_message_length_test $(BINDIR)/$(CONFIG)/h2_compress_metadata_test $(BINDIR)/$(CONFIG)/h2_compress_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_compress_no_op_test $(BINDIR)/$(CONFIG)/h2_compress_payload_test $(BINDIR)/$(CONFIG)/h2_compress_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_compress_registered_call_test $(BINDIR)/$(CONFIG)/h2_compress_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_compress_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_compress_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_compress_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_compress_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_compress_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_compress_simple_request_test $(BINDIR)/$(CONFIG)/h2_compress_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_fakesec_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_fakesec_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_fakesec_call_creds_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_fakesec_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_fakesec_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_fakesec_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_fakesec_default_host_test $(BINDIR)/$(CONFIG)/h2_fakesec_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_fakesec_empty_batch_test $(BINDIR)/$(CONFIG)/h2_fakesec_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_fakesec_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_fakesec_hpack_size_test $(BINDIR)/$(CONFIG)/h2_fakesec_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_fakesec_large_metadata_test $(BINDIR)/$(CONFIG)/h2_fakesec_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_fakesec_max_message_length_test $(BINDIR)/$(CONFIG)/h2_fakesec_metadata_test $(BINDIR)/$(CONFIG)/h2_fakesec_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_fakesec_no_op_test $(BINDIR)/$(CONFIG)/h2_fakesec_payload_test $(BINDIR)/$(CONFIG)/h2_fakesec_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_fakesec_registered_call_test $(BINDIR)/$(CONFIG)/h2_fakesec_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_fakesec_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_fakesec_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_fakesec_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_fakesec_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_fakesec_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_fakesec_simple_request_test $(BINDIR)/$(CONFIG)/h2_fakesec_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_full_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_full_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_full_call_creds_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_full_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_full_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_full_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_full_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_full_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_full_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_full_default_host_test $(BINDIR)/$(CONFIG)/h2_full_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_full_empty_batch_test $(BINDIR)/$(CONFIG)/h2_full_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_full_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_full_hpack_size_test $(BINDIR)/$(CONFIG)/h2_full_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_full_large_metadata_test $(BINDIR)/$(CONFIG)/h2_full_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_full_max_message_length_test $(BINDIR)/$(CONFIG)/h2_full_metadata_test $(BINDIR)/$(CONFIG)/h2_full_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_full_no_op_test $(BINDIR)/$(CONFIG)/h2_full_payload_test $(BINDIR)/$(CONFIG)/h2_full_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_full_registered_call_test $(BINDIR)/$(CONFIG)/h2_full_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_full_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_full_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_full_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_full_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_full_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_full_simple_request_test $(BINDIR)/$(CONFIG)/h2_full_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_full+poll_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_full+poll_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_full+poll_call_creds_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_full+poll_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_full+poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_full+poll_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_full+poll_default_host_test $(BINDIR)/$(CONFIG)/h2_full+poll_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_full+poll_empty_batch_test $(BINDIR)/$(CONFIG)/h2_full+poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_full+poll_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_full+poll_hpack_size_test $(BINDIR)/$(CONFIG)/h2_full+poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_full+poll_large_metadata_test $(BINDIR)/$(CONFIG)/h2_full+poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_full+poll_max_message_length_test $(BINDIR)/$(CONFIG)/h2_full+poll_metadata_test $(BINDIR)/$(CONFIG)/h2_full+poll_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_full+poll_no_op_test $(BINDIR)/$(CONFIG)/h2_full+poll_payload_test $(BINDIR)/$(CONFIG)/h2_full+poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_full+poll_registered_call_test $(BINDIR)/$(CONFIG)/h2_full+poll_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_full+poll_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_full+poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_full+poll_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_full+poll_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_full+poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_full+poll_simple_request_test $(BINDIR)/$(CONFIG)/h2_full+poll_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_oauth2_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_oauth2_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_oauth2_call_creds_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_oauth2_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_oauth2_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_oauth2_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_oauth2_default_host_test $(BINDIR)/$(CONFIG)/h2_oauth2_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_oauth2_empty_batch_test $(BINDIR)/$(CONFIG)/h2_oauth2_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_oauth2_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_oauth2_hpack_size_test $(BINDIR)/$(CONFIG)/h2_oauth2_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_oauth2_large_metadata_test $(BINDIR)/$(CONFIG)/h2_oauth2_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_oauth2_max_message_length_test $(BINDIR)/$(CONFIG)/h2_oauth2_metadata_test $(BINDIR)/$(CONFIG)/h2_oauth2_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_oauth2_no_op_test $(BINDIR)/$(CONFIG)/h2_oauth2_payload_test $(BINDIR)/$(CONFIG)/h2_oauth2_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_oauth2_registered_call_test $(BINDIR)/$(CONFIG)/h2_oauth2_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_oauth2_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_oauth2_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_oauth2_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_oauth2_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_oauth2_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_oauth2_simple_request_test $(BINDIR)/$(CONFIG)/h2_oauth2_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_proxy_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_proxy_call_creds_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_proxy_default_host_test $(BINDIR)/$(CONFIG)/h2_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/h2_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_proxy_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_proxy_large_metadata_test $(BINDIR)/$(CONFIG)/h2_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/h2_proxy_metadata_test $(BINDIR)/$(CONFIG)/h2_proxy_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_proxy_no_op_test $(BINDIR)/$(CONFIG)/h2_proxy_payload_test $(BINDIR)/$(CONFIG)/h2_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_proxy_registered_call_test $(BINDIR)/$(CONFIG)/h2_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_proxy_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_proxy_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_proxy_simple_request_test $(BINDIR)/$(CONFIG)/h2_proxy_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_sockpair_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_call_creds_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_sockpair_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_empty_batch_test $(BINDIR)/$(CONFIG)/h2_sockpair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_sockpair_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_sockpair_hpack_size_test $(BINDIR)/$(CONFIG)/h2_sockpair_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_large_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_sockpair_max_message_length_test $(BINDIR)/$(CONFIG)/h2_sockpair_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_sockpair_no_op_test $(BINDIR)/$(CONFIG)/h2_sockpair_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_sockpair_registered_call_test $(BINDIR)/$(CONFIG)/h2_sockpair_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_sockpair_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_sockpair_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_sockpair_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_call_creds_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_empty_batch_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_large_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_max_message_length_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_no_op_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_registered_call_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_call_creds_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_empty_batch_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_hpack_size_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_large_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_max_message_length_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_no_op_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_registered_call_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_ssl_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_call_creds_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_ssl_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_ssl_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_ssl_default_host_test $(BINDIR)/$(CONFIG)/h2_ssl_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_ssl_empty_batch_test $(BINDIR)/$(CONFIG)/h2_ssl_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_ssl_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_ssl_hpack_size_test $(BINDIR)/$(CONFIG)/h2_ssl_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_ssl_large_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_ssl_max_message_length_test $(BINDIR)/$(CONFIG)/h2_ssl_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_ssl_no_op_test $(BINDIR)/$(CONFIG)/h2_ssl_payload_test $(BINDIR)/$(CONFIG)/h2_ssl_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_ssl_registered_call_test $(BINDIR)/$(CONFIG)/h2_ssl_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_ssl_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_ssl_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_ssl_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_ssl_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_ssl_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_ssl_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_call_creds_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_default_host_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_empty_batch_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_hpack_size_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_large_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_max_message_length_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_no_op_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_payload_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_registered_call_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_call_creds_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_default_host_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_large_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_no_op_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_payload_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_registered_call_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_uchannel_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_uchannel_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_uchannel_call_creds_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_uchannel_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_uchannel_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_uchannel_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_uchannel_default_host_test $(BINDIR)/$(CONFIG)/h2_uchannel_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_uchannel_empty_batch_test $(BINDIR)/$(CONFIG)/h2_uchannel_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_uchannel_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_uchannel_hpack_size_test $(BINDIR)/$(CONFIG)/h2_uchannel_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_uchannel_large_metadata_test $(BINDIR)/$(CONFIG)/h2_uchannel_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_uchannel_max_message_length_test $(BINDIR)/$(CONFIG)/h2_uchannel_metadata_test $(BINDIR)/$(CONFIG)/h2_uchannel_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_uchannel_no_op_test $(BINDIR)/$(CONFIG)/h2_uchannel_payload_test $(BINDIR)/$(CONFIG)/h2_uchannel_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_uchannel_registered_call_test $(BINDIR)/$(CONFIG)/h2_uchannel_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_uchannel_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_uchannel_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_uchannel_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_uchannel_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_uchannel_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_uchannel_simple_request_test $(BINDIR)/$(CONFIG)/h2_uchannel_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_uds_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_uds_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_uds_call_creds_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_uds_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_uds_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_uds_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_uds_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_uds_empty_batch_test $(BINDIR)/$(CONFIG)/h2_uds_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_uds_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_uds_hpack_size_test $(BINDIR)/$(CONFIG)/h2_uds_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_uds_large_metadata_test $(BINDIR)/$(CONFIG)/h2_uds_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_uds_max_message_length_test $(BINDIR)/$(CONFIG)/h2_uds_metadata_test $(BINDIR)/$(CONFIG)/h2_uds_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_uds_no_op_test $(BINDIR)/$(CONFIG)/h2_uds_payload_test $(BINDIR)/$(CONFIG)/h2_uds_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_uds_registered_call_test $(BINDIR)/$(CONFIG)/h2_uds_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_uds_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_uds_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_uds_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_uds_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_uds_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_uds_simple_request_test $(BINDIR)/$(CONFIG)/h2_uds_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_uds+poll_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_uds+poll_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_uds+poll_call_creds_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_uds+poll_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_uds+poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_uds+poll_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_uds+poll_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_uds+poll_empty_batch_test $(BINDIR)/$(CONFIG)/h2_uds+poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_uds+poll_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_uds+poll_hpack_size_test $(BINDIR)/$(CONFIG)/h2_uds+poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_uds+poll_large_metadata_test $(BINDIR)/$(CONFIG)/h2_uds+poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_uds+poll_max_message_length_test $(BINDIR)/$(CONFIG)/h2_uds+poll_metadata_test $(BINDIR)/$(CONFIG)/h2_uds+poll_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_uds+poll_no_op_test $(BINDIR)/$(CONFIG)/h2_uds+poll_payload_test $(BINDIR)/$(CONFIG)/h2_uds+poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_uds+poll_registered_call_test $(BINDIR)/$(CONFIG)/h2_uds+poll_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_uds+poll_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_uds+poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_uds+poll_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_uds+poll_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_uds+poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_uds+poll_simple_request_test $(BINDIR)/$(CONFIG)/h2_uds+poll_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_compress_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_default_host_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_full_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_full_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_full_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full_default_host_nosec_test $(BINDIR)/$(CONFIG)/h2_full_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_full_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_full_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_full_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_full_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_full_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_full_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_full_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_full_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_full_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_full_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_full_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_full_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_full_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_full_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_default_host_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_default_host_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_default_host_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test +buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/chttp2_hpack_encoder_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/compression_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/endpoint_pair_test $(BINDIR)/$(CONFIG)/fd_conservation_posix_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_avl_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_cpu_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_stack_lockfree_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_auth_context_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_args_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_jwt_verifier_test $(BINDIR)/$(CONFIG)/grpc_security_connector_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/lb_policies_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/multiple_server_queues_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timer_heap_test $(BINDIR)/$(CONFIG)/timer_list_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/udp_server_test $(BINDIR)/$(CONFIG)/uri_parser_test $(BINDIR)/$(CONFIG)/workqueue_test $(BINDIR)/$(CONFIG)/h2_compress_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_compress_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_compress_call_creds_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_compress_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_compress_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_compress_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_compress_default_host_test $(BINDIR)/$(CONFIG)/h2_compress_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_compress_empty_batch_test $(BINDIR)/$(CONFIG)/h2_compress_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_compress_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_compress_hpack_size_test $(BINDIR)/$(CONFIG)/h2_compress_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_compress_large_metadata_test $(BINDIR)/$(CONFIG)/h2_compress_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_compress_max_message_length_test $(BINDIR)/$(CONFIG)/h2_compress_metadata_test $(BINDIR)/$(CONFIG)/h2_compress_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_compress_no_op_test $(BINDIR)/$(CONFIG)/h2_compress_payload_test $(BINDIR)/$(CONFIG)/h2_compress_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_compress_registered_call_test $(BINDIR)/$(CONFIG)/h2_compress_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_compress_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_compress_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_compress_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_compress_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_compress_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_compress_simple_request_test $(BINDIR)/$(CONFIG)/h2_compress_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_fakesec_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_fakesec_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_fakesec_call_creds_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_fakesec_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_fakesec_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_fakesec_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_fakesec_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_fakesec_default_host_test $(BINDIR)/$(CONFIG)/h2_fakesec_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_fakesec_empty_batch_test $(BINDIR)/$(CONFIG)/h2_fakesec_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_fakesec_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_fakesec_hpack_size_test $(BINDIR)/$(CONFIG)/h2_fakesec_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_fakesec_large_metadata_test $(BINDIR)/$(CONFIG)/h2_fakesec_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_fakesec_max_message_length_test $(BINDIR)/$(CONFIG)/h2_fakesec_metadata_test $(BINDIR)/$(CONFIG)/h2_fakesec_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_fakesec_no_op_test $(BINDIR)/$(CONFIG)/h2_fakesec_payload_test $(BINDIR)/$(CONFIG)/h2_fakesec_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_fakesec_registered_call_test $(BINDIR)/$(CONFIG)/h2_fakesec_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_fakesec_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_fakesec_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_fakesec_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_fakesec_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_fakesec_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_fakesec_simple_request_test $(BINDIR)/$(CONFIG)/h2_fakesec_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_full_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_full_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_full_call_creds_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_full_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_full_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_full_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_full_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_full_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_full_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_full_default_host_test $(BINDIR)/$(CONFIG)/h2_full_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_full_empty_batch_test $(BINDIR)/$(CONFIG)/h2_full_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_full_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_full_hpack_size_test $(BINDIR)/$(CONFIG)/h2_full_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_full_large_metadata_test $(BINDIR)/$(CONFIG)/h2_full_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_full_max_message_length_test $(BINDIR)/$(CONFIG)/h2_full_metadata_test $(BINDIR)/$(CONFIG)/h2_full_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_full_no_op_test $(BINDIR)/$(CONFIG)/h2_full_payload_test $(BINDIR)/$(CONFIG)/h2_full_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_full_registered_call_test $(BINDIR)/$(CONFIG)/h2_full_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_full_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_full_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_full_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_full_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_full_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_full_simple_request_test $(BINDIR)/$(CONFIG)/h2_full_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_full+poll_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_full+poll_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_full+poll_call_creds_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_full+poll_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_full+poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_full+poll_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_full+poll_default_host_test $(BINDIR)/$(CONFIG)/h2_full+poll_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_full+poll_empty_batch_test $(BINDIR)/$(CONFIG)/h2_full+poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_full+poll_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_full+poll_hpack_size_test $(BINDIR)/$(CONFIG)/h2_full+poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_full+poll_large_metadata_test $(BINDIR)/$(CONFIG)/h2_full+poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_full+poll_max_message_length_test $(BINDIR)/$(CONFIG)/h2_full+poll_metadata_test $(BINDIR)/$(CONFIG)/h2_full+poll_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_full+poll_no_op_test $(BINDIR)/$(CONFIG)/h2_full+poll_payload_test $(BINDIR)/$(CONFIG)/h2_full+poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_full+poll_registered_call_test $(BINDIR)/$(CONFIG)/h2_full+poll_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_full+poll_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_full+poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_full+poll_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_full+poll_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_full+poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_full+poll_simple_request_test $(BINDIR)/$(CONFIG)/h2_full+poll_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_oauth2_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_oauth2_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_oauth2_call_creds_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_oauth2_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_oauth2_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_oauth2_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_oauth2_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_oauth2_default_host_test $(BINDIR)/$(CONFIG)/h2_oauth2_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_oauth2_empty_batch_test $(BINDIR)/$(CONFIG)/h2_oauth2_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_oauth2_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_oauth2_hpack_size_test $(BINDIR)/$(CONFIG)/h2_oauth2_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_oauth2_large_metadata_test $(BINDIR)/$(CONFIG)/h2_oauth2_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_oauth2_max_message_length_test $(BINDIR)/$(CONFIG)/h2_oauth2_metadata_test $(BINDIR)/$(CONFIG)/h2_oauth2_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_oauth2_no_op_test $(BINDIR)/$(CONFIG)/h2_oauth2_payload_test $(BINDIR)/$(CONFIG)/h2_oauth2_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_oauth2_registered_call_test $(BINDIR)/$(CONFIG)/h2_oauth2_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_oauth2_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_oauth2_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_oauth2_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_oauth2_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_oauth2_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_oauth2_simple_request_test $(BINDIR)/$(CONFIG)/h2_oauth2_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_proxy_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_proxy_call_creds_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_proxy_default_host_test $(BINDIR)/$(CONFIG)/h2_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/h2_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_proxy_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_proxy_large_metadata_test $(BINDIR)/$(CONFIG)/h2_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/h2_proxy_metadata_test $(BINDIR)/$(CONFIG)/h2_proxy_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_proxy_no_op_test $(BINDIR)/$(CONFIG)/h2_proxy_payload_test $(BINDIR)/$(CONFIG)/h2_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_proxy_registered_call_test $(BINDIR)/$(CONFIG)/h2_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_proxy_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_proxy_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_proxy_simple_request_test $(BINDIR)/$(CONFIG)/h2_proxy_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_sockpair_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_call_creds_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_sockpair_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_empty_batch_test $(BINDIR)/$(CONFIG)/h2_sockpair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_sockpair_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_sockpair_hpack_size_test $(BINDIR)/$(CONFIG)/h2_sockpair_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_large_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_sockpair_max_message_length_test $(BINDIR)/$(CONFIG)/h2_sockpair_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_sockpair_no_op_test $(BINDIR)/$(CONFIG)/h2_sockpair_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_sockpair_registered_call_test $(BINDIR)/$(CONFIG)/h2_sockpair_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_sockpair_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_sockpair_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_sockpair_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_call_creds_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_empty_batch_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_large_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_max_message_length_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_no_op_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_registered_call_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_call_creds_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_empty_batch_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_hpack_size_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_large_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_max_message_length_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_metadata_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_no_op_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_registered_call_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_simple_request_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_ssl_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_call_creds_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_ssl_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_ssl_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_ssl_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_ssl_default_host_test $(BINDIR)/$(CONFIG)/h2_ssl_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_ssl_empty_batch_test $(BINDIR)/$(CONFIG)/h2_ssl_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_ssl_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_ssl_hpack_size_test $(BINDIR)/$(CONFIG)/h2_ssl_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_ssl_large_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_ssl_max_message_length_test $(BINDIR)/$(CONFIG)/h2_ssl_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_ssl_no_op_test $(BINDIR)/$(CONFIG)/h2_ssl_payload_test $(BINDIR)/$(CONFIG)/h2_ssl_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_ssl_registered_call_test $(BINDIR)/$(CONFIG)/h2_ssl_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_ssl_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_ssl_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_ssl_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_ssl_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_ssl_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_ssl_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_call_creds_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_default_host_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_empty_batch_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_hpack_size_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_large_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_max_message_length_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_no_op_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_payload_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_registered_call_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl+poll_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_call_creds_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_default_host_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_large_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_metadata_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_no_op_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_payload_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_registered_call_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_simple_request_test $(BINDIR)/$(CONFIG)/h2_ssl_proxy_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_uchannel_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_uchannel_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_uchannel_call_creds_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_uchannel_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_uchannel_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_uchannel_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_uchannel_default_host_test $(BINDIR)/$(CONFIG)/h2_uchannel_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_uchannel_empty_batch_test $(BINDIR)/$(CONFIG)/h2_uchannel_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_uchannel_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_uchannel_hpack_size_test $(BINDIR)/$(CONFIG)/h2_uchannel_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_uchannel_large_metadata_test $(BINDIR)/$(CONFIG)/h2_uchannel_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_uchannel_max_message_length_test $(BINDIR)/$(CONFIG)/h2_uchannel_metadata_test $(BINDIR)/$(CONFIG)/h2_uchannel_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_uchannel_no_op_test $(BINDIR)/$(CONFIG)/h2_uchannel_payload_test $(BINDIR)/$(CONFIG)/h2_uchannel_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_uchannel_registered_call_test $(BINDIR)/$(CONFIG)/h2_uchannel_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_uchannel_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_uchannel_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_uchannel_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_uchannel_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_uchannel_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_uchannel_simple_request_test $(BINDIR)/$(CONFIG)/h2_uchannel_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_uds_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_uds_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_uds_call_creds_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_uds_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_uds_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_uds_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_uds_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_uds_empty_batch_test $(BINDIR)/$(CONFIG)/h2_uds_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_uds_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_uds_hpack_size_test $(BINDIR)/$(CONFIG)/h2_uds_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_uds_large_metadata_test $(BINDIR)/$(CONFIG)/h2_uds_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_uds_max_message_length_test $(BINDIR)/$(CONFIG)/h2_uds_metadata_test $(BINDIR)/$(CONFIG)/h2_uds_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_uds_no_op_test $(BINDIR)/$(CONFIG)/h2_uds_payload_test $(BINDIR)/$(CONFIG)/h2_uds_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_uds_registered_call_test $(BINDIR)/$(CONFIG)/h2_uds_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_uds_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_uds_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_uds_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_uds_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_uds_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_uds_simple_request_test $(BINDIR)/$(CONFIG)/h2_uds_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_uds+poll_bad_hostname_test $(BINDIR)/$(CONFIG)/h2_uds+poll_binary_metadata_test $(BINDIR)/$(CONFIG)/h2_uds+poll_call_creds_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_client_done_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_with_status_test $(BINDIR)/$(CONFIG)/h2_uds+poll_census_simple_request_test $(BINDIR)/$(CONFIG)/h2_uds+poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/h2_uds+poll_compressed_payload_test $(BINDIR)/$(CONFIG)/h2_uds+poll_disappearing_server_test $(BINDIR)/$(CONFIG)/h2_uds+poll_empty_batch_test $(BINDIR)/$(CONFIG)/h2_uds+poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/h2_uds+poll_high_initial_seqno_test $(BINDIR)/$(CONFIG)/h2_uds+poll_hpack_size_test $(BINDIR)/$(CONFIG)/h2_uds+poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/h2_uds+poll_large_metadata_test $(BINDIR)/$(CONFIG)/h2_uds+poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/h2_uds+poll_max_message_length_test $(BINDIR)/$(CONFIG)/h2_uds+poll_metadata_test $(BINDIR)/$(CONFIG)/h2_uds+poll_negative_deadline_test $(BINDIR)/$(CONFIG)/h2_uds+poll_no_op_test $(BINDIR)/$(CONFIG)/h2_uds+poll_payload_test $(BINDIR)/$(CONFIG)/h2_uds+poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/h2_uds+poll_registered_call_test $(BINDIR)/$(CONFIG)/h2_uds+poll_request_with_flags_test $(BINDIR)/$(CONFIG)/h2_uds+poll_request_with_payload_test $(BINDIR)/$(CONFIG)/h2_uds+poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/h2_uds+poll_shutdown_finishes_calls_test $(BINDIR)/$(CONFIG)/h2_uds+poll_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/h2_uds+poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/h2_uds+poll_simple_request_test $(BINDIR)/$(CONFIG)/h2_uds+poll_trailing_metadata_test $(BINDIR)/$(CONFIG)/h2_compress_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_default_host_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_compress_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_full_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_full_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_full_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_full_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full_default_host_nosec_test $(BINDIR)/$(CONFIG)/h2_full_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_full_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_full_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_full_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_full_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_full_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_full_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_full_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_full_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_full_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_full_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_full_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_full_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_full_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_full_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_default_host_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_full+poll_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_default_host_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_proxy_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair+trace_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_default_host_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uchannel_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_bad_hostname_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_binary_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_accept_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_client_done_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_after_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_before_invoke_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_in_a_vacuum_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_cancel_with_status_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_census_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_channel_connectivity_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_compressed_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_disappearing_server_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_empty_batch_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_graceful_server_shutdown_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_high_initial_seqno_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_hpack_size_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_invoke_large_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_large_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_max_concurrent_streams_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_max_message_length_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_metadata_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_negative_deadline_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_no_op_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_ping_pong_streaming_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_registered_call_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_request_with_flags_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_request_with_payload_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_server_finishes_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_shutdown_finishes_calls_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_shutdown_finishes_tags_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_simple_delayed_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_simple_request_nosec_test $(BINDIR)/$(CONFIG)/h2_uds+poll_trailing_metadata_nosec_test $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test buildtests_cxx: buildtests_zookeeper privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/auth_property_iterator_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/client_crash_test $(BINDIR)/$(CONFIG)/client_crash_test_server $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_byte_buffer_test $(BINDIR)/$(CONFIG)/cxx_slice_test $(BINDIR)/$(CONFIG)/cxx_string_ref_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/metrics_client $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/qps_interarrival_test $(BINDIR)/$(CONFIG)/qps_openloop_test $(BINDIR)/$(CONFIG)/qps_test $(BINDIR)/$(CONFIG)/reconnect_interop_client $(BINDIR)/$(CONFIG)/reconnect_interop_server $(BINDIR)/$(CONFIG)/secure_auth_context_test $(BINDIR)/$(CONFIG)/secure_sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/server_crash_test $(BINDIR)/$(CONFIG)/server_crash_test_client $(BINDIR)/$(CONFIG)/shutdown_test $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/streaming_throughput_test $(BINDIR)/$(CONFIG)/stress_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_stress_test @@ -1911,6 +1912,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/fling_stream_test || ( echo test fling_stream_test failed ; exit 1 ) $(E) "[RUN] Testing fling_test" $(Q) $(BINDIR)/$(CONFIG)/fling_test || ( echo test fling_test failed ; exit 1 ) + $(E) "[RUN] Testing gpr_avl_test" + $(Q) $(BINDIR)/$(CONFIG)/gpr_avl_test || ( echo test gpr_avl_test failed ; exit 1 ) $(E) "[RUN] Testing gpr_cmdline_test" $(Q) $(BINDIR)/$(CONFIG)/gpr_cmdline_test || ( echo test gpr_cmdline_test failed ; exit 1 ) $(E) "[RUN] Testing gpr_cpu_test" @@ -4364,6 +4367,7 @@ LIBGPR_SRC = \ src/core/profiling/basic_timers.c \ src/core/profiling/stap_timers.c \ src/core/support/alloc.c \ + src/core/support/avl.c \ src/core/support/cmdline.c \ src/core/support/cpu_iphone.c \ src/core/support/cpu_linux.c \ @@ -4408,6 +4412,7 @@ PUBLIC_HEADERS_C += \ include/grpc/support/atm_gcc_atomic.h \ include/grpc/support/atm_gcc_sync.h \ include/grpc/support/atm_win32.h \ + include/grpc/support/avl.h \ include/grpc/support/cmdline.h \ include/grpc/support/cpu.h \ include/grpc/support/histogram.h \ @@ -7592,6 +7597,35 @@ endif endif +GPR_AVL_TEST_SRC = \ + test/core/support/avl_test.c \ + +GPR_AVL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_AVL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/gpr_avl_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/gpr_avl_test: $(GPR_AVL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(GPR_AVL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/gpr_avl_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/support/avl_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +deps_gpr_avl_test: $(GPR_AVL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GPR_AVL_TEST_OBJS:.o=.dep) +endif +endif + + GPR_CMDLINE_TEST_SRC = \ test/core/support/cmdline_test.c \ diff --git a/binding.gyp b/binding.gyp index 1883f730fc8..ff2d794f922 100644 --- a/binding.gyp +++ b/binding.gyp @@ -97,6 +97,7 @@ 'src/core/profiling/basic_timers.c', 'src/core/profiling/stap_timers.c', 'src/core/support/alloc.c', + 'src/core/support/avl.c', 'src/core/support/cmdline.c', 'src/core/support/cpu_iphone.c', 'src/core/support/cpu_linux.c', diff --git a/build.yaml b/build.yaml index 2af2c1e24dc..cc8a942e91a 100644 --- a/build.yaml +++ b/build.yaml @@ -373,6 +373,7 @@ libs: - include/grpc/support/atm_gcc_atomic.h - include/grpc/support/atm_gcc_sync.h - include/grpc/support/atm_win32.h + - include/grpc/support/avl.h - include/grpc/support/cmdline.h - include/grpc/support/cpu.h - include/grpc/support/histogram.h @@ -410,6 +411,7 @@ libs: - src/core/profiling/basic_timers.c - src/core/profiling/stap_timers.c - src/core/support/alloc.c + - src/core/support/avl.c - src/core/support/cmdline.c - src/core/support/cpu_iphone.c - src/core/support/cpu_linux.c @@ -969,6 +971,14 @@ targets: src: - tools/codegen/core/gen_legal_metadata_characters.c deps: [] +- name: gpr_avl_test + build: test + language: c + src: + - test/core/support/avl_test.c + deps: + - gpr_test_util + - gpr - name: gpr_cmdline_test build: test language: c diff --git a/gRPC.podspec b/gRPC.podspec index 6bc17f30085..9fa4fabbd66 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -78,6 +78,7 @@ Pod::Spec.new do |s| 'include/grpc/support/atm_gcc_atomic.h', 'include/grpc/support/atm_gcc_sync.h', 'include/grpc/support/atm_win32.h', + 'include/grpc/support/avl.h', 'include/grpc/support/cmdline.h', 'include/grpc/support/cpu.h', 'include/grpc/support/histogram.h', @@ -103,6 +104,7 @@ Pod::Spec.new do |s| 'src/core/profiling/basic_timers.c', 'src/core/profiling/stap_timers.c', 'src/core/support/alloc.c', + 'src/core/support/avl.c', 'src/core/support/cmdline.c', 'src/core/support/cpu_iphone.c', 'src/core/support/cpu_linux.c', diff --git a/include/grpc/support/avl.h b/include/grpc/support/avl.h new file mode 100644 index 00000000000..7e0eb96e063 --- /dev/null +++ b/include/grpc/support/avl.h @@ -0,0 +1,67 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_SUPPORT_AVL_H +#define GRPC_SUPPORT_AVL_H + +#include + +typedef struct gpr_avl_node { + gpr_refcount refs; + void *key; + void *value; + struct gpr_avl_node *left; + struct gpr_avl_node *right; + long height; +} gpr_avl_node; + +typedef struct gpr_avl_vtable { + void (*destroy_key)(void *key); + void *(*copy_key)(void *key); + long (*compare_keys)(void *key1, void *key2); + void (*destroy_value)(void *value); + void *(*copy_value)(void *value); +} gpr_avl_vtable; + +typedef struct gpr_avl { + const gpr_avl_vtable *vtable; + gpr_avl_node *root; +} gpr_avl; + +gpr_avl gpr_avl_create(const gpr_avl_vtable *vtable); +void gpr_avl_destroy(gpr_avl avl); +gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value); +gpr_avl gpr_avl_remove(gpr_avl avl, void *key); +void *gpr_avl_get(gpr_avl avl, void *key); + +#endif diff --git a/src/core/support/avl.c b/src/core/support/avl.c new file mode 100644 index 00000000000..b1f55853984 --- /dev/null +++ b/src/core/support/avl.c @@ -0,0 +1,233 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#include +#include + +#include +#include +#include + +gpr_avl gpr_avl_create(const gpr_avl_vtable *vtable) { + gpr_avl out; + out.vtable = vtable; + out.root = NULL; + return out; +} + +static gpr_avl_node *ref_node(gpr_avl_node *node) { + if (node) { + gpr_ref(&node->refs); + } + return node; +} + +static void unref_node(const gpr_avl_vtable *vtable, gpr_avl_node *node) { + if (node == NULL) { + return; + } + if (gpr_unref(&node->refs)) { + vtable->destroy_key(node->key); + vtable->destroy_value(node->value); + unref_node(vtable, node->left); + unref_node(vtable, node->right); + gpr_free(node); + } +} + +static long node_height(gpr_avl_node *node) { + return node == NULL ? 0 : node->height; +} + +static long calculate_height(gpr_avl_node *node) { + return node == NULL ? 0 : 1 + GPR_MAX(calculate_height(node->left), + calculate_height(node->right)); +} + +static void assert_invariants(gpr_avl_node *n) { + if (n == NULL) return; + assert_invariants(n->left); + assert_invariants(n->right); + assert(calculate_height(n) == n->height); + assert(labs(node_height(n->left) - node_height(n->right)) <= 1); +} + +gpr_avl_node *new_node(void *key, void *value, gpr_avl_node *left, + gpr_avl_node *right) { + gpr_avl_node *node = gpr_malloc(sizeof(*node)); + gpr_ref_init(&node->refs, 1); + node->key = key; + node->value = value; + node->left = left; + node->right = right; + node->height = 1 + GPR_MAX(node_height(left), node_height(right)); + return node; +} + +static gpr_avl_node *get(const gpr_avl_vtable *vtable, gpr_avl_node *node, + void *key) { + long cmp; + + if (node == NULL) { + return NULL; + } + + cmp = vtable->compare_keys(node->key, key); + if (cmp == 0) { + return node; + } else if (cmp > 0) { + return get(vtable, node->left, key); + } else { + return get(vtable, node->right, key); + } +} + +void *gpr_avl_get(gpr_avl avl, void *key) { + gpr_avl_node *node = get(avl.vtable, avl.root, key); + return node ? node->value : NULL; +} + +static gpr_avl_node *rotate_left(const gpr_avl_vtable *vtable, void *key, + void *value, gpr_avl_node *left, + gpr_avl_node *right) { + gpr_avl_node *n = + new_node(vtable->copy_key(right->key), vtable->copy_value(right->value), + new_node(key, value, left, ref_node(right->left)), + ref_node(right->right)); + unref_node(vtable, right); + return n; +} + +static gpr_avl_node *rotate_right(const gpr_avl_vtable *vtable, void *key, + void *value, gpr_avl_node *left, + gpr_avl_node *right) { + gpr_avl_node *n = new_node( + vtable->copy_key(left->key), vtable->copy_value(left->value), + ref_node(left->left), new_node(key, value, ref_node(left->right), right)); + unref_node(vtable, left); + return n; +} + +static gpr_avl_node *rotate_left_right(const gpr_avl_vtable *vtable, void *key, + void *value, gpr_avl_node *left, + gpr_avl_node *right) { + /* rotate_right(..., rotate_left(left), right) */ + /* TODO(ctiller): elide first allocation */ + gpr_avl_node *leftp = new_node( + vtable->copy_key(left->right->key), + vtable->copy_value(left->right->value), + new_node(vtable->copy_key(left->key), vtable->copy_value(left->value), + ref_node(left->left), ref_node(left->right->left)), + ref_node(left->right->right)); + gpr_avl_node *n = + new_node(vtable->copy_key(leftp->key), vtable->copy_value(leftp->value), + ref_node(leftp->left), + new_node(key, value, ref_node(leftp->right), right)); + unref_node(vtable, left); + unref_node(vtable, leftp); + return n; +} + +static gpr_avl_node *rotate_right_left(const gpr_avl_vtable *vtable, void *key, + void *value, gpr_avl_node *left, + gpr_avl_node *right) { + /* rotate_left(..., left, rotate_right(right)) */ + /* TODO(ctiller): elide first allocation */ + gpr_avl_node *rightp = new_node( + vtable->copy_key(right->left->key), + vtable->copy_value(right->left->value), ref_node(right->left->left), + new_node(vtable->copy_key(right->key), vtable->copy_key(right->value), + ref_node(right->left->right), ref_node(right->right))); + gpr_avl_node *n = + new_node(vtable->copy_key(rightp->key), vtable->copy_value(rightp->value), + new_node(key, value, left, ref_node(rightp->left)), + ref_node(rightp->right)); + unref_node(vtable, right); + unref_node(vtable, rightp); + return n; +} + +static gpr_avl_node *add(const gpr_avl_vtable *vtable, gpr_avl_node *node, + void *key, void *value) { + long cmp; + gpr_avl_node *l; + gpr_avl_node *r; + if (node == NULL) { + return new_node(key, value, NULL, NULL); + } + cmp = vtable->compare_keys(node->key, key); + if (cmp == 0) { + return new_node(key, value, NULL, NULL); + } + l = node->left; + r = node->right; + if (cmp > 0) { + l = add(vtable, l, key, value); + ref_node(r); + } else { + r = add(vtable, r, key, value); + ref_node(l); + } + + key = vtable->copy_key(node->key); + value = vtable->copy_value(node->value); + + switch (node_height(l) - node_height(r)) { + case 2: + if (node_height(l->left) - node_height(l->right) == 1) { + return rotate_right(vtable, key, value, l, r); + } else { + return rotate_left_right(vtable, key, value, l, r); + } + case -2: + if (node_height(r->left) - node_height(r->right) == 1) { + return rotate_right_left(vtable, key, value, l, r); + } else { + return rotate_left(vtable, key, value, l, r); + } + default: + return new_node(key, value, l, r); + } +} + +gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value) { + gpr_avl_node *old_root = avl.root; + avl.root = add(avl.vtable, avl.root, key, value); + assert_invariants(avl.root); + unref_node(avl.vtable, old_root); + return avl; +} + +void gpr_avl_destroy(gpr_avl avl) { unref_node(avl.vtable, avl.root); } diff --git a/test/core/support/avl_test.c b/test/core/support/avl_test.c new file mode 100644 index 00000000000..bfbead39fee --- /dev/null +++ b/test/core/support/avl_test.c @@ -0,0 +1,174 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +#include +#include +#include "test/core/util/test_config.h" + +static int *box(int x) { + int *b = gpr_malloc(sizeof(*b)); + *b = x; + return b; +} + +static long int_compare(void *int1, void *int2) { + return (*(int *)int1) - (*(int *)int2); +} +static void *int_copy(void *p) { return box(*(int *)p); } + +static const gpr_avl_vtable int_int_vtable = {gpr_free, int_copy, int_compare, + gpr_free, int_copy}; + +static void check_get(gpr_avl avl, int key, int value) { + int *k = box(key); + gpr_log(GPR_DEBUG, "check avl[%d] == %d", key, value); + GPR_ASSERT(*(int *)gpr_avl_get(avl, k) == value); + gpr_free(k); +} + +static void check_negget(gpr_avl avl, int key) { + int *k = box(key); + gpr_log(GPR_DEBUG, "check avl[%d] == nil", key); + GPR_ASSERT(gpr_avl_get(avl, k) == NULL); + gpr_free(k); +} + +static void test_get(void) { + gpr_avl avl; + gpr_log(GPR_DEBUG, "test_get"); + avl = gpr_avl_add( + gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(1), box(11)), + box(2), box(22)), + box(3), box(33)); + check_get(avl, 1, 11); + check_get(avl, 2, 22); + check_get(avl, 3, 33); + check_negget(avl, 4); + gpr_avl_destroy(avl); +} + +static void test_ll(void) { + gpr_avl avl; + gpr_log(GPR_DEBUG, "test_ll"); + avl = gpr_avl_add( + gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(5), box(1)), + box(4), box(2)), + box(3), box(3)); + GPR_ASSERT(*(int *)avl.root->key == 4); + GPR_ASSERT(*(int *)avl.root->left->key == 3); + GPR_ASSERT(*(int *)avl.root->right->key == 5); + gpr_avl_destroy(avl); +} + +static void test_lr(void) { + gpr_avl avl; + gpr_log(GPR_DEBUG, "test_lr"); + avl = gpr_avl_add( + gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(5), box(1)), + box(3), box(2)), + box(4), box(3)); + GPR_ASSERT(*(int *)avl.root->key == 4); + GPR_ASSERT(*(int *)avl.root->left->key == 3); + GPR_ASSERT(*(int *)avl.root->right->key == 5); + gpr_avl_destroy(avl); +} + +static void test_rr(void) { + gpr_avl avl; + gpr_log(GPR_DEBUG, "test_rr"); + avl = gpr_avl_add( + gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(3), box(1)), + box(4), box(2)), + box(5), box(3)); + GPR_ASSERT(*(int *)avl.root->key == 4); + GPR_ASSERT(*(int *)avl.root->left->key == 3); + GPR_ASSERT(*(int *)avl.root->right->key == 5); + gpr_avl_destroy(avl); +} + +static void test_rl(void) { + gpr_avl avl; + gpr_log(GPR_DEBUG, "test_rl"); + avl = gpr_avl_add( + gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(3), box(1)), + box(5), box(2)), + box(4), box(3)); + GPR_ASSERT(*(int *)avl.root->key == 4); + GPR_ASSERT(*(int *)avl.root->left->key == 3); + GPR_ASSERT(*(int *)avl.root->right->key == 5); + gpr_avl_destroy(avl); +} + +static void test_unbalanced(void) { + gpr_avl avl; + gpr_log(GPR_DEBUG, "test_unbalanced"); + avl = gpr_avl_add( + gpr_avl_add( + gpr_avl_add(gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), + box(5), box(1)), + box(4), box(2)), + box(3), box(3)), + box(2), box(4)), + box(1), box(5)); + GPR_ASSERT(*(int *)avl.root->key == 4); + GPR_ASSERT(*(int *)avl.root->left->key == 2); + GPR_ASSERT(*(int *)avl.root->left->left->key == 1); + GPR_ASSERT(*(int *)avl.root->left->right->key == 3); + GPR_ASSERT(*(int *)avl.root->right->key == 5); + gpr_avl_destroy(avl); +} + +static void test_replace(void) { + gpr_avl avl; + gpr_log(GPR_DEBUG, "test_replace"); + avl = + gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(1), box(1)), + box(1), box(2)); + check_get(avl, 1, 2); + gpr_avl_destroy(avl); +} + +int main(int argc, char *argv[]) { + grpc_test_init(argc, argv); + + test_get(); + test_ll(); + test_lr(); + test_rr(); + test_rl(); + test_unbalanced(); + test_replace(); + + return 0; +} diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core index e411abf3005..3a1d097fb95 100644 --- a/tools/doxygen/Doxyfile.core +++ b/tools/doxygen/Doxyfile.core @@ -772,6 +772,7 @@ include/grpc/support/atm.h \ include/grpc/support/atm_gcc_atomic.h \ include/grpc/support/atm_gcc_sync.h \ include/grpc/support/atm_win32.h \ +include/grpc/support/avl.h \ include/grpc/support/cmdline.h \ include/grpc/support/cpu.h \ include/grpc/support/histogram.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index f0ec37b089c..55a72aedae0 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1050,6 +1050,7 @@ include/grpc/support/atm.h \ include/grpc/support/atm_gcc_atomic.h \ include/grpc/support/atm_gcc_sync.h \ include/grpc/support/atm_win32.h \ +include/grpc/support/avl.h \ include/grpc/support/cmdline.h \ include/grpc/support/cpu.h \ include/grpc/support/histogram.h \ @@ -1085,6 +1086,7 @@ src/core/support/time_precise.h \ src/core/profiling/basic_timers.c \ src/core/profiling/stap_timers.c \ src/core/support/alloc.c \ +src/core/support/avl.c \ src/core/support/cmdline.c \ src/core/support/cpu_iphone.c \ src/core/support/cpu_linux.c \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 577cf4a19f0..66ca0dc2e39 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -218,6 +218,18 @@ "tools/codegen/core/gen_legal_metadata_characters.c" ] }, + { + "deps": [ + "gpr", + "gpr_test_util" + ], + "headers": [], + "language": "c", + "name": "gpr_avl_test", + "src": [ + "test/core/support/avl_test.c" + ] + }, { "deps": [ "gpr", @@ -14175,6 +14187,7 @@ "include/grpc/support/atm_gcc_atomic.h", "include/grpc/support/atm_gcc_sync.h", "include/grpc/support/atm_win32.h", + "include/grpc/support/avl.h", "include/grpc/support/cmdline.h", "include/grpc/support/cpu.h", "include/grpc/support/histogram.h", @@ -14216,6 +14229,7 @@ "include/grpc/support/atm_gcc_atomic.h", "include/grpc/support/atm_gcc_sync.h", "include/grpc/support/atm_win32.h", + "include/grpc/support/avl.h", "include/grpc/support/cmdline.h", "include/grpc/support/cpu.h", "include/grpc/support/histogram.h", @@ -14242,6 +14256,7 @@ "src/core/profiling/stap_timers.c", "src/core/profiling/timers.h", "src/core/support/alloc.c", + "src/core/support/avl.c", "src/core/support/block_annotate.h", "src/core/support/cmdline.c", "src/core/support/cpu_iphone.c", diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index 029fc5ec719..ff0bae7430d 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -207,6 +207,24 @@ "posix" ] }, + { + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "gpr_avl_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ] + }, { "ci_platforms": [ "linux", diff --git a/vsprojects/buildtests_c.sln b/vsprojects/buildtests_c.sln index d902ba8ff7b..e7fdec449a0 100644 --- a/vsprojects/buildtests_c.sln +++ b/vsprojects/buildtests_c.sln @@ -732,6 +732,15 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gen_legal_metadata_characte lib = "False" EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gpr_avl_test", "vcxproj\test\gpr_avl_test\gpr_avl_test.vcxproj", "{144D8CFF-2737-A18A-DCFD-01603533D63F}" + ProjectSection(myProperties) = preProject + lib = "False" + EndProjectSection + ProjectSection(ProjectDependencies) = postProject + {EAB0A629-17A9-44DB-B5FF-E91A721FE037} = {EAB0A629-17A9-44DB-B5FF-E91A721FE037} + {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} + EndProjectSection +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gpr_cmdline_test", "vcxproj\test\gpr_cmdline_test\gpr_cmdline_test.vcxproj", "{10668A5D-65CD-F530-22D0-747B395B4C26}" ProjectSection(myProperties) = preProject lib = "False" @@ -10592,6 +10601,22 @@ Global {A635DE99-B131-CA00-2D3B-8691D60B76C2}.Release-DLL|Win32.Build.0 = Release|Win32 {A635DE99-B131-CA00-2D3B-8691D60B76C2}.Release-DLL|x64.ActiveCfg = Release|x64 {A635DE99-B131-CA00-2D3B-8691D60B76C2}.Release-DLL|x64.Build.0 = Release|x64 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Debug|Win32.ActiveCfg = Debug|Win32 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Debug|x64.ActiveCfg = Debug|x64 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Release|Win32.ActiveCfg = Release|Win32 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Release|x64.ActiveCfg = Release|x64 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Debug|Win32.Build.0 = Debug|Win32 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Debug|x64.Build.0 = Debug|x64 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Release|Win32.Build.0 = Release|Win32 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Release|x64.Build.0 = Release|x64 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Debug-DLL|Win32.ActiveCfg = Debug|Win32 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Debug-DLL|Win32.Build.0 = Debug|Win32 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Debug-DLL|x64.ActiveCfg = Debug|x64 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Debug-DLL|x64.Build.0 = Debug|x64 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Release-DLL|Win32.ActiveCfg = Release|Win32 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Release-DLL|Win32.Build.0 = Release|Win32 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Release-DLL|x64.ActiveCfg = Release|x64 + {144D8CFF-2737-A18A-DCFD-01603533D63F}.Release-DLL|x64.Build.0 = Release|x64 {10668A5D-65CD-F530-22D0-747B395B4C26}.Debug|Win32.ActiveCfg = Debug|Win32 {10668A5D-65CD-F530-22D0-747B395B4C26}.Debug|x64.ActiveCfg = Debug|x64 {10668A5D-65CD-F530-22D0-747B395B4C26}.Release|Win32.ActiveCfg = Release|Win32 diff --git a/vsprojects/vcxproj/gpr/gpr.vcxproj b/vsprojects/vcxproj/gpr/gpr.vcxproj index fa495db07b6..b20d61d9ba4 100644 --- a/vsprojects/vcxproj/gpr/gpr.vcxproj +++ b/vsprojects/vcxproj/gpr/gpr.vcxproj @@ -139,6 +139,7 @@ + @@ -181,6 +182,8 @@ + + diff --git a/vsprojects/vcxproj/gpr/gpr.vcxproj.filters b/vsprojects/vcxproj/gpr/gpr.vcxproj.filters index ee03e454535..9ddb9c01199 100644 --- a/vsprojects/vcxproj/gpr/gpr.vcxproj.filters +++ b/vsprojects/vcxproj/gpr/gpr.vcxproj.filters @@ -10,6 +10,9 @@ src\core\support + + src\core\support + src\core\support @@ -138,6 +141,9 @@ include\grpc\support + + include\grpc\support + include\grpc\support diff --git a/vsprojects/vcxproj/test/gpr_avl_test/gpr_avl_test.vcxproj b/vsprojects/vcxproj/test/gpr_avl_test/gpr_avl_test.vcxproj new file mode 100644 index 00000000000..9703733235b --- /dev/null +++ b/vsprojects/vcxproj/test/gpr_avl_test/gpr_avl_test.vcxproj @@ -0,0 +1,178 @@ + + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {144D8CFF-2737-A18A-DCFD-01603533D63F} + + + + v100 + + + v110 + + + v120 + + + Application + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + + gpr_avl_test + static + Debug + Debug + + + gpr_avl_test + static + Debug + Debug + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_LIB;_USE_32BIT_TIME_T;%(PreprocessorDefinitions) + true + MultiThreadedDebug + true + None + + + Console + true + false + + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + MultiThreadedDebug + true + None + + + Console + true + false + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;_USE_32BIT_TIME_T;%(PreprocessorDefinitions) + true + MultiThreaded + true + None + + + Console + true + false + true + true + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + MultiThreaded + true + None + + + Console + true + false + true + true + + + + + + + + + {EAB0A629-17A9-44DB-B5FF-E91A721FE037} + + + {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + diff --git a/vsprojects/vcxproj/test/gpr_avl_test/gpr_avl_test.vcxproj.filters b/vsprojects/vcxproj/test/gpr_avl_test/gpr_avl_test.vcxproj.filters new file mode 100644 index 00000000000..bccfdfdff1e --- /dev/null +++ b/vsprojects/vcxproj/test/gpr_avl_test/gpr_avl_test.vcxproj.filters @@ -0,0 +1,21 @@ + + + + + test\core\support + + + + + + {36d067be-341d-9b6e-8ebc-bc48318fa916} + + + {4f3292f9-bb3f-e90c-324d-120ff96d394a} + + + {d02b711f-14e2-086b-d3a5-48e2d82145ee} + + + + From 0593622d8f6dea84390577e6115acbfb8d571aa0 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 23 Nov 2015 14:56:46 -0800 Subject: [PATCH 08/13] AVL: removal, and passing tests --- include/grpc/support/avl.h | 3 +- src/core/support/avl.c | 150 +- test/core/support/avl_test.c | 3575 +++++++++++++++++++++++++++++++++- 3 files changed, 3646 insertions(+), 82 deletions(-) diff --git a/include/grpc/support/avl.h b/include/grpc/support/avl.h index 7e0eb96e063..d80eafec577 100644 --- a/include/grpc/support/avl.h +++ b/include/grpc/support/avl.h @@ -59,7 +59,8 @@ typedef struct gpr_avl { } gpr_avl; gpr_avl gpr_avl_create(const gpr_avl_vtable *vtable); -void gpr_avl_destroy(gpr_avl avl); +gpr_avl gpr_avl_ref(gpr_avl avl); +void gpr_avl_unref(gpr_avl avl); gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value); gpr_avl gpr_avl_remove(gpr_avl avl, void *key); void *gpr_avl_get(gpr_avl avl, void *key); diff --git a/src/core/support/avl.c b/src/core/support/avl.c index b1f55853984..7b67637520f 100644 --- a/src/core/support/avl.c +++ b/src/core/support/avl.c @@ -71,17 +71,20 @@ static long node_height(gpr_avl_node *node) { return node == NULL ? 0 : node->height; } +#ifndef NDEBUG static long calculate_height(gpr_avl_node *node) { return node == NULL ? 0 : 1 + GPR_MAX(calculate_height(node->left), calculate_height(node->right)); } +#endif -static void assert_invariants(gpr_avl_node *n) { - if (n == NULL) return; +static gpr_avl_node *assert_invariants(gpr_avl_node *n) { + if (n == NULL) return NULL; assert_invariants(n->left); assert_invariants(n->right); assert(calculate_height(n) == n->height); assert(labs(node_height(n->left) - node_height(n->right)) <= 1); + return n; } gpr_avl_node *new_node(void *key, void *value, gpr_avl_node *left, @@ -90,8 +93,8 @@ gpr_avl_node *new_node(void *key, void *value, gpr_avl_node *left, gpr_ref_init(&node->refs, 1); node->key = key; node->value = value; - node->left = left; - node->right = right; + node->left = assert_invariants(left); + node->right = assert_invariants(right); node->height = 1 + GPR_MAX(node_height(left), node_height(right)); return node; } @@ -144,19 +147,13 @@ static gpr_avl_node *rotate_left_right(const gpr_avl_vtable *vtable, void *key, void *value, gpr_avl_node *left, gpr_avl_node *right) { /* rotate_right(..., rotate_left(left), right) */ - /* TODO(ctiller): elide first allocation */ - gpr_avl_node *leftp = new_node( + gpr_avl_node *n = new_node( vtable->copy_key(left->right->key), vtable->copy_value(left->right->value), new_node(vtable->copy_key(left->key), vtable->copy_value(left->value), ref_node(left->left), ref_node(left->right->left)), - ref_node(left->right->right)); - gpr_avl_node *n = - new_node(vtable->copy_key(leftp->key), vtable->copy_value(leftp->value), - ref_node(leftp->left), - new_node(key, value, ref_node(leftp->right), right)); + new_node(key, value, ref_node(left->right->right), right)); unref_node(vtable, left); - unref_node(vtable, leftp); return n; } @@ -164,21 +161,39 @@ static gpr_avl_node *rotate_right_left(const gpr_avl_vtable *vtable, void *key, void *value, gpr_avl_node *left, gpr_avl_node *right) { /* rotate_left(..., left, rotate_right(right)) */ - /* TODO(ctiller): elide first allocation */ - gpr_avl_node *rightp = new_node( + gpr_avl_node *n = new_node( vtable->copy_key(right->left->key), - vtable->copy_value(right->left->value), ref_node(right->left->left), + vtable->copy_value(right->left->value), + new_node(key, value, left, ref_node(right->left->left)), new_node(vtable->copy_key(right->key), vtable->copy_key(right->value), ref_node(right->left->right), ref_node(right->right))); - gpr_avl_node *n = - new_node(vtable->copy_key(rightp->key), vtable->copy_value(rightp->value), - new_node(key, value, left, ref_node(rightp->left)), - ref_node(rightp->right)); unref_node(vtable, right); - unref_node(vtable, rightp); return n; } +static gpr_avl_node *rebalance(const gpr_avl_vtable *vtable, void *key, + void *value, gpr_avl_node *left, + gpr_avl_node *right) { + switch (node_height(left) - node_height(right)) { + case 2: + if (node_height(left->left) - node_height(left->right) == -1) { + return assert_invariants( + rotate_left_right(vtable, key, value, left, right)); + } else { + return assert_invariants(rotate_right(vtable, key, value, left, right)); + } + case -2: + if (node_height(right->left) - node_height(right->right) == 1) { + return assert_invariants( + rotate_right_left(vtable, key, value, left, right)); + } else { + return assert_invariants(rotate_left(vtable, key, value, left, right)); + } + default: + return assert_invariants(new_node(key, value, left, right)); + } +} + static gpr_avl_node *add(const gpr_avl_vtable *vtable, gpr_avl_node *node, void *key, void *value) { long cmp; @@ -189,8 +204,10 @@ static gpr_avl_node *add(const gpr_avl_vtable *vtable, gpr_avl_node *node, } cmp = vtable->compare_keys(node->key, key); if (cmp == 0) { - return new_node(key, value, NULL, NULL); + return assert_invariants( + new_node(key, value, ref_node(node->left), ref_node(node->right))); } + l = node->left; r = node->right; if (cmp > 0) { @@ -200,34 +217,85 @@ static gpr_avl_node *add(const gpr_avl_vtable *vtable, gpr_avl_node *node, r = add(vtable, r, key, value); ref_node(l); } + return rebalance(vtable, vtable->copy_key(node->key), + vtable->copy_value(node->value), l, r); +} - key = vtable->copy_key(node->key); - value = vtable->copy_value(node->value); +gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value) { + gpr_avl_node *old_root = avl.root; + avl.root = add(avl.vtable, avl.root, key, value); + assert_invariants(avl.root); + unref_node(avl.vtable, old_root); + return avl; +} - switch (node_height(l) - node_height(r)) { - case 2: - if (node_height(l->left) - node_height(l->right) == 1) { - return rotate_right(vtable, key, value, l, r); - } else { - return rotate_left_right(vtable, key, value, l, r); - } - case -2: - if (node_height(r->left) - node_height(r->right) == 1) { - return rotate_right_left(vtable, key, value, l, r); - } else { - return rotate_left(vtable, key, value, l, r); - } - default: - return new_node(key, value, l, r); +static gpr_avl_node *in_order_head(gpr_avl_node *node) { + while (node->left != NULL) { + node = node->left; } + return node; } -gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value) { +static gpr_avl_node *in_order_tail(gpr_avl_node *node) { + while (node->right != NULL) { + node = node->right; + } + return node; +} + +static gpr_avl_node *remove(const gpr_avl_vtable *vtable, gpr_avl_node *node, + void *key) { + long cmp; + gpr_avl_node *l; + gpr_avl_node *r; + if (node == NULL) { + return NULL; + } + cmp = vtable->compare_keys(node->key, key); + if (cmp == 0) { + if (node->left == NULL) { + return ref_node(node->right); + } else if (node->right == NULL) { + return ref_node(node->left); + } else if (node->left->height < node->right->height) { + gpr_avl_node *h = in_order_head(node->right); + l = ref_node(node->left); + r = remove(vtable, node->right, h->key); + return assert_invariants(rebalance(vtable, vtable->copy_key(h->key), + vtable->copy_value(h->value), l, r)); + } else { + gpr_avl_node *h = in_order_tail(node->left); + l = remove(vtable, node->left, h->key); + r = ref_node(node->right); + return assert_invariants(rebalance(vtable, vtable->copy_key(h->key), + vtable->copy_value(h->value), l, r)); + } + } + + l = node->left; + r = node->right; + if (cmp > 0) { + l = remove(vtable, l, key); + ref_node(r); + } else { + r = remove(vtable, r, key); + ref_node(l); + } + return rebalance(vtable, vtable->copy_key(node->key), + vtable->copy_value(node->value), l, r); +} + +gpr_avl gpr_avl_remove(gpr_avl avl, void *key) { gpr_avl_node *old_root = avl.root; - avl.root = add(avl.vtable, avl.root, key, value); + avl.root = remove(avl.vtable, avl.root, key); assert_invariants(avl.root); unref_node(avl.vtable, old_root); return avl; } -void gpr_avl_destroy(gpr_avl avl) { unref_node(avl.vtable, avl.root); } +gpr_avl gpr_avl_ref(gpr_avl avl) { + ref_node(avl.root); + return avl; +} + +void gpr_avl_unref(gpr_avl avl) { unref_node(avl.vtable, avl.root); } diff --git a/test/core/support/avl_test.c b/test/core/support/avl_test.c index bfbead39fee..981888c1ec2 100644 --- a/test/core/support/avl_test.c +++ b/test/core/support/avl_test.c @@ -32,8 +32,14 @@ */ #include + +#include +#include + #include #include +#include + #include "test/core/util/test_config.h" static int *box(int x) { @@ -52,111 +58,3595 @@ static const gpr_avl_vtable int_int_vtable = {gpr_free, int_copy, int_compare, static void check_get(gpr_avl avl, int key, int value) { int *k = box(key); - gpr_log(GPR_DEBUG, "check avl[%d] == %d", key, value); GPR_ASSERT(*(int *)gpr_avl_get(avl, k) == value); gpr_free(k); } static void check_negget(gpr_avl avl, int key) { int *k = box(key); - gpr_log(GPR_DEBUG, "check avl[%d] == nil", key); GPR_ASSERT(gpr_avl_get(avl, k) == NULL); gpr_free(k); } +static gpr_avl remove_int(gpr_avl avl, int key) { + int *k = box(key); + avl = gpr_avl_remove(avl, k); + gpr_free(k); + return avl; +} + static void test_get(void) { gpr_avl avl; gpr_log(GPR_DEBUG, "test_get"); - avl = gpr_avl_add( - gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(1), box(11)), - box(2), box(22)), - box(3), box(33)); + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(1), box(11)); + avl = gpr_avl_add(avl, box(2), box(22)); + avl = gpr_avl_add(avl, box(3), box(33)); check_get(avl, 1, 11); check_get(avl, 2, 22); check_get(avl, 3, 33); check_negget(avl, 4); - gpr_avl_destroy(avl); + gpr_avl_unref(avl); } static void test_ll(void) { gpr_avl avl; gpr_log(GPR_DEBUG, "test_ll"); - avl = gpr_avl_add( - gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(5), box(1)), - box(4), box(2)), - box(3), box(3)); + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(5), box(1)); + avl = gpr_avl_add(avl, box(4), box(2)); + avl = gpr_avl_add(avl, box(3), box(3)); GPR_ASSERT(*(int *)avl.root->key == 4); GPR_ASSERT(*(int *)avl.root->left->key == 3); GPR_ASSERT(*(int *)avl.root->right->key == 5); - gpr_avl_destroy(avl); + gpr_avl_unref(avl); } static void test_lr(void) { gpr_avl avl; gpr_log(GPR_DEBUG, "test_lr"); - avl = gpr_avl_add( - gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(5), box(1)), - box(3), box(2)), - box(4), box(3)); + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(5), box(1)); + avl = gpr_avl_add(avl, box(3), box(2)); + avl = gpr_avl_add(avl, box(4), box(3)); GPR_ASSERT(*(int *)avl.root->key == 4); GPR_ASSERT(*(int *)avl.root->left->key == 3); GPR_ASSERT(*(int *)avl.root->right->key == 5); - gpr_avl_destroy(avl); + gpr_avl_unref(avl); } static void test_rr(void) { gpr_avl avl; gpr_log(GPR_DEBUG, "test_rr"); - avl = gpr_avl_add( - gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(3), box(1)), - box(4), box(2)), - box(5), box(3)); + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(3), box(1)); + avl = gpr_avl_add(avl, box(4), box(2)); + avl = gpr_avl_add(avl, box(5), box(3)); GPR_ASSERT(*(int *)avl.root->key == 4); GPR_ASSERT(*(int *)avl.root->left->key == 3); GPR_ASSERT(*(int *)avl.root->right->key == 5); - gpr_avl_destroy(avl); + gpr_avl_unref(avl); } static void test_rl(void) { gpr_avl avl; gpr_log(GPR_DEBUG, "test_rl"); - avl = gpr_avl_add( - gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(3), box(1)), - box(5), box(2)), - box(4), box(3)); + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(3), box(1)); + avl = gpr_avl_add(avl, box(5), box(2)); + avl = gpr_avl_add(avl, box(4), box(3)); GPR_ASSERT(*(int *)avl.root->key == 4); GPR_ASSERT(*(int *)avl.root->left->key == 3); GPR_ASSERT(*(int *)avl.root->right->key == 5); - gpr_avl_destroy(avl); + gpr_avl_unref(avl); } static void test_unbalanced(void) { gpr_avl avl; gpr_log(GPR_DEBUG, "test_unbalanced"); - avl = gpr_avl_add( - gpr_avl_add( - gpr_avl_add(gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), - box(5), box(1)), - box(4), box(2)), - box(3), box(3)), - box(2), box(4)), - box(1), box(5)); + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(5), box(1)); + avl = gpr_avl_add(avl, box(4), box(2)); + avl = gpr_avl_add(avl, box(3), box(3)); + avl = gpr_avl_add(avl, box(2), box(4)); + avl = gpr_avl_add(avl, box(1), box(5)); GPR_ASSERT(*(int *)avl.root->key == 4); GPR_ASSERT(*(int *)avl.root->left->key == 2); GPR_ASSERT(*(int *)avl.root->left->left->key == 1); GPR_ASSERT(*(int *)avl.root->left->right->key == 3); GPR_ASSERT(*(int *)avl.root->right->key == 5); - gpr_avl_destroy(avl); + gpr_avl_unref(avl); } static void test_replace(void) { gpr_avl avl; gpr_log(GPR_DEBUG, "test_replace"); - avl = - gpr_avl_add(gpr_avl_add(gpr_avl_create(&int_int_vtable), box(1), box(1)), - box(1), box(2)); + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(1), box(1)); + avl = gpr_avl_add(avl, box(1), box(2)); check_get(avl, 1, 2); - gpr_avl_destroy(avl); + check_negget(avl, 2); + gpr_avl_unref(avl); +} + +static void test_remove(void) { + gpr_avl avl; + gpr_avl avl3, avl4, avl5, avln; + gpr_log(GPR_DEBUG, "test_remove"); + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(3), box(1)); + avl = gpr_avl_add(avl, box(4), box(2)); + avl = gpr_avl_add(avl, box(5), box(3)); + + avl3 = remove_int(gpr_avl_ref(avl), 3); + avl4 = remove_int(gpr_avl_ref(avl), 4); + avl5 = remove_int(gpr_avl_ref(avl), 5); + avln = remove_int(gpr_avl_ref(avl), 1); + + gpr_avl_unref(avl); + + check_negget(avl3, 3); + check_get(avl3, 4, 2); + check_get(avl3, 5, 3); + gpr_avl_unref(avl3); + + check_get(avl4, 3, 1); + check_negget(avl4, 4); + check_get(avl4, 5, 3); + gpr_avl_unref(avl4); + + check_get(avl5, 3, 1); + check_get(avl5, 4, 2); + check_negget(avl5, 5); + gpr_avl_unref(avl5); + + check_get(avln, 3, 1); + check_get(avln, 4, 2); + check_get(avln, 5, 3); + gpr_avl_unref(avln); +} + +static void test_badcase1(void) { + gpr_avl avl; + + gpr_log(GPR_DEBUG, "test_badcase1"); + + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(88), box(1)); + avl = remove_int(avl, 643); + avl = remove_int(avl, 983); + avl = gpr_avl_add(avl, box(985), box(4)); + avl = gpr_avl_add(avl, box(640), box(5)); + avl = gpr_avl_add(avl, box(41), box(6)); + avl = gpr_avl_add(avl, box(112), box(7)); + avl = gpr_avl_add(avl, box(342), box(8)); + avl = remove_int(avl, 1013); + avl = gpr_avl_add(avl, box(434), box(10)); + avl = gpr_avl_add(avl, box(520), box(11)); + avl = gpr_avl_add(avl, box(231), box(12)); + avl = gpr_avl_add(avl, box(852), box(13)); + avl = remove_int(avl, 461); + avl = gpr_avl_add(avl, box(108), box(15)); + avl = gpr_avl_add(avl, box(806), box(16)); + avl = gpr_avl_add(avl, box(827), box(17)); + avl = remove_int(avl, 796); + avl = gpr_avl_add(avl, box(340), box(19)); + avl = gpr_avl_add(avl, box(498), box(20)); + avl = gpr_avl_add(avl, box(203), box(21)); + avl = gpr_avl_add(avl, box(751), box(22)); + avl = gpr_avl_add(avl, box(150), box(23)); + avl = remove_int(avl, 237); + avl = gpr_avl_add(avl, box(830), box(25)); + avl = remove_int(avl, 1007); + avl = remove_int(avl, 394); + avl = gpr_avl_add(avl, box(65), box(28)); + avl = remove_int(avl, 904); + avl = remove_int(avl, 123); + avl = gpr_avl_add(avl, box(238), box(31)); + avl = gpr_avl_add(avl, box(184), box(32)); + avl = remove_int(avl, 331); + avl = gpr_avl_add(avl, box(827), box(34)); + + check_get(avl, 830, 25); + + gpr_avl_unref(avl); +} + +static void test_badcase2(void) { + gpr_avl avl; + + gpr_log(GPR_DEBUG, "test_badcase2"); + + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(288), box(1)); + avl = remove_int(avl, 415); + avl = gpr_avl_add(avl, box(953), box(3)); + avl = gpr_avl_add(avl, box(101), box(4)); + avl = gpr_avl_add(avl, box(516), box(5)); + avl = gpr_avl_add(avl, box(547), box(6)); + avl = gpr_avl_add(avl, box(467), box(7)); + avl = gpr_avl_add(avl, box(793), box(8)); + avl = remove_int(avl, 190); + avl = gpr_avl_add(avl, box(687), box(10)); + avl = gpr_avl_add(avl, box(242), box(11)); + avl = gpr_avl_add(avl, box(142), box(12)); + avl = remove_int(avl, 705); + avl = remove_int(avl, 578); + avl = remove_int(avl, 767); + avl = remove_int(avl, 183); + avl = gpr_avl_add(avl, box(950), box(17)); + avl = gpr_avl_add(avl, box(622), box(18)); + avl = remove_int(avl, 513); + avl = remove_int(avl, 429); + avl = gpr_avl_add(avl, box(205), box(21)); + avl = remove_int(avl, 663); + avl = remove_int(avl, 953); + avl = remove_int(avl, 892); + avl = gpr_avl_add(avl, box(236), box(25)); + avl = remove_int(avl, 982); + avl = remove_int(avl, 201); + avl = remove_int(avl, 684); + avl = gpr_avl_add(avl, box(572), box(29)); + avl = remove_int(avl, 817); + avl = gpr_avl_add(avl, box(970), box(31)); + avl = remove_int(avl, 347); + avl = remove_int(avl, 574); + avl = gpr_avl_add(avl, box(752), box(34)); + avl = gpr_avl_add(avl, box(670), box(35)); + avl = gpr_avl_add(avl, box(69), box(36)); + avl = remove_int(avl, 111); + avl = remove_int(avl, 523); + avl = gpr_avl_add(avl, box(141), box(39)); + avl = remove_int(avl, 159); + avl = gpr_avl_add(avl, box(947), box(41)); + avl = gpr_avl_add(avl, box(855), box(42)); + avl = remove_int(avl, 218); + avl = remove_int(avl, 6); + avl = gpr_avl_add(avl, box(753), box(45)); + avl = remove_int(avl, 82); + avl = remove_int(avl, 799); + avl = gpr_avl_add(avl, box(572), box(48)); + avl = remove_int(avl, 376); + avl = remove_int(avl, 413); + avl = gpr_avl_add(avl, box(458), box(51)); + avl = remove_int(avl, 897); + avl = gpr_avl_add(avl, box(191), box(53)); + avl = gpr_avl_add(avl, box(609), box(54)); + avl = remove_int(avl, 787); + avl = remove_int(avl, 710); + avl = remove_int(avl, 886); + avl = remove_int(avl, 835); + avl = remove_int(avl, 33); + avl = gpr_avl_add(avl, box(871), box(60)); + avl = remove_int(avl, 641); + avl = gpr_avl_add(avl, box(462), box(62)); + avl = remove_int(avl, 359); + avl = remove_int(avl, 767); + avl = gpr_avl_add(avl, box(310), box(65)); + avl = remove_int(avl, 757); + avl = remove_int(avl, 639); + avl = remove_int(avl, 314); + avl = gpr_avl_add(avl, box(2), box(69)); + avl = remove_int(avl, 138); + avl = gpr_avl_add(avl, box(669), box(71)); + avl = remove_int(avl, 477); + avl = gpr_avl_add(avl, box(366), box(73)); + avl = gpr_avl_add(avl, box(612), box(74)); + avl = gpr_avl_add(avl, box(106), box(75)); + avl = remove_int(avl, 161); + avl = gpr_avl_add(avl, box(388), box(77)); + avl = gpr_avl_add(avl, box(141), box(78)); + avl = remove_int(avl, 633); + avl = remove_int(avl, 459); + avl = gpr_avl_add(avl, box(40), box(81)); + avl = remove_int(avl, 689); + avl = gpr_avl_add(avl, box(823), box(83)); + avl = remove_int(avl, 485); + avl = gpr_avl_add(avl, box(903), box(85)); + avl = gpr_avl_add(avl, box(592), box(86)); + avl = remove_int(avl, 448); + avl = gpr_avl_add(avl, box(56), box(88)); + avl = remove_int(avl, 333); + avl = gpr_avl_add(avl, box(189), box(90)); + avl = gpr_avl_add(avl, box(103), box(91)); + avl = remove_int(avl, 164); + avl = remove_int(avl, 974); + avl = gpr_avl_add(avl, box(215), box(94)); + avl = remove_int(avl, 189); + avl = remove_int(avl, 504); + avl = gpr_avl_add(avl, box(868), box(97)); + avl = remove_int(avl, 909); + avl = remove_int(avl, 148); + avl = remove_int(avl, 469); + avl = gpr_avl_add(avl, box(994), box(101)); + avl = gpr_avl_add(avl, box(576), box(102)); + avl = remove_int(avl, 82); + avl = remove_int(avl, 209); + avl = gpr_avl_add(avl, box(276), box(105)); + avl = remove_int(avl, 856); + avl = gpr_avl_add(avl, box(750), box(107)); + avl = remove_int(avl, 871); + avl = gpr_avl_add(avl, box(301), box(109)); + avl = remove_int(avl, 260); + avl = remove_int(avl, 737); + avl = remove_int(avl, 719); + avl = gpr_avl_add(avl, box(933), box(113)); + avl = gpr_avl_add(avl, box(225), box(114)); + avl = gpr_avl_add(avl, box(975), box(115)); + avl = gpr_avl_add(avl, box(86), box(116)); + avl = remove_int(avl, 732); + avl = gpr_avl_add(avl, box(340), box(118)); + avl = gpr_avl_add(avl, box(271), box(119)); + avl = remove_int(avl, 206); + avl = gpr_avl_add(avl, box(949), box(121)); + avl = gpr_avl_add(avl, box(927), box(122)); + avl = gpr_avl_add(avl, box(34), box(123)); + avl = gpr_avl_add(avl, box(351), box(124)); + avl = remove_int(avl, 836); + avl = gpr_avl_add(avl, box(825), box(126)); + avl = gpr_avl_add(avl, box(352), box(127)); + avl = remove_int(avl, 107); + avl = remove_int(avl, 101); + avl = gpr_avl_add(avl, box(320), box(130)); + avl = gpr_avl_add(avl, box(3), box(131)); + avl = remove_int(avl, 998); + avl = remove_int(avl, 44); + avl = gpr_avl_add(avl, box(525), box(134)); + avl = gpr_avl_add(avl, box(864), box(135)); + avl = gpr_avl_add(avl, box(863), box(136)); + avl = remove_int(avl, 770); + avl = gpr_avl_add(avl, box(440), box(138)); + avl = remove_int(avl, 516); + avl = gpr_avl_add(avl, box(116), box(140)); + avl = remove_int(avl, 380); + avl = gpr_avl_add(avl, box(878), box(142)); + avl = remove_int(avl, 439); + avl = gpr_avl_add(avl, box(994), box(144)); + avl = remove_int(avl, 294); + avl = remove_int(avl, 593); + avl = gpr_avl_add(avl, box(696), box(147)); + avl = remove_int(avl, 8); + avl = gpr_avl_add(avl, box(881), box(149)); + avl = remove_int(avl, 32); + avl = remove_int(avl, 242); + avl = gpr_avl_add(avl, box(487), box(152)); + avl = gpr_avl_add(avl, box(637), box(153)); + avl = gpr_avl_add(avl, box(793), box(154)); + avl = gpr_avl_add(avl, box(696), box(155)); + avl = remove_int(avl, 458); + avl = gpr_avl_add(avl, box(828), box(157)); + avl = remove_int(avl, 784); + avl = remove_int(avl, 274); + avl = gpr_avl_add(avl, box(783), box(160)); + avl = remove_int(avl, 21); + avl = gpr_avl_add(avl, box(866), box(162)); + avl = remove_int(avl, 919); + avl = gpr_avl_add(avl, box(435), box(164)); + avl = remove_int(avl, 385); + avl = gpr_avl_add(avl, box(475), box(166)); + avl = remove_int(avl, 339); + avl = gpr_avl_add(avl, box(615), box(168)); + avl = remove_int(avl, 866); + avl = remove_int(avl, 82); + avl = remove_int(avl, 271); + avl = gpr_avl_add(avl, box(590), box(172)); + avl = gpr_avl_add(avl, box(852), box(173)); + avl = remove_int(avl, 318); + avl = remove_int(avl, 82); + avl = gpr_avl_add(avl, box(672), box(176)); + avl = remove_int(avl, 430); + avl = gpr_avl_add(avl, box(821), box(178)); + avl = gpr_avl_add(avl, box(365), box(179)); + avl = remove_int(avl, 78); + avl = gpr_avl_add(avl, box(700), box(181)); + avl = gpr_avl_add(avl, box(353), box(182)); + avl = remove_int(avl, 492); + avl = gpr_avl_add(avl, box(991), box(184)); + avl = remove_int(avl, 330); + avl = gpr_avl_add(avl, box(873), box(186)); + avl = remove_int(avl, 589); + avl = gpr_avl_add(avl, box(676), box(188)); + avl = gpr_avl_add(avl, box(790), box(189)); + avl = remove_int(avl, 521); + avl = remove_int(avl, 47); + avl = gpr_avl_add(avl, box(976), box(192)); + avl = gpr_avl_add(avl, box(683), box(193)); + avl = remove_int(avl, 803); + avl = remove_int(avl, 1006); + avl = gpr_avl_add(avl, box(775), box(196)); + avl = gpr_avl_add(avl, box(411), box(197)); + avl = gpr_avl_add(avl, box(697), box(198)); + avl = remove_int(avl, 50); + avl = gpr_avl_add(avl, box(213), box(200)); + avl = remove_int(avl, 714); + avl = gpr_avl_add(avl, box(981), box(202)); + avl = gpr_avl_add(avl, box(502), box(203)); + avl = gpr_avl_add(avl, box(697), box(204)); + avl = gpr_avl_add(avl, box(603), box(205)); + avl = gpr_avl_add(avl, box(117), box(206)); + avl = remove_int(avl, 363); + avl = gpr_avl_add(avl, box(104), box(208)); + avl = remove_int(avl, 842); + avl = gpr_avl_add(avl, box(48), box(210)); + avl = remove_int(avl, 764); + avl = gpr_avl_add(avl, box(482), box(212)); + avl = gpr_avl_add(avl, box(928), box(213)); + avl = gpr_avl_add(avl, box(30), box(214)); + avl = gpr_avl_add(avl, box(820), box(215)); + avl = gpr_avl_add(avl, box(334), box(216)); + avl = remove_int(avl, 306); + avl = gpr_avl_add(avl, box(789), box(218)); + avl = remove_int(avl, 924); + avl = gpr_avl_add(avl, box(53), box(220)); + avl = remove_int(avl, 657); + avl = gpr_avl_add(avl, box(130), box(222)); + avl = gpr_avl_add(avl, box(239), box(223)); + avl = remove_int(avl, 20); + avl = gpr_avl_add(avl, box(117), box(225)); + avl = remove_int(avl, 882); + avl = remove_int(avl, 891); + avl = gpr_avl_add(avl, box(9), box(228)); + avl = gpr_avl_add(avl, box(496), box(229)); + avl = gpr_avl_add(avl, box(750), box(230)); + avl = gpr_avl_add(avl, box(283), box(231)); + avl = gpr_avl_add(avl, box(802), box(232)); + avl = remove_int(avl, 352); + avl = gpr_avl_add(avl, box(374), box(234)); + avl = gpr_avl_add(avl, box(6), box(235)); + avl = gpr_avl_add(avl, box(756), box(236)); + avl = gpr_avl_add(avl, box(597), box(237)); + avl = gpr_avl_add(avl, box(661), box(238)); + avl = remove_int(avl, 96); + avl = gpr_avl_add(avl, box(894), box(240)); + avl = remove_int(avl, 749); + avl = gpr_avl_add(avl, box(71), box(242)); + avl = remove_int(avl, 68); + avl = gpr_avl_add(avl, box(388), box(244)); + avl = remove_int(avl, 119); + avl = remove_int(avl, 856); + avl = gpr_avl_add(avl, box(176), box(247)); + avl = gpr_avl_add(avl, box(993), box(248)); + avl = remove_int(avl, 178); + avl = remove_int(avl, 781); + avl = remove_int(avl, 771); + avl = remove_int(avl, 848); + avl = remove_int(avl, 376); + avl = remove_int(avl, 157); + avl = remove_int(avl, 142); + avl = remove_int(avl, 686); + avl = gpr_avl_add(avl, box(779), box(257)); + avl = gpr_avl_add(avl, box(484), box(258)); + avl = remove_int(avl, 837); + avl = gpr_avl_add(avl, box(388), box(260)); + avl = remove_int(avl, 987); + avl = gpr_avl_add(avl, box(336), box(262)); + avl = remove_int(avl, 855); + avl = gpr_avl_add(avl, box(668), box(264)); + avl = remove_int(avl, 648); + avl = gpr_avl_add(avl, box(193), box(266)); + avl = remove_int(avl, 939); + avl = gpr_avl_add(avl, box(740), box(268)); + avl = gpr_avl_add(avl, box(503), box(269)); + avl = gpr_avl_add(avl, box(765), box(270)); + avl = remove_int(avl, 924); + avl = remove_int(avl, 513); + avl = gpr_avl_add(avl, box(161), box(273)); + avl = gpr_avl_add(avl, box(502), box(274)); + avl = gpr_avl_add(avl, box(846), box(275)); + avl = remove_int(avl, 931); + avl = gpr_avl_add(avl, box(87), box(277)); + avl = gpr_avl_add(avl, box(949), box(278)); + avl = gpr_avl_add(avl, box(548), box(279)); + avl = gpr_avl_add(avl, box(951), box(280)); + avl = remove_int(avl, 1018); + avl = remove_int(avl, 568); + avl = gpr_avl_add(avl, box(138), box(283)); + avl = gpr_avl_add(avl, box(202), box(284)); + avl = gpr_avl_add(avl, box(157), box(285)); + avl = gpr_avl_add(avl, box(264), box(286)); + avl = gpr_avl_add(avl, box(370), box(287)); + avl = remove_int(avl, 736); + avl = remove_int(avl, 751); + avl = remove_int(avl, 506); + avl = remove_int(avl, 81); + avl = remove_int(avl, 358); + avl = remove_int(avl, 657); + avl = remove_int(avl, 86); + avl = gpr_avl_add(avl, box(876), box(295)); + avl = remove_int(avl, 354); + avl = gpr_avl_add(avl, box(134), box(297)); + avl = remove_int(avl, 781); + avl = remove_int(avl, 183); + avl = gpr_avl_add(avl, box(914), box(300)); + avl = remove_int(avl, 926); + avl = remove_int(avl, 398); + avl = remove_int(avl, 932); + avl = remove_int(avl, 804); + avl = remove_int(avl, 326); + avl = gpr_avl_add(avl, box(208), box(306)); + avl = gpr_avl_add(avl, box(699), box(307)); + avl = remove_int(avl, 576); + avl = remove_int(avl, 850); + avl = remove_int(avl, 514); + avl = remove_int(avl, 676); + avl = remove_int(avl, 549); + avl = remove_int(avl, 767); + avl = gpr_avl_add(avl, box(58), box(314)); + avl = gpr_avl_add(avl, box(265), box(315)); + avl = gpr_avl_add(avl, box(268), box(316)); + avl = gpr_avl_add(avl, box(103), box(317)); + avl = gpr_avl_add(avl, box(440), box(318)); + avl = remove_int(avl, 777); + avl = gpr_avl_add(avl, box(670), box(320)); + avl = remove_int(avl, 506); + avl = remove_int(avl, 487); + avl = gpr_avl_add(avl, box(421), box(323)); + avl = remove_int(avl, 514); + avl = gpr_avl_add(avl, box(701), box(325)); + avl = remove_int(avl, 949); + avl = remove_int(avl, 872); + avl = remove_int(avl, 139); + avl = gpr_avl_add(avl, box(781), box(329)); + avl = gpr_avl_add(avl, box(543), box(330)); + avl = gpr_avl_add(avl, box(147), box(331)); + avl = remove_int(avl, 190); + avl = gpr_avl_add(avl, box(453), box(333)); + avl = remove_int(avl, 262); + avl = remove_int(avl, 850); + avl = remove_int(avl, 286); + avl = remove_int(avl, 787); + avl = gpr_avl_add(avl, box(514), box(338)); + avl = remove_int(avl, 812); + avl = gpr_avl_add(avl, box(431), box(340)); + avl = gpr_avl_add(avl, box(8), box(341)); + avl = remove_int(avl, 843); + avl = gpr_avl_add(avl, box(831), box(343)); + avl = remove_int(avl, 472); + avl = remove_int(avl, 157); + avl = gpr_avl_add(avl, box(612), box(346)); + avl = gpr_avl_add(avl, box(802), box(347)); + avl = remove_int(avl, 554); + avl = gpr_avl_add(avl, box(409), box(349)); + avl = gpr_avl_add(avl, box(439), box(350)); + avl = gpr_avl_add(avl, box(725), box(351)); + avl = gpr_avl_add(avl, box(568), box(352)); + avl = remove_int(avl, 475); + avl = remove_int(avl, 672); + avl = remove_int(avl, 62); + avl = remove_int(avl, 753); + avl = gpr_avl_add(avl, box(435), box(357)); + avl = gpr_avl_add(avl, box(950), box(358)); + avl = gpr_avl_add(avl, box(532), box(359)); + avl = gpr_avl_add(avl, box(832), box(360)); + avl = remove_int(avl, 390); + avl = gpr_avl_add(avl, box(993), box(362)); + avl = remove_int(avl, 198); + avl = remove_int(avl, 401); + avl = gpr_avl_add(avl, box(316), box(365)); + avl = remove_int(avl, 843); + avl = gpr_avl_add(avl, box(541), box(367)); + avl = gpr_avl_add(avl, box(505), box(368)); + avl = remove_int(avl, 445); + avl = remove_int(avl, 256); + avl = gpr_avl_add(avl, box(232), box(371)); + avl = remove_int(avl, 577); + avl = remove_int(avl, 558); + avl = gpr_avl_add(avl, box(910), box(374)); + avl = remove_int(avl, 902); + avl = remove_int(avl, 755); + avl = remove_int(avl, 114); + avl = remove_int(avl, 438); + avl = remove_int(avl, 224); + avl = gpr_avl_add(avl, box(920), box(380)); + avl = gpr_avl_add(avl, box(655), box(381)); + avl = remove_int(avl, 557); + avl = remove_int(avl, 102); + avl = remove_int(avl, 165); + avl = gpr_avl_add(avl, box(191), box(385)); + avl = remove_int(avl, 30); + avl = gpr_avl_add(avl, box(406), box(387)); + avl = gpr_avl_add(avl, box(66), box(388)); + avl = gpr_avl_add(avl, box(87), box(389)); + avl = remove_int(avl, 7); + avl = remove_int(avl, 671); + avl = gpr_avl_add(avl, box(234), box(392)); + avl = remove_int(avl, 463); + avl = gpr_avl_add(avl, box(75), box(394)); + avl = gpr_avl_add(avl, box(487), box(395)); + avl = remove_int(avl, 203); + avl = gpr_avl_add(avl, box(711), box(397)); + avl = remove_int(avl, 291); + avl = remove_int(avl, 798); + avl = remove_int(avl, 337); + avl = gpr_avl_add(avl, box(877), box(401)); + avl = gpr_avl_add(avl, box(388), box(402)); + avl = remove_int(avl, 975); + avl = gpr_avl_add(avl, box(200), box(404)); + avl = gpr_avl_add(avl, box(408), box(405)); + avl = gpr_avl_add(avl, box(3), box(406)); + avl = gpr_avl_add(avl, box(971), box(407)); + avl = remove_int(avl, 841); + avl = remove_int(avl, 910); + avl = remove_int(avl, 74); + avl = remove_int(avl, 888); + avl = gpr_avl_add(avl, box(492), box(412)); + avl = remove_int(avl, 14); + avl = remove_int(avl, 364); + avl = gpr_avl_add(avl, box(215), box(415)); + avl = remove_int(avl, 778); + avl = remove_int(avl, 45); + avl = gpr_avl_add(avl, box(328), box(418)); + avl = gpr_avl_add(avl, box(597), box(419)); + avl = remove_int(avl, 34); + avl = gpr_avl_add(avl, box(736), box(421)); + avl = remove_int(avl, 37); + avl = gpr_avl_add(avl, box(275), box(423)); + avl = gpr_avl_add(avl, box(70), box(424)); + avl = gpr_avl_add(avl, box(771), box(425)); + avl = remove_int(avl, 536); + avl = remove_int(avl, 421); + avl = gpr_avl_add(avl, box(186), box(428)); + avl = gpr_avl_add(avl, box(788), box(429)); + avl = gpr_avl_add(avl, box(224), box(430)); + avl = remove_int(avl, 228); + avl = gpr_avl_add(avl, box(48), box(432)); + avl = gpr_avl_add(avl, box(120), box(433)); + avl = gpr_avl_add(avl, box(269), box(434)); + avl = gpr_avl_add(avl, box(904), box(435)); + avl = remove_int(avl, 699); + avl = gpr_avl_add(avl, box(340), box(437)); + avl = remove_int(avl, 276); + avl = gpr_avl_add(avl, box(591), box(439)); + avl = gpr_avl_add(avl, box(778), box(440)); + avl = remove_int(avl, 490); + avl = remove_int(avl, 973); + avl = gpr_avl_add(avl, box(294), box(443)); + avl = gpr_avl_add(avl, box(323), box(444)); + avl = remove_int(avl, 685); + avl = gpr_avl_add(avl, box(38), box(446)); + avl = gpr_avl_add(avl, box(525), box(447)); + avl = remove_int(avl, 162); + avl = gpr_avl_add(avl, box(462), box(449)); + avl = gpr_avl_add(avl, box(340), box(450)); + avl = remove_int(avl, 734); + avl = remove_int(avl, 959); + avl = gpr_avl_add(avl, box(752), box(453)); + avl = gpr_avl_add(avl, box(667), box(454)); + avl = remove_int(avl, 558); + avl = remove_int(avl, 657); + avl = gpr_avl_add(avl, box(711), box(457)); + avl = remove_int(avl, 937); + avl = gpr_avl_add(avl, box(741), box(459)); + avl = gpr_avl_add(avl, box(40), box(460)); + avl = remove_int(avl, 784); + avl = gpr_avl_add(avl, box(292), box(462)); + avl = remove_int(avl, 164); + avl = remove_int(avl, 931); + avl = remove_int(avl, 886); + avl = gpr_avl_add(avl, box(968), box(466)); + avl = remove_int(avl, 263); + avl = gpr_avl_add(avl, box(647), box(468)); + avl = gpr_avl_add(avl, box(92), box(469)); + avl = remove_int(avl, 310); + avl = gpr_avl_add(avl, box(711), box(471)); + avl = gpr_avl_add(avl, box(675), box(472)); + avl = remove_int(avl, 549); + avl = gpr_avl_add(avl, box(380), box(474)); + avl = remove_int(avl, 825); + avl = gpr_avl_add(avl, box(668), box(476)); + avl = remove_int(avl, 498); + avl = gpr_avl_add(avl, box(870), box(478)); + avl = gpr_avl_add(avl, box(391), box(479)); + avl = gpr_avl_add(avl, box(264), box(480)); + avl = remove_int(avl, 1); + avl = remove_int(avl, 849); + avl = remove_int(avl, 88); + avl = remove_int(avl, 255); + avl = remove_int(avl, 763); + avl = remove_int(avl, 831); + avl = gpr_avl_add(avl, box(508), box(487)); + avl = remove_int(avl, 849); + avl = remove_int(avl, 47); + avl = gpr_avl_add(avl, box(299), box(490)); + avl = remove_int(avl, 625); + avl = remove_int(avl, 433); + avl = remove_int(avl, 904); + avl = remove_int(avl, 761); + avl = gpr_avl_add(avl, box(33), box(495)); + avl = gpr_avl_add(avl, box(524), box(496)); + avl = remove_int(avl, 210); + avl = remove_int(avl, 299); + avl = gpr_avl_add(avl, box(823), box(499)); + avl = remove_int(avl, 479); + avl = remove_int(avl, 96); + avl = remove_int(avl, 1013); + avl = gpr_avl_add(avl, box(768), box(503)); + avl = remove_int(avl, 638); + avl = remove_int(avl, 20); + avl = gpr_avl_add(avl, box(663), box(506)); + avl = remove_int(avl, 882); + avl = gpr_avl_add(avl, box(745), box(508)); + avl = remove_int(avl, 352); + avl = gpr_avl_add(avl, box(10), box(510)); + avl = remove_int(avl, 484); + avl = gpr_avl_add(avl, box(420), box(512)); + avl = gpr_avl_add(avl, box(884), box(513)); + avl = gpr_avl_add(avl, box(993), box(514)); + avl = gpr_avl_add(avl, box(251), box(515)); + avl = remove_int(avl, 222); + avl = gpr_avl_add(avl, box(734), box(517)); + avl = gpr_avl_add(avl, box(952), box(518)); + avl = remove_int(avl, 26); + avl = remove_int(avl, 270); + avl = remove_int(avl, 481); + avl = remove_int(avl, 693); + avl = remove_int(avl, 1006); + avl = gpr_avl_add(avl, box(77), box(524)); + avl = remove_int(avl, 897); + avl = gpr_avl_add(avl, box(719), box(526)); + avl = gpr_avl_add(avl, box(622), box(527)); + avl = remove_int(avl, 28); + avl = remove_int(avl, 836); + avl = remove_int(avl, 142); + avl = gpr_avl_add(avl, box(445), box(531)); + avl = gpr_avl_add(avl, box(410), box(532)); + avl = remove_int(avl, 575); + avl = gpr_avl_add(avl, box(634), box(534)); + avl = gpr_avl_add(avl, box(906), box(535)); + avl = remove_int(avl, 649); + avl = gpr_avl_add(avl, box(813), box(537)); + avl = remove_int(avl, 702); + avl = remove_int(avl, 732); + avl = gpr_avl_add(avl, box(105), box(540)); + avl = gpr_avl_add(avl, box(867), box(541)); + avl = remove_int(avl, 964); + avl = remove_int(avl, 941); + avl = gpr_avl_add(avl, box(947), box(544)); + avl = remove_int(avl, 990); + avl = gpr_avl_add(avl, box(816), box(546)); + avl = remove_int(avl, 429); + avl = remove_int(avl, 567); + avl = remove_int(avl, 541); + avl = remove_int(avl, 583); + avl = gpr_avl_add(avl, box(57), box(551)); + avl = gpr_avl_add(avl, box(786), box(552)); + avl = gpr_avl_add(avl, box(526), box(553)); + avl = remove_int(avl, 642); + avl = remove_int(avl, 220); + avl = remove_int(avl, 840); + avl = remove_int(avl, 548); + avl = gpr_avl_add(avl, box(528), box(558)); + avl = gpr_avl_add(avl, box(749), box(559)); + avl = gpr_avl_add(avl, box(194), box(560)); + avl = remove_int(avl, 517); + avl = gpr_avl_add(avl, box(102), box(562)); + avl = remove_int(avl, 189); + avl = gpr_avl_add(avl, box(927), box(564)); + avl = remove_int(avl, 846); + avl = remove_int(avl, 130); + avl = gpr_avl_add(avl, box(694), box(567)); + avl = remove_int(avl, 750); + avl = gpr_avl_add(avl, box(357), box(569)); + avl = remove_int(avl, 431); + avl = remove_int(avl, 91); + avl = gpr_avl_add(avl, box(640), box(572)); + avl = remove_int(avl, 4); + avl = gpr_avl_add(avl, box(81), box(574)); + avl = gpr_avl_add(avl, box(595), box(575)); + avl = remove_int(avl, 444); + avl = remove_int(avl, 262); + avl = remove_int(avl, 11); + avl = gpr_avl_add(avl, box(192), box(579)); + avl = gpr_avl_add(avl, box(158), box(580)); + avl = remove_int(avl, 401); + avl = remove_int(avl, 918); + avl = gpr_avl_add(avl, box(180), box(583)); + avl = remove_int(avl, 268); + avl = gpr_avl_add(avl, box(1012), box(585)); + avl = gpr_avl_add(avl, box(90), box(586)); + avl = gpr_avl_add(avl, box(946), box(587)); + avl = remove_int(avl, 719); + avl = gpr_avl_add(avl, box(874), box(589)); + avl = gpr_avl_add(avl, box(679), box(590)); + avl = remove_int(avl, 53); + avl = remove_int(avl, 534); + avl = gpr_avl_add(avl, box(646), box(593)); + avl = gpr_avl_add(avl, box(767), box(594)); + avl = gpr_avl_add(avl, box(460), box(595)); + avl = gpr_avl_add(avl, box(852), box(596)); + avl = gpr_avl_add(avl, box(189), box(597)); + avl = remove_int(avl, 932); + avl = remove_int(avl, 366); + avl = remove_int(avl, 907); + avl = gpr_avl_add(avl, box(875), box(601)); + avl = gpr_avl_add(avl, box(434), box(602)); + avl = gpr_avl_add(avl, box(704), box(603)); + avl = gpr_avl_add(avl, box(724), box(604)); + avl = gpr_avl_add(avl, box(930), box(605)); + avl = gpr_avl_add(avl, box(1000), box(606)); + avl = remove_int(avl, 479); + avl = gpr_avl_add(avl, box(275), box(608)); + avl = remove_int(avl, 32); + avl = gpr_avl_add(avl, box(939), box(610)); + avl = remove_int(avl, 943); + avl = remove_int(avl, 329); + avl = gpr_avl_add(avl, box(490), box(613)); + avl = remove_int(avl, 477); + avl = remove_int(avl, 414); + avl = remove_int(avl, 187); + avl = remove_int(avl, 334); + avl = gpr_avl_add(avl, box(40), box(618)); + avl = remove_int(avl, 751); + avl = gpr_avl_add(avl, box(568), box(620)); + avl = gpr_avl_add(avl, box(120), box(621)); + avl = gpr_avl_add(avl, box(617), box(622)); + avl = gpr_avl_add(avl, box(32), box(623)); + avl = remove_int(avl, 701); + avl = gpr_avl_add(avl, box(910), box(625)); + avl = remove_int(avl, 557); + avl = remove_int(avl, 361); + avl = remove_int(avl, 937); + avl = remove_int(avl, 100); + avl = remove_int(avl, 684); + avl = gpr_avl_add(avl, box(751), box(631)); + avl = remove_int(avl, 781); + avl = remove_int(avl, 469); + avl = remove_int(avl, 75); + avl = remove_int(avl, 561); + avl = gpr_avl_add(avl, box(854), box(636)); + avl = remove_int(avl, 164); + avl = remove_int(avl, 258); + avl = remove_int(avl, 315); + avl = remove_int(avl, 261); + avl = gpr_avl_add(avl, box(552), box(641)); + avl = gpr_avl_add(avl, box(6), box(642)); + avl = gpr_avl_add(avl, box(680), box(643)); + avl = remove_int(avl, 741); + avl = remove_int(avl, 309); + avl = remove_int(avl, 272); + avl = gpr_avl_add(avl, box(249), box(647)); + avl = remove_int(avl, 97); + avl = remove_int(avl, 850); + avl = gpr_avl_add(avl, box(915), box(650)); + avl = gpr_avl_add(avl, box(816), box(651)); + avl = gpr_avl_add(avl, box(45), box(652)); + avl = gpr_avl_add(avl, box(168), box(653)); + avl = remove_int(avl, 153); + avl = remove_int(avl, 239); + avl = gpr_avl_add(avl, box(684), box(656)); + avl = gpr_avl_add(avl, box(208), box(657)); + avl = gpr_avl_add(avl, box(681), box(658)); + avl = gpr_avl_add(avl, box(609), box(659)); + avl = gpr_avl_add(avl, box(645), box(660)); + avl = remove_int(avl, 799); + avl = gpr_avl_add(avl, box(955), box(662)); + avl = gpr_avl_add(avl, box(946), box(663)); + avl = gpr_avl_add(avl, box(744), box(664)); + avl = gpr_avl_add(avl, box(201), box(665)); + avl = gpr_avl_add(avl, box(136), box(666)); + avl = remove_int(avl, 357); + avl = gpr_avl_add(avl, box(974), box(668)); + avl = remove_int(avl, 485); + avl = gpr_avl_add(avl, box(1009), box(670)); + avl = gpr_avl_add(avl, box(517), box(671)); + avl = remove_int(avl, 491); + avl = gpr_avl_add(avl, box(336), box(673)); + avl = gpr_avl_add(avl, box(589), box(674)); + avl = remove_int(avl, 546); + avl = remove_int(avl, 840); + avl = remove_int(avl, 104); + avl = remove_int(avl, 347); + avl = gpr_avl_add(avl, box(801), box(679)); + avl = remove_int(avl, 799); + avl = remove_int(avl, 702); + avl = remove_int(avl, 996); + avl = remove_int(avl, 93); + avl = gpr_avl_add(avl, box(561), box(684)); + avl = gpr_avl_add(avl, box(25), box(685)); + avl = remove_int(avl, 278); + avl = gpr_avl_add(avl, box(191), box(687)); + avl = remove_int(avl, 243); + avl = remove_int(avl, 918); + avl = remove_int(avl, 449); + avl = gpr_avl_add(avl, box(19), box(691)); + avl = gpr_avl_add(avl, box(762), box(692)); + avl = gpr_avl_add(avl, box(13), box(693)); + avl = gpr_avl_add(avl, box(151), box(694)); + avl = gpr_avl_add(avl, box(152), box(695)); + avl = gpr_avl_add(avl, box(793), box(696)); + avl = remove_int(avl, 862); + avl = remove_int(avl, 890); + avl = gpr_avl_add(avl, box(687), box(699)); + avl = gpr_avl_add(avl, box(509), box(700)); + avl = gpr_avl_add(avl, box(973), box(701)); + avl = remove_int(avl, 230); + avl = gpr_avl_add(avl, box(532), box(703)); + avl = remove_int(avl, 668); + avl = gpr_avl_add(avl, box(281), box(705)); + avl = gpr_avl_add(avl, box(867), box(706)); + avl = gpr_avl_add(avl, box(359), box(707)); + avl = remove_int(avl, 425); + avl = gpr_avl_add(avl, box(691), box(709)); + avl = gpr_avl_add(avl, box(163), box(710)); + avl = gpr_avl_add(avl, box(502), box(711)); + avl = remove_int(avl, 674); + avl = gpr_avl_add(avl, box(697), box(713)); + avl = remove_int(avl, 271); + avl = gpr_avl_add(avl, box(968), box(715)); + avl = gpr_avl_add(avl, box(48), box(716)); + avl = remove_int(avl, 543); + avl = gpr_avl_add(avl, box(35), box(718)); + avl = gpr_avl_add(avl, box(751), box(719)); + avl = gpr_avl_add(avl, box(478), box(720)); + avl = remove_int(avl, 797); + avl = remove_int(avl, 309); + avl = gpr_avl_add(avl, box(927), box(723)); + avl = remove_int(avl, 504); + avl = gpr_avl_add(avl, box(286), box(725)); + avl = gpr_avl_add(avl, box(413), box(726)); + avl = gpr_avl_add(avl, box(599), box(727)); + avl = remove_int(avl, 105); + avl = remove_int(avl, 605); + avl = gpr_avl_add(avl, box(632), box(730)); + avl = gpr_avl_add(avl, box(133), box(731)); + avl = remove_int(avl, 443); + avl = gpr_avl_add(avl, box(958), box(733)); + avl = gpr_avl_add(avl, box(729), box(734)); + avl = remove_int(avl, 158); + avl = gpr_avl_add(avl, box(694), box(736)); + avl = gpr_avl_add(avl, box(505), box(737)); + avl = remove_int(avl, 63); + avl = remove_int(avl, 714); + avl = gpr_avl_add(avl, box(1002), box(740)); + avl = remove_int(avl, 211); + avl = gpr_avl_add(avl, box(765), box(742)); + avl = gpr_avl_add(avl, box(455), box(743)); + avl = remove_int(avl, 59); + avl = remove_int(avl, 224); + avl = gpr_avl_add(avl, box(586), box(746)); + avl = gpr_avl_add(avl, box(348), box(747)); + avl = remove_int(avl, 10); + avl = remove_int(avl, 484); + avl = gpr_avl_add(avl, box(968), box(750)); + avl = gpr_avl_add(avl, box(923), box(751)); + avl = remove_int(avl, 573); + avl = remove_int(avl, 617); + avl = gpr_avl_add(avl, box(812), box(754)); + avl = gpr_avl_add(avl, box(179), box(755)); + avl = remove_int(avl, 284); + avl = remove_int(avl, 157); + avl = remove_int(avl, 177); + avl = remove_int(avl, 896); + avl = gpr_avl_add(avl, box(649), box(760)); + avl = gpr_avl_add(avl, box(927), box(761)); + avl = gpr_avl_add(avl, box(454), box(762)); + avl = gpr_avl_add(avl, box(217), box(763)); + avl = remove_int(avl, 534); + avl = gpr_avl_add(avl, box(180), box(765)); + avl = gpr_avl_add(avl, box(319), box(766)); + avl = remove_int(avl, 92); + avl = gpr_avl_add(avl, box(483), box(768)); + avl = remove_int(avl, 504); + avl = remove_int(avl, 1017); + avl = remove_int(avl, 37); + avl = remove_int(avl, 50); + avl = gpr_avl_add(avl, box(302), box(773)); + avl = remove_int(avl, 807); + avl = gpr_avl_add(avl, box(463), box(775)); + avl = gpr_avl_add(avl, box(271), box(776)); + avl = gpr_avl_add(avl, box(644), box(777)); + avl = remove_int(avl, 618); + avl = gpr_avl_add(avl, box(166), box(779)); + avl = gpr_avl_add(avl, box(538), box(780)); + avl = remove_int(avl, 606); + avl = gpr_avl_add(avl, box(425), box(782)); + avl = remove_int(avl, 725); + avl = remove_int(avl, 383); + avl = gpr_avl_add(avl, box(155), box(785)); + avl = remove_int(avl, 889); + avl = gpr_avl_add(avl, box(653), box(787)); + avl = remove_int(avl, 386); + avl = gpr_avl_add(avl, box(142), box(789)); + avl = remove_int(avl, 107); + avl = remove_int(avl, 603); + avl = remove_int(avl, 971); + avl = gpr_avl_add(avl, box(80), box(793)); + avl = gpr_avl_add(avl, box(61), box(794)); + avl = gpr_avl_add(avl, box(693), box(795)); + avl = gpr_avl_add(avl, box(592), box(796)); + avl = gpr_avl_add(avl, box(433), box(797)); + avl = gpr_avl_add(avl, box(973), box(798)); + avl = remove_int(avl, 901); + avl = remove_int(avl, 340); + avl = remove_int(avl, 709); + avl = gpr_avl_add(avl, box(224), box(802)); + avl = remove_int(avl, 120); + avl = remove_int(avl, 271); + avl = gpr_avl_add(avl, box(780), box(805)); + avl = gpr_avl_add(avl, box(867), box(806)); + avl = gpr_avl_add(avl, box(756), box(807)); + avl = gpr_avl_add(avl, box(583), box(808)); + avl = gpr_avl_add(avl, box(356), box(809)); + avl = gpr_avl_add(avl, box(58), box(810)); + avl = remove_int(avl, 219); + avl = gpr_avl_add(avl, box(301), box(812)); + avl = remove_int(avl, 643); + avl = remove_int(avl, 787); + avl = remove_int(avl, 583); + avl = remove_int(avl, 552); + avl = remove_int(avl, 308); + avl = remove_int(avl, 608); + avl = remove_int(avl, 363); + avl = remove_int(avl, 690); + avl = gpr_avl_add(avl, box(233), box(821)); + avl = gpr_avl_add(avl, box(479), box(822)); + avl = gpr_avl_add(avl, box(323), box(823)); + avl = gpr_avl_add(avl, box(802), box(824)); + avl = remove_int(avl, 682); + avl = remove_int(avl, 705); + avl = remove_int(avl, 487); + avl = gpr_avl_add(avl, box(530), box(828)); + avl = gpr_avl_add(avl, box(232), box(829)); + avl = remove_int(avl, 627); + avl = gpr_avl_add(avl, box(396), box(831)); + avl = gpr_avl_add(avl, box(61), box(832)); + avl = gpr_avl_add(avl, box(932), box(833)); + avl = gpr_avl_add(avl, box(108), box(834)); + avl = gpr_avl_add(avl, box(524), box(835)); + avl = remove_int(avl, 390); + avl = remove_int(avl, 307); + avl = gpr_avl_add(avl, box(722), box(838)); + avl = gpr_avl_add(avl, box(907), box(839)); + avl = remove_int(avl, 286); + avl = remove_int(avl, 337); + avl = remove_int(avl, 443); + avl = gpr_avl_add(avl, box(973), box(843)); + avl = remove_int(avl, 930); + avl = remove_int(avl, 242); + avl = gpr_avl_add(avl, box(997), box(846)); + avl = gpr_avl_add(avl, box(689), box(847)); + avl = remove_int(avl, 318); + avl = gpr_avl_add(avl, box(703), box(849)); + avl = gpr_avl_add(avl, box(868), box(850)); + avl = gpr_avl_add(avl, box(200), box(851)); + avl = gpr_avl_add(avl, box(960), box(852)); + avl = gpr_avl_add(avl, box(80), box(853)); + avl = remove_int(avl, 113); + avl = gpr_avl_add(avl, box(135), box(855)); + avl = remove_int(avl, 529); + avl = gpr_avl_add(avl, box(366), box(857)); + avl = remove_int(avl, 272); + avl = gpr_avl_add(avl, box(921), box(859)); + avl = remove_int(avl, 497); + avl = gpr_avl_add(avl, box(712), box(861)); + avl = remove_int(avl, 777); + avl = remove_int(avl, 505); + avl = remove_int(avl, 974); + avl = remove_int(avl, 497); + avl = gpr_avl_add(avl, box(388), box(866)); + avl = gpr_avl_add(avl, box(29), box(867)); + avl = gpr_avl_add(avl, box(180), box(868)); + avl = gpr_avl_add(avl, box(983), box(869)); + avl = gpr_avl_add(avl, box(72), box(870)); + avl = gpr_avl_add(avl, box(693), box(871)); + avl = gpr_avl_add(avl, box(567), box(872)); + avl = remove_int(avl, 549); + avl = remove_int(avl, 351); + avl = gpr_avl_add(avl, box(1019), box(875)); + avl = remove_int(avl, 585); + avl = remove_int(avl, 294); + avl = remove_int(avl, 61); + avl = gpr_avl_add(avl, box(409), box(879)); + avl = gpr_avl_add(avl, box(984), box(880)); + avl = gpr_avl_add(avl, box(830), box(881)); + avl = remove_int(avl, 579); + avl = gpr_avl_add(avl, box(672), box(883)); + avl = remove_int(avl, 968); + + gpr_avl_unref(avl); +} + +static void test_badcase3(void) { + gpr_avl avl; + + gpr_log(GPR_DEBUG, "test_badcase3"); + + avl = gpr_avl_create(&int_int_vtable); + avl = remove_int(avl, 624); + avl = gpr_avl_add(avl, box(59), box(2)); + avl = gpr_avl_add(avl, box(494), box(3)); + avl = gpr_avl_add(avl, box(226), box(4)); + avl = remove_int(avl, 524); + avl = gpr_avl_add(avl, box(540), box(6)); + avl = remove_int(avl, 1008); + avl = gpr_avl_add(avl, box(502), box(8)); + avl = remove_int(avl, 267); + avl = remove_int(avl, 764); + avl = remove_int(avl, 443); + avl = gpr_avl_add(avl, box(8), box(12)); + avl = remove_int(avl, 291); + avl = remove_int(avl, 796); + avl = remove_int(avl, 1002); + avl = gpr_avl_add(avl, box(778), box(16)); + avl = remove_int(avl, 621); + avl = remove_int(avl, 891); + avl = remove_int(avl, 880); + avl = gpr_avl_add(avl, box(197), box(20)); + avl = gpr_avl_add(avl, box(441), box(21)); + avl = gpr_avl_add(avl, box(719), box(22)); + avl = remove_int(avl, 109); + avl = gpr_avl_add(avl, box(458), box(24)); + avl = remove_int(avl, 86); + avl = gpr_avl_add(avl, box(897), box(26)); + avl = gpr_avl_add(avl, box(997), box(27)); + avl = remove_int(avl, 235); + avl = remove_int(avl, 425); + avl = remove_int(avl, 186); + avl = gpr_avl_add(avl, box(887), box(31)); + avl = gpr_avl_add(avl, box(1005), box(32)); + avl = gpr_avl_add(avl, box(778), box(33)); + avl = gpr_avl_add(avl, box(575), box(34)); + avl = remove_int(avl, 966); + avl = remove_int(avl, 1015); + avl = gpr_avl_add(avl, box(486), box(37)); + avl = gpr_avl_add(avl, box(809), box(38)); + avl = gpr_avl_add(avl, box(907), box(39)); + avl = gpr_avl_add(avl, box(971), box(40)); + avl = remove_int(avl, 441); + avl = remove_int(avl, 498); + avl = gpr_avl_add(avl, box(727), box(43)); + avl = remove_int(avl, 679); + avl = remove_int(avl, 740); + avl = remove_int(avl, 532); + avl = gpr_avl_add(avl, box(805), box(47)); + avl = remove_int(avl, 64); + avl = gpr_avl_add(avl, box(362), box(49)); + avl = gpr_avl_add(avl, box(170), box(50)); + avl = gpr_avl_add(avl, box(389), box(51)); + avl = gpr_avl_add(avl, box(689), box(52)); + avl = remove_int(avl, 871); + avl = gpr_avl_add(avl, box(447), box(54)); + avl = remove_int(avl, 718); + avl = gpr_avl_add(avl, box(724), box(56)); + avl = remove_int(avl, 215); + avl = gpr_avl_add(avl, box(550), box(58)); + avl = remove_int(avl, 932); + avl = gpr_avl_add(avl, box(47), box(60)); + avl = remove_int(avl, 46); + avl = remove_int(avl, 229); + avl = gpr_avl_add(avl, box(68), box(63)); + avl = gpr_avl_add(avl, box(387), box(64)); + avl = remove_int(avl, 933); + avl = remove_int(avl, 736); + avl = remove_int(avl, 719); + avl = gpr_avl_add(avl, box(150), box(68)); + avl = remove_int(avl, 875); + avl = remove_int(avl, 298); + avl = gpr_avl_add(avl, box(991), box(71)); + avl = remove_int(avl, 705); + avl = gpr_avl_add(avl, box(197), box(73)); + avl = gpr_avl_add(avl, box(101), box(74)); + avl = remove_int(avl, 436); + avl = gpr_avl_add(avl, box(755), box(76)); + avl = gpr_avl_add(avl, box(727), box(77)); + avl = remove_int(avl, 309); + avl = remove_int(avl, 253); + avl = gpr_avl_add(avl, box(203), box(80)); + avl = remove_int(avl, 231); + avl = gpr_avl_add(avl, box(461), box(82)); + avl = remove_int(avl, 316); + avl = remove_int(avl, 493); + avl = gpr_avl_add(avl, box(184), box(85)); + avl = remove_int(avl, 737); + avl = gpr_avl_add(avl, box(790), box(87)); + avl = gpr_avl_add(avl, box(335), box(88)); + avl = remove_int(avl, 649); + avl = gpr_avl_add(avl, box(69), box(90)); + avl = remove_int(avl, 585); + avl = remove_int(avl, 543); + avl = gpr_avl_add(avl, box(784), box(93)); + avl = gpr_avl_add(avl, box(60), box(94)); + avl = gpr_avl_add(avl, box(525), box(95)); + avl = gpr_avl_add(avl, box(177), box(96)); + avl = gpr_avl_add(avl, box(178), box(97)); + avl = gpr_avl_add(avl, box(683), box(98)); + avl = gpr_avl_add(avl, box(226), box(99)); + avl = gpr_avl_add(avl, box(662), box(100)); + avl = remove_int(avl, 944); + avl = gpr_avl_add(avl, box(562), box(102)); + avl = gpr_avl_add(avl, box(793), box(103)); + avl = remove_int(avl, 673); + avl = gpr_avl_add(avl, box(310), box(105)); + avl = remove_int(avl, 479); + avl = remove_int(avl, 543); + avl = remove_int(avl, 159); + avl = remove_int(avl, 850); + avl = gpr_avl_add(avl, box(318), box(110)); + avl = gpr_avl_add(avl, box(483), box(111)); + avl = gpr_avl_add(avl, box(84), box(112)); + avl = remove_int(avl, 109); + avl = gpr_avl_add(avl, box(132), box(114)); + avl = gpr_avl_add(avl, box(920), box(115)); + avl = remove_int(avl, 746); + avl = gpr_avl_add(avl, box(145), box(117)); + avl = gpr_avl_add(avl, box(526), box(118)); + avl = remove_int(avl, 158); + avl = gpr_avl_add(avl, box(332), box(120)); + avl = gpr_avl_add(avl, box(918), box(121)); + avl = remove_int(avl, 339); + avl = gpr_avl_add(avl, box(809), box(123)); + avl = gpr_avl_add(avl, box(742), box(124)); + avl = gpr_avl_add(avl, box(718), box(125)); + avl = remove_int(avl, 988); + avl = remove_int(avl, 531); + avl = remove_int(avl, 840); + avl = gpr_avl_add(avl, box(816), box(129)); + avl = gpr_avl_add(avl, box(976), box(130)); + avl = remove_int(avl, 743); + avl = remove_int(avl, 528); + avl = remove_int(avl, 982); + avl = gpr_avl_add(avl, box(803), box(134)); + avl = gpr_avl_add(avl, box(205), box(135)); + avl = gpr_avl_add(avl, box(584), box(136)); + avl = remove_int(avl, 923); + avl = remove_int(avl, 538); + avl = remove_int(avl, 398); + avl = remove_int(avl, 320); + avl = remove_int(avl, 292); + avl = gpr_avl_add(avl, box(270), box(142)); + avl = gpr_avl_add(avl, box(333), box(143)); + avl = remove_int(avl, 439); + avl = gpr_avl_add(avl, box(35), box(145)); + avl = gpr_avl_add(avl, box(837), box(146)); + avl = remove_int(avl, 65); + avl = remove_int(avl, 642); + avl = remove_int(avl, 371); + avl = remove_int(avl, 140); + avl = remove_int(avl, 533); + avl = remove_int(avl, 676); + avl = gpr_avl_add(avl, box(624), box(153)); + avl = gpr_avl_add(avl, box(116), box(154)); + avl = gpr_avl_add(avl, box(446), box(155)); + avl = remove_int(avl, 91); + avl = remove_int(avl, 721); + avl = remove_int(avl, 537); + avl = gpr_avl_add(avl, box(448), box(159)); + avl = remove_int(avl, 155); + avl = remove_int(avl, 344); + avl = remove_int(avl, 237); + avl = gpr_avl_add(avl, box(309), box(163)); + avl = gpr_avl_add(avl, box(434), box(164)); + avl = gpr_avl_add(avl, box(277), box(165)); + avl = remove_int(avl, 233); + avl = gpr_avl_add(avl, box(275), box(167)); + avl = gpr_avl_add(avl, box(218), box(168)); + avl = gpr_avl_add(avl, box(76), box(169)); + avl = gpr_avl_add(avl, box(898), box(170)); + avl = remove_int(avl, 771); + avl = gpr_avl_add(avl, box(237), box(172)); + avl = remove_int(avl, 327); + avl = gpr_avl_add(avl, box(499), box(174)); + avl = remove_int(avl, 727); + avl = remove_int(avl, 234); + avl = remove_int(avl, 623); + avl = remove_int(avl, 458); + avl = remove_int(avl, 326); + avl = remove_int(avl, 589); + avl = gpr_avl_add(avl, box(442), box(181)); + avl = remove_int(avl, 389); + avl = gpr_avl_add(avl, box(708), box(183)); + avl = gpr_avl_add(avl, box(594), box(184)); + avl = gpr_avl_add(avl, box(942), box(185)); + avl = gpr_avl_add(avl, box(282), box(186)); + avl = remove_int(avl, 434); + avl = remove_int(avl, 134); + avl = remove_int(avl, 270); + avl = remove_int(avl, 512); + avl = remove_int(avl, 265); + avl = remove_int(avl, 21); + avl = remove_int(avl, 193); + avl = remove_int(avl, 797); + avl = remove_int(avl, 347); + avl = gpr_avl_add(avl, box(99), box(196)); + avl = gpr_avl_add(avl, box(161), box(197)); + avl = remove_int(avl, 484); + avl = gpr_avl_add(avl, box(72), box(199)); + avl = remove_int(avl, 629); + avl = gpr_avl_add(avl, box(522), box(201)); + avl = remove_int(avl, 679); + avl = gpr_avl_add(avl, box(407), box(203)); + avl = remove_int(avl, 693); + avl = gpr_avl_add(avl, box(424), box(205)); + avl = gpr_avl_add(avl, box(651), box(206)); + avl = gpr_avl_add(avl, box(927), box(207)); + avl = remove_int(avl, 553); + avl = gpr_avl_add(avl, box(128), box(209)); + avl = gpr_avl_add(avl, box(616), box(210)); + avl = gpr_avl_add(avl, box(690), box(211)); + avl = remove_int(avl, 241); + avl = remove_int(avl, 179); + avl = gpr_avl_add(avl, box(697), box(214)); + avl = remove_int(avl, 779); + avl = gpr_avl_add(avl, box(241), box(216)); + avl = remove_int(avl, 190); + avl = remove_int(avl, 210); + avl = gpr_avl_add(avl, box(711), box(219)); + avl = remove_int(avl, 251); + avl = remove_int(avl, 61); + avl = gpr_avl_add(avl, box(800), box(222)); + avl = remove_int(avl, 551); + avl = gpr_avl_add(avl, box(61), box(224)); + avl = gpr_avl_add(avl, box(656), box(225)); + avl = remove_int(avl, 130); + avl = remove_int(avl, 368); + avl = remove_int(avl, 150); + avl = remove_int(avl, 73); + avl = gpr_avl_add(avl, box(799), box(230)); + avl = gpr_avl_add(avl, box(125), box(231)); + avl = remove_int(avl, 107); + avl = gpr_avl_add(avl, box(938), box(233)); + avl = gpr_avl_add(avl, box(914), box(234)); + avl = gpr_avl_add(avl, box(197), box(235)); + avl = remove_int(avl, 736); + avl = gpr_avl_add(avl, box(20), box(237)); + avl = remove_int(avl, 224); + avl = remove_int(avl, 841); + avl = gpr_avl_add(avl, box(226), box(240)); + avl = remove_int(avl, 963); + avl = remove_int(avl, 796); + avl = remove_int(avl, 728); + avl = gpr_avl_add(avl, box(855), box(244)); + avl = gpr_avl_add(avl, box(769), box(245)); + avl = gpr_avl_add(avl, box(631), box(246)); + avl = remove_int(avl, 648); + avl = gpr_avl_add(avl, box(187), box(248)); + avl = gpr_avl_add(avl, box(31), box(249)); + avl = remove_int(avl, 163); + avl = gpr_avl_add(avl, box(218), box(251)); + avl = gpr_avl_add(avl, box(488), box(252)); + avl = gpr_avl_add(avl, box(387), box(253)); + avl = gpr_avl_add(avl, box(809), box(254)); + avl = gpr_avl_add(avl, box(997), box(255)); + avl = remove_int(avl, 678); + avl = gpr_avl_add(avl, box(368), box(257)); + avl = gpr_avl_add(avl, box(220), box(258)); + avl = gpr_avl_add(avl, box(373), box(259)); + avl = remove_int(avl, 874); + avl = remove_int(avl, 682); + avl = remove_int(avl, 1014); + avl = remove_int(avl, 195); + avl = gpr_avl_add(avl, box(868), box(264)); + avl = remove_int(avl, 254); + avl = remove_int(avl, 456); + avl = gpr_avl_add(avl, box(906), box(267)); + avl = remove_int(avl, 711); + avl = gpr_avl_add(avl, box(632), box(269)); + avl = remove_int(avl, 474); + avl = gpr_avl_add(avl, box(508), box(271)); + avl = gpr_avl_add(avl, box(518), box(272)); + avl = remove_int(avl, 579); + avl = remove_int(avl, 948); + avl = gpr_avl_add(avl, box(789), box(275)); + avl = gpr_avl_add(avl, box(48), box(276)); + avl = gpr_avl_add(avl, box(256), box(277)); + avl = gpr_avl_add(avl, box(754), box(278)); + avl = remove_int(avl, 215); + avl = gpr_avl_add(avl, box(679), box(280)); + avl = gpr_avl_add(avl, box(606), box(281)); + avl = remove_int(avl, 941); + avl = remove_int(avl, 31); + avl = gpr_avl_add(avl, box(758), box(284)); + avl = remove_int(avl, 101); + avl = gpr_avl_add(avl, box(244), box(286)); + avl = gpr_avl_add(avl, box(337), box(287)); + avl = gpr_avl_add(avl, box(461), box(288)); + avl = remove_int(avl, 476); + avl = gpr_avl_add(avl, box(845), box(290)); + avl = remove_int(avl, 160); + avl = gpr_avl_add(avl, box(690), box(292)); + avl = remove_int(avl, 931); + avl = gpr_avl_add(avl, box(869), box(294)); + avl = gpr_avl_add(avl, box(1019), box(295)); + avl = remove_int(avl, 591); + avl = remove_int(avl, 635); + avl = remove_int(avl, 67); + avl = gpr_avl_add(avl, box(113), box(299)); + avl = remove_int(avl, 305); + avl = gpr_avl_add(avl, box(10), box(301)); + avl = remove_int(avl, 823); + avl = remove_int(avl, 288); + avl = remove_int(avl, 239); + avl = gpr_avl_add(avl, box(646), box(305)); + avl = gpr_avl_add(avl, box(1006), box(306)); + avl = gpr_avl_add(avl, box(954), box(307)); + avl = gpr_avl_add(avl, box(199), box(308)); + avl = gpr_avl_add(avl, box(69), box(309)); + avl = gpr_avl_add(avl, box(984), box(310)); + avl = remove_int(avl, 568); + avl = remove_int(avl, 666); + avl = remove_int(avl, 37); + avl = gpr_avl_add(avl, box(845), box(314)); + avl = remove_int(avl, 535); + avl = remove_int(avl, 365); + avl = remove_int(avl, 676); + avl = remove_int(avl, 892); + avl = remove_int(avl, 425); + avl = remove_int(avl, 704); + avl = remove_int(avl, 168); + avl = gpr_avl_add(avl, box(853), box(322)); + avl = gpr_avl_add(avl, box(335), box(323)); + avl = gpr_avl_add(avl, box(961), box(324)); + avl = gpr_avl_add(avl, box(73), box(325)); + avl = remove_int(avl, 469); + avl = gpr_avl_add(avl, box(449), box(327)); + avl = remove_int(avl, 821); + avl = gpr_avl_add(avl, box(845), box(329)); + avl = remove_int(avl, 637); + avl = gpr_avl_add(avl, box(769), box(331)); + avl = gpr_avl_add(avl, box(901), box(332)); + avl = remove_int(avl, 142); + avl = remove_int(avl, 361); + avl = remove_int(avl, 876); + avl = gpr_avl_add(avl, box(614), box(336)); + avl = gpr_avl_add(avl, box(729), box(337)); + avl = remove_int(avl, 120); + avl = remove_int(avl, 473); + avl = remove_int(avl, 445); + avl = gpr_avl_add(avl, box(978), box(341)); + avl = gpr_avl_add(avl, box(164), box(342)); + avl = gpr_avl_add(avl, box(1), box(343)); + avl = remove_int(avl, 890); + avl = gpr_avl_add(avl, box(605), box(345)); + avl = gpr_avl_add(avl, box(178), box(346)); + avl = gpr_avl_add(avl, box(481), box(347)); + avl = gpr_avl_add(avl, box(772), box(348)); + avl = remove_int(avl, 824); + avl = remove_int(avl, 167); + avl = remove_int(avl, 151); + avl = gpr_avl_add(avl, box(698), box(352)); + avl = gpr_avl_add(avl, box(202), box(353)); + avl = gpr_avl_add(avl, box(921), box(354)); + avl = gpr_avl_add(avl, box(875), box(355)); + avl = remove_int(avl, 197); + avl = remove_int(avl, 232); + avl = gpr_avl_add(avl, box(209), box(358)); + avl = remove_int(avl, 324); + avl = remove_int(avl, 56); + avl = remove_int(avl, 579); + avl = remove_int(avl, 255); + avl = remove_int(avl, 290); + avl = gpr_avl_add(avl, box(661), box(364)); + avl = gpr_avl_add(avl, box(113), box(365)); + avl = remove_int(avl, 767); + avl = gpr_avl_add(avl, box(586), box(367)); + avl = gpr_avl_add(avl, box(121), box(368)); + avl = remove_int(avl, 235); + avl = remove_int(avl, 439); + avl = remove_int(avl, 360); + avl = gpr_avl_add(avl, box(916), box(372)); + avl = remove_int(avl, 999); + avl = gpr_avl_add(avl, box(825), box(374)); + avl = gpr_avl_add(avl, box(177), box(375)); + avl = remove_int(avl, 204); + avl = remove_int(avl, 92); + avl = gpr_avl_add(avl, box(794), box(378)); + avl = gpr_avl_add(avl, box(463), box(379)); + avl = gpr_avl_add(avl, box(472), box(380)); + avl = remove_int(avl, 235); + avl = gpr_avl_add(avl, box(840), box(382)); + avl = remove_int(avl, 657); + avl = gpr_avl_add(avl, box(586), box(384)); + avl = gpr_avl_add(avl, box(979), box(385)); + avl = remove_int(avl, 979); + avl = gpr_avl_add(avl, box(639), box(387)); + avl = remove_int(avl, 907); + avl = remove_int(avl, 973); + avl = gpr_avl_add(avl, box(913), box(390)); + avl = gpr_avl_add(avl, box(566), box(391)); + avl = gpr_avl_add(avl, box(883), box(392)); + avl = gpr_avl_add(avl, box(552), box(393)); + avl = gpr_avl_add(avl, box(16), box(394)); + avl = remove_int(avl, 60); + avl = gpr_avl_add(avl, box(567), box(396)); + avl = gpr_avl_add(avl, box(705), box(397)); + avl = gpr_avl_add(avl, box(94), box(398)); + avl = remove_int(avl, 321); + avl = gpr_avl_add(avl, box(207), box(400)); + avl = gpr_avl_add(avl, box(682), box(401)); + avl = gpr_avl_add(avl, box(592), box(402)); + avl = gpr_avl_add(avl, box(10), box(403)); + avl = remove_int(avl, 911); + avl = remove_int(avl, 161); + avl = gpr_avl_add(avl, box(86), box(406)); + avl = remove_int(avl, 893); + avl = remove_int(avl, 362); + avl = gpr_avl_add(avl, box(599), box(409)); + avl = remove_int(avl, 413); + avl = gpr_avl_add(avl, box(867), box(411)); + avl = remove_int(avl, 955); + avl = gpr_avl_add(avl, box(341), box(413)); + avl = gpr_avl_add(avl, box(887), box(414)); + avl = remove_int(avl, 706); + avl = gpr_avl_add(avl, box(939), box(416)); + avl = remove_int(avl, 233); + avl = remove_int(avl, 662); + avl = remove_int(avl, 984); + avl = remove_int(avl, 203); + avl = gpr_avl_add(avl, box(326), box(421)); + avl = remove_int(avl, 848); + avl = gpr_avl_add(avl, box(235), box(423)); + avl = remove_int(avl, 617); + avl = gpr_avl_add(avl, box(565), box(425)); + avl = remove_int(avl, 469); + avl = gpr_avl_add(avl, box(988), box(427)); + avl = remove_int(avl, 957); + avl = gpr_avl_add(avl, box(426), box(429)); + avl = remove_int(avl, 967); + avl = gpr_avl_add(avl, box(890), box(431)); + avl = gpr_avl_add(avl, box(473), box(432)); + avl = remove_int(avl, 367); + avl = remove_int(avl, 344); + avl = remove_int(avl, 660); + avl = remove_int(avl, 448); + avl = remove_int(avl, 837); + avl = remove_int(avl, 158); + avl = gpr_avl_add(avl, box(459), box(439)); + avl = remove_int(avl, 882); + avl = remove_int(avl, 782); + avl = gpr_avl_add(avl, box(408), box(442)); + avl = gpr_avl_add(avl, box(728), box(443)); + avl = remove_int(avl, 27); + avl = gpr_avl_add(avl, box(137), box(445)); + avl = gpr_avl_add(avl, box(239), box(446)); + avl = remove_int(avl, 854); + avl = gpr_avl_add(avl, box(104), box(448)); + avl = gpr_avl_add(avl, box(823), box(449)); + avl = gpr_avl_add(avl, box(524), box(450)); + avl = gpr_avl_add(avl, box(995), box(451)); + avl = remove_int(avl, 422); + avl = remove_int(avl, 220); + avl = gpr_avl_add(avl, box(856), box(454)); + avl = remove_int(avl, 332); + avl = gpr_avl_add(avl, box(679), box(456)); + avl = remove_int(avl, 18); + avl = gpr_avl_add(avl, box(837), box(458)); + avl = remove_int(avl, 405); + avl = remove_int(avl, 877); + avl = remove_int(avl, 835); + avl = gpr_avl_add(avl, box(547), box(462)); + avl = remove_int(avl, 805); + avl = remove_int(avl, 862); + avl = gpr_avl_add(avl, box(75), box(465)); + avl = remove_int(avl, 41); + avl = gpr_avl_add(avl, box(310), box(467)); + avl = remove_int(avl, 855); + avl = gpr_avl_add(avl, box(20), box(469)); + avl = remove_int(avl, 186); + avl = remove_int(avl, 378); + avl = remove_int(avl, 442); + avl = remove_int(avl, 930); + avl = gpr_avl_add(avl, box(118), box(474)); + avl = gpr_avl_add(avl, box(96), box(475)); + avl = remove_int(avl, 854); + avl = gpr_avl_add(avl, box(65), box(477)); + avl = gpr_avl_add(avl, box(573), box(478)); + avl = gpr_avl_add(avl, box(4), box(479)); + avl = gpr_avl_add(avl, box(451), box(480)); + avl = gpr_avl_add(avl, box(774), box(481)); + avl = gpr_avl_add(avl, box(126), box(482)); + avl = remove_int(avl, 956); + avl = remove_int(avl, 591); + avl = remove_int(avl, 644); + avl = gpr_avl_add(avl, box(304), box(486)); + avl = remove_int(avl, 620); + avl = remove_int(avl, 394); + avl = gpr_avl_add(avl, box(1002), box(489)); + avl = gpr_avl_add(avl, box(837), box(490)); + avl = remove_int(avl, 485); + avl = gpr_avl_add(avl, box(1005), box(492)); + avl = remove_int(avl, 21); + avl = gpr_avl_add(avl, box(396), box(494)); + avl = remove_int(avl, 966); + avl = gpr_avl_add(avl, box(105), box(496)); + avl = gpr_avl_add(avl, box(316), box(497)); + avl = remove_int(avl, 776); + avl = gpr_avl_add(avl, box(188), box(499)); + avl = remove_int(avl, 200); + avl = gpr_avl_add(avl, box(98), box(501)); + avl = gpr_avl_add(avl, box(831), box(502)); + avl = gpr_avl_add(avl, box(227), box(503)); + avl = gpr_avl_add(avl, box(220), box(504)); + avl = remove_int(avl, 715); + avl = remove_int(avl, 279); + avl = gpr_avl_add(avl, box(701), box(507)); + avl = gpr_avl_add(avl, box(726), box(508)); + avl = gpr_avl_add(avl, box(815), box(509)); + avl = gpr_avl_add(avl, box(749), box(510)); + avl = remove_int(avl, 946); + avl = remove_int(avl, 449); + avl = remove_int(avl, 62); + avl = remove_int(avl, 487); + avl = gpr_avl_add(avl, box(545), box(515)); + avl = remove_int(avl, 59); + avl = gpr_avl_add(avl, box(168), box(517)); + avl = remove_int(avl, 337); + avl = gpr_avl_add(avl, box(69), box(519)); + avl = remove_int(avl, 600); + avl = gpr_avl_add(avl, box(591), box(521)); + avl = gpr_avl_add(avl, box(960), box(522)); + avl = gpr_avl_add(avl, box(116), box(523)); + avl = remove_int(avl, 991); + avl = gpr_avl_add(avl, box(760), box(525)); + avl = gpr_avl_add(avl, box(664), box(526)); + avl = gpr_avl_add(avl, box(547), box(527)); + avl = remove_int(avl, 922); + avl = gpr_avl_add(avl, box(290), box(529)); + avl = gpr_avl_add(avl, box(859), box(530)); + avl = gpr_avl_add(avl, box(49), box(531)); + avl = remove_int(avl, 455); + avl = remove_int(avl, 786); + avl = gpr_avl_add(avl, box(613), box(534)); + avl = gpr_avl_add(avl, box(326), box(535)); + avl = remove_int(avl, 615); + avl = gpr_avl_add(avl, box(45), box(537)); + avl = gpr_avl_add(avl, box(162), box(538)); + avl = gpr_avl_add(avl, box(189), box(539)); + avl = remove_int(avl, 68); + avl = remove_int(avl, 846); + avl = gpr_avl_add(avl, box(608), box(542)); + avl = remove_int(avl, 821); + avl = gpr_avl_add(avl, box(978), box(544)); + avl = gpr_avl_add(avl, box(892), box(545)); + avl = remove_int(avl, 924); + avl = gpr_avl_add(avl, box(708), box(547)); + avl = remove_int(avl, 135); + avl = remove_int(avl, 124); + avl = gpr_avl_add(avl, box(301), box(550)); + avl = gpr_avl_add(avl, box(939), box(551)); + avl = gpr_avl_add(avl, box(344), box(552)); + avl = remove_int(avl, 443); + avl = remove_int(avl, 122); + avl = gpr_avl_add(avl, box(636), box(555)); + avl = remove_int(avl, 558); + avl = gpr_avl_add(avl, box(923), box(557)); + avl = remove_int(avl, 827); + avl = gpr_avl_add(avl, box(649), box(559)); + avl = gpr_avl_add(avl, box(808), box(560)); + avl = remove_int(avl, 570); + avl = remove_int(avl, 434); + avl = gpr_avl_add(avl, box(40), box(563)); + avl = gpr_avl_add(avl, box(725), box(564)); + avl = remove_int(avl, 295); + avl = remove_int(avl, 615); + avl = remove_int(avl, 919); + avl = remove_int(avl, 170); + avl = remove_int(avl, 442); + avl = remove_int(avl, 971); + avl = gpr_avl_add(avl, box(483), box(571)); + avl = gpr_avl_add(avl, box(512), box(572)); + avl = remove_int(avl, 648); + avl = remove_int(avl, 78); + avl = remove_int(avl, 72); + avl = remove_int(avl, 790); + avl = remove_int(avl, 571); + avl = gpr_avl_add(avl, box(898), box(578)); + avl = remove_int(avl, 770); + avl = remove_int(avl, 776); + avl = gpr_avl_add(avl, box(602), box(581)); + avl = remove_int(avl, 251); + avl = gpr_avl_add(avl, box(303), box(583)); + avl = remove_int(avl, 837); + avl = gpr_avl_add(avl, box(714), box(585)); + avl = remove_int(avl, 800); + avl = gpr_avl_add(avl, box(266), box(587)); + avl = gpr_avl_add(avl, box(555), box(588)); + avl = remove_int(avl, 604); + avl = remove_int(avl, 163); + avl = remove_int(avl, 497); + avl = gpr_avl_add(avl, box(296), box(592)); + avl = remove_int(avl, 129); + avl = gpr_avl_add(avl, box(656), box(594)); + avl = remove_int(avl, 769); + avl = remove_int(avl, 941); + avl = gpr_avl_add(avl, box(775), box(597)); + avl = gpr_avl_add(avl, box(846), box(598)); + avl = remove_int(avl, 591); + avl = remove_int(avl, 801); + avl = remove_int(avl, 419); + avl = remove_int(avl, 455); + avl = gpr_avl_add(avl, box(866), box(603)); + avl = gpr_avl_add(avl, box(575), box(604)); + avl = gpr_avl_add(avl, box(620), box(605)); + avl = remove_int(avl, 100); + avl = remove_int(avl, 667); + avl = gpr_avl_add(avl, box(138), box(608)); + avl = gpr_avl_add(avl, box(566), box(609)); + avl = gpr_avl_add(avl, box(673), box(610)); + avl = gpr_avl_add(avl, box(178), box(611)); + avl = remove_int(avl, 659); + avl = gpr_avl_add(avl, box(759), box(613)); + avl = gpr_avl_add(avl, box(1008), box(614)); + avl = remove_int(avl, 116); + avl = gpr_avl_add(avl, box(608), box(616)); + avl = gpr_avl_add(avl, box(339), box(617)); + avl = gpr_avl_add(avl, box(197), box(618)); + avl = remove_int(avl, 25); + avl = remove_int(avl, 628); + avl = gpr_avl_add(avl, box(487), box(621)); + avl = remove_int(avl, 739); + avl = remove_int(avl, 100); + avl = remove_int(avl, 928); + avl = gpr_avl_add(avl, box(647), box(625)); + avl = remove_int(avl, 978); + avl = remove_int(avl, 143); + avl = remove_int(avl, 755); + avl = gpr_avl_add(avl, box(71), box(629)); + avl = remove_int(avl, 205); + avl = gpr_avl_add(avl, box(501), box(631)); + avl = remove_int(avl, 723); + avl = remove_int(avl, 852); + avl = remove_int(avl, 1021); + avl = remove_int(avl, 670); + avl = remove_int(avl, 500); + avl = gpr_avl_add(avl, box(330), box(637)); + avl = remove_int(avl, 264); + avl = gpr_avl_add(avl, box(69), box(639)); + avl = remove_int(avl, 73); + avl = gpr_avl_add(avl, box(745), box(641)); + avl = remove_int(avl, 518); + avl = remove_int(avl, 641); + avl = remove_int(avl, 768); + avl = gpr_avl_add(avl, box(988), box(645)); + avl = gpr_avl_add(avl, box(899), box(646)); + avl = remove_int(avl, 763); + avl = remove_int(avl, 281); + avl = remove_int(avl, 496); + avl = gpr_avl_add(avl, box(445), box(650)); + avl = remove_int(avl, 905); + avl = gpr_avl_add(avl, box(275), box(652)); + avl = gpr_avl_add(avl, box(137), box(653)); + avl = remove_int(avl, 642); + avl = gpr_avl_add(avl, box(708), box(655)); + avl = remove_int(avl, 922); + avl = gpr_avl_add(avl, box(743), box(657)); + avl = remove_int(avl, 295); + avl = remove_int(avl, 665); + avl = remove_int(avl, 48); + avl = gpr_avl_add(avl, box(1012), box(661)); + avl = remove_int(avl, 71); + avl = remove_int(avl, 523); + avl = gpr_avl_add(avl, box(319), box(664)); + avl = remove_int(avl, 632); + avl = gpr_avl_add(avl, box(137), box(666)); + avl = gpr_avl_add(avl, box(686), box(667)); + avl = gpr_avl_add(avl, box(724), box(668)); + avl = gpr_avl_add(avl, box(952), box(669)); + avl = gpr_avl_add(avl, box(5), box(670)); + avl = remove_int(avl, 35); + avl = gpr_avl_add(avl, box(43), box(672)); + avl = gpr_avl_add(avl, box(320), box(673)); + avl = gpr_avl_add(avl, box(115), box(674)); + avl = remove_int(avl, 377); + avl = remove_int(avl, 591); + avl = remove_int(avl, 87); + avl = remove_int(avl, 93); + avl = gpr_avl_add(avl, box(1016), box(679)); + avl = gpr_avl_add(avl, box(605), box(680)); + avl = gpr_avl_add(avl, box(152), box(681)); + avl = gpr_avl_add(avl, box(113), box(682)); + avl = remove_int(avl, 131); + avl = remove_int(avl, 637); + avl = gpr_avl_add(avl, box(156), box(685)); + avl = remove_int(avl, 696); + avl = gpr_avl_add(avl, box(546), box(687)); + avl = remove_int(avl, 970); + avl = remove_int(avl, 53); + avl = remove_int(avl, 827); + avl = remove_int(avl, 224); + avl = remove_int(avl, 796); + avl = remove_int(avl, 34); + avl = remove_int(avl, 922); + avl = remove_int(avl, 277); + avl = remove_int(avl, 650); + avl = remove_int(avl, 222); + avl = remove_int(avl, 244); + avl = remove_int(avl, 576); + avl = remove_int(avl, 413); + avl = gpr_avl_add(avl, box(500), box(701)); + avl = remove_int(avl, 924); + avl = gpr_avl_add(avl, box(825), box(703)); + avl = remove_int(avl, 888); + avl = remove_int(avl, 931); + avl = gpr_avl_add(avl, box(285), box(706)); + avl = remove_int(avl, 62); + avl = remove_int(avl, 444); + avl = remove_int(avl, 946); + avl = gpr_avl_add(avl, box(122), box(710)); + avl = gpr_avl_add(avl, box(846), box(711)); + avl = remove_int(avl, 628); + avl = gpr_avl_add(avl, box(511), box(713)); + avl = gpr_avl_add(avl, box(398), box(714)); + avl = remove_int(avl, 730); + avl = gpr_avl_add(avl, box(797), box(716)); + avl = remove_int(avl, 897); + avl = remove_int(avl, 228); + avl = remove_int(avl, 544); + avl = remove_int(avl, 552); + avl = remove_int(avl, 783); + avl = remove_int(avl, 583); + avl = remove_int(avl, 894); + avl = remove_int(avl, 942); + avl = gpr_avl_add(avl, box(346), box(725)); + avl = gpr_avl_add(avl, box(1015), box(726)); + avl = remove_int(avl, 813); + avl = gpr_avl_add(avl, box(213), box(728)); + avl = remove_int(avl, 468); + avl = remove_int(avl, 365); + avl = remove_int(avl, 399); + avl = gpr_avl_add(avl, box(380), box(732)); + avl = remove_int(avl, 835); + avl = remove_int(avl, 970); + avl = gpr_avl_add(avl, box(700), box(735)); + avl = gpr_avl_add(avl, box(807), box(736)); + avl = remove_int(avl, 312); + avl = remove_int(avl, 282); + avl = remove_int(avl, 370); + avl = remove_int(avl, 999); + avl = remove_int(avl, 241); + avl = remove_int(avl, 884); + avl = gpr_avl_add(avl, box(587), box(743)); + avl = gpr_avl_add(avl, box(332), box(744)); + avl = remove_int(avl, 686); + avl = remove_int(avl, 206); + avl = remove_int(avl, 835); + avl = gpr_avl_add(avl, box(334), box(748)); + avl = remove_int(avl, 171); + avl = gpr_avl_add(avl, box(1002), box(750)); + avl = gpr_avl_add(avl, box(779), box(751)); + avl = gpr_avl_add(avl, box(307), box(752)); + avl = gpr_avl_add(avl, box(127), box(753)); + avl = gpr_avl_add(avl, box(251), box(754)); + avl = remove_int(avl, 790); + avl = remove_int(avl, 189); + avl = remove_int(avl, 193); + avl = remove_int(avl, 38); + avl = remove_int(avl, 124); + avl = gpr_avl_add(avl, box(812), box(760)); + avl = remove_int(avl, 43); + avl = gpr_avl_add(avl, box(871), box(762)); + avl = gpr_avl_add(avl, box(580), box(763)); + avl = remove_int(avl, 501); + avl = remove_int(avl, 462); + avl = remove_int(avl, 599); + avl = gpr_avl_add(avl, box(240), box(767)); + avl = gpr_avl_add(avl, box(285), box(768)); + avl = gpr_avl_add(avl, box(472), box(769)); + avl = remove_int(avl, 865); + avl = remove_int(avl, 763); + avl = remove_int(avl, 245); + avl = remove_int(avl, 80); + avl = remove_int(avl, 713); + avl = remove_int(avl, 654); + avl = remove_int(avl, 1014); + avl = gpr_avl_add(avl, box(495), box(777)); + avl = gpr_avl_add(avl, box(552), box(778)); + avl = remove_int(avl, 19); + avl = remove_int(avl, 803); + avl = gpr_avl_add(avl, box(508), box(781)); + avl = remove_int(avl, 699); + avl = remove_int(avl, 260); + avl = remove_int(avl, 92); + avl = remove_int(avl, 497); + avl = gpr_avl_add(avl, box(970), box(786)); + avl = remove_int(avl, 987); + avl = remove_int(avl, 168); + avl = remove_int(avl, 476); + avl = remove_int(avl, 248); + avl = gpr_avl_add(avl, box(358), box(791)); + avl = remove_int(avl, 804); + avl = remove_int(avl, 77); + avl = remove_int(avl, 905); + avl = remove_int(avl, 362); + avl = gpr_avl_add(avl, box(578), box(796)); + avl = remove_int(avl, 38); + avl = remove_int(avl, 595); + avl = gpr_avl_add(avl, box(213), box(799)); + avl = remove_int(avl, 7); + avl = remove_int(avl, 620); + avl = gpr_avl_add(avl, box(946), box(802)); + avl = remove_int(avl, 145); + avl = gpr_avl_add(avl, box(628), box(804)); + avl = remove_int(avl, 972); + avl = gpr_avl_add(avl, box(728), box(806)); + avl = remove_int(avl, 91); + avl = gpr_avl_add(avl, box(136), box(808)); + avl = gpr_avl_add(avl, box(841), box(809)); + avl = gpr_avl_add(avl, box(265), box(810)); + avl = gpr_avl_add(avl, box(701), box(811)); + avl = gpr_avl_add(avl, box(27), box(812)); + avl = remove_int(avl, 72); + avl = remove_int(avl, 14); + avl = gpr_avl_add(avl, box(286), box(815)); + avl = remove_int(avl, 996); + avl = remove_int(avl, 998); + avl = gpr_avl_add(avl, box(466), box(818)); + avl = remove_int(avl, 1009); + avl = remove_int(avl, 741); + avl = remove_int(avl, 947); + avl = remove_int(avl, 241); + avl = remove_int(avl, 954); + avl = remove_int(avl, 183); + avl = remove_int(avl, 395); + avl = remove_int(avl, 951); + avl = gpr_avl_add(avl, box(267), box(827)); + avl = remove_int(avl, 812); + avl = gpr_avl_add(avl, box(577), box(829)); + avl = remove_int(avl, 624); + avl = remove_int(avl, 847); + avl = remove_int(avl, 745); + avl = gpr_avl_add(avl, box(491), box(833)); + avl = gpr_avl_add(avl, box(941), box(834)); + avl = remove_int(avl, 258); + avl = gpr_avl_add(avl, box(410), box(836)); + avl = gpr_avl_add(avl, box(80), box(837)); + avl = gpr_avl_add(avl, box(196), box(838)); + avl = gpr_avl_add(avl, box(5), box(839)); + avl = remove_int(avl, 782); + avl = gpr_avl_add(avl, box(827), box(841)); + avl = remove_int(avl, 472); + avl = remove_int(avl, 664); + avl = gpr_avl_add(avl, box(409), box(844)); + avl = gpr_avl_add(avl, box(62), box(845)); + avl = remove_int(avl, 56); + avl = remove_int(avl, 606); + avl = remove_int(avl, 707); + avl = remove_int(avl, 989); + avl = remove_int(avl, 549); + avl = remove_int(avl, 259); + avl = gpr_avl_add(avl, box(405), box(852)); + avl = remove_int(avl, 587); + avl = remove_int(avl, 350); + avl = gpr_avl_add(avl, box(980), box(855)); + avl = gpr_avl_add(avl, box(992), box(856)); + avl = gpr_avl_add(avl, box(818), box(857)); + avl = remove_int(avl, 853); + avl = remove_int(avl, 701); + avl = gpr_avl_add(avl, box(675), box(860)); + avl = remove_int(avl, 248); + avl = remove_int(avl, 649); + avl = gpr_avl_add(avl, box(508), box(863)); + avl = remove_int(avl, 927); + avl = gpr_avl_add(avl, box(957), box(865)); + avl = gpr_avl_add(avl, box(698), box(866)); + avl = gpr_avl_add(avl, box(388), box(867)); + avl = gpr_avl_add(avl, box(532), box(868)); + avl = gpr_avl_add(avl, box(681), box(869)); + avl = remove_int(avl, 544); + avl = remove_int(avl, 991); + avl = remove_int(avl, 397); + avl = gpr_avl_add(avl, box(954), box(873)); + avl = gpr_avl_add(avl, box(219), box(874)); + avl = gpr_avl_add(avl, box(465), box(875)); + avl = remove_int(avl, 371); + avl = gpr_avl_add(avl, box(601), box(877)); + avl = gpr_avl_add(avl, box(543), box(878)); + avl = remove_int(avl, 329); + avl = gpr_avl_add(avl, box(560), box(880)); + avl = remove_int(avl, 898); + avl = gpr_avl_add(avl, box(455), box(882)); + avl = remove_int(avl, 313); + avl = gpr_avl_add(avl, box(215), box(884)); + avl = remove_int(avl, 846); + avl = gpr_avl_add(avl, box(608), box(886)); + avl = remove_int(avl, 248); + avl = gpr_avl_add(avl, box(575), box(888)); + avl = remove_int(avl, 207); + avl = remove_int(avl, 810); + avl = remove_int(avl, 665); + avl = remove_int(avl, 361); + avl = gpr_avl_add(avl, box(154), box(893)); + avl = gpr_avl_add(avl, box(329), box(894)); + avl = gpr_avl_add(avl, box(326), box(895)); + avl = remove_int(avl, 746); + avl = remove_int(avl, 99); + avl = gpr_avl_add(avl, box(464), box(898)); + avl = gpr_avl_add(avl, box(141), box(899)); + avl = remove_int(avl, 383); + avl = gpr_avl_add(avl, box(414), box(901)); + avl = gpr_avl_add(avl, box(777), box(902)); + avl = remove_int(avl, 972); + avl = remove_int(avl, 841); + avl = remove_int(avl, 100); + avl = gpr_avl_add(avl, box(828), box(906)); + avl = remove_int(avl, 785); + avl = gpr_avl_add(avl, box(1008), box(908)); + avl = gpr_avl_add(avl, box(46), box(909)); + avl = remove_int(avl, 399); + avl = gpr_avl_add(avl, box(178), box(911)); + avl = gpr_avl_add(avl, box(573), box(912)); + avl = remove_int(avl, 299); + avl = gpr_avl_add(avl, box(690), box(914)); + avl = gpr_avl_add(avl, box(692), box(915)); + avl = remove_int(avl, 404); + avl = remove_int(avl, 16); + avl = remove_int(avl, 746); + avl = remove_int(avl, 486); + avl = remove_int(avl, 119); + avl = gpr_avl_add(avl, box(167), box(921)); + avl = remove_int(avl, 328); + avl = gpr_avl_add(avl, box(89), box(923)); + avl = remove_int(avl, 867); + avl = remove_int(avl, 626); + avl = remove_int(avl, 507); + avl = gpr_avl_add(avl, box(365), box(927)); + avl = gpr_avl_add(avl, box(58), box(928)); + avl = gpr_avl_add(avl, box(70), box(929)); + avl = remove_int(avl, 81); + avl = remove_int(avl, 797); + avl = gpr_avl_add(avl, box(846), box(932)); + avl = remove_int(avl, 642); + avl = gpr_avl_add(avl, box(777), box(934)); + avl = remove_int(avl, 107); + avl = gpr_avl_add(avl, box(691), box(936)); + avl = gpr_avl_add(avl, box(820), box(937)); + avl = gpr_avl_add(avl, box(202), box(938)); + avl = gpr_avl_add(avl, box(308), box(939)); + avl = gpr_avl_add(avl, box(20), box(940)); + avl = remove_int(avl, 289); + avl = gpr_avl_add(avl, box(714), box(942)); + avl = gpr_avl_add(avl, box(584), box(943)); + avl = remove_int(avl, 294); + avl = gpr_avl_add(avl, box(496), box(945)); + avl = gpr_avl_add(avl, box(394), box(946)); + avl = gpr_avl_add(avl, box(860), box(947)); + avl = gpr_avl_add(avl, box(58), box(948)); + avl = remove_int(avl, 784); + avl = remove_int(avl, 584); + avl = remove_int(avl, 708); + avl = gpr_avl_add(avl, box(142), box(952)); + avl = gpr_avl_add(avl, box(247), box(953)); + avl = gpr_avl_add(avl, box(389), box(954)); + avl = remove_int(avl, 390); + avl = gpr_avl_add(avl, box(465), box(956)); + avl = gpr_avl_add(avl, box(936), box(957)); + avl = gpr_avl_add(avl, box(309), box(958)); + avl = remove_int(avl, 928); + avl = remove_int(avl, 128); + avl = remove_int(avl, 979); + avl = remove_int(avl, 670); + avl = remove_int(avl, 738); + avl = remove_int(avl, 271); + avl = remove_int(avl, 540); + avl = gpr_avl_add(avl, box(365), box(966)); + avl = remove_int(avl, 82); + avl = gpr_avl_add(avl, box(728), box(968)); + avl = remove_int(avl, 852); + avl = gpr_avl_add(avl, box(884), box(970)); + avl = gpr_avl_add(avl, box(502), box(971)); + avl = remove_int(avl, 898); + avl = remove_int(avl, 481); + avl = gpr_avl_add(avl, box(911), box(974)); + avl = remove_int(avl, 787); + avl = remove_int(avl, 785); + avl = remove_int(avl, 537); + avl = remove_int(avl, 535); + avl = remove_int(avl, 136); + avl = remove_int(avl, 749); + avl = remove_int(avl, 637); + avl = remove_int(avl, 900); + avl = gpr_avl_add(avl, box(598), box(983)); + avl = remove_int(avl, 25); + avl = remove_int(avl, 697); + avl = gpr_avl_add(avl, box(645), box(986)); + avl = gpr_avl_add(avl, box(211), box(987)); + avl = gpr_avl_add(avl, box(589), box(988)); + avl = remove_int(avl, 702); + avl = gpr_avl_add(avl, box(53), box(990)); + avl = remove_int(avl, 492); + avl = remove_int(avl, 185); + avl = remove_int(avl, 246); + avl = remove_int(avl, 257); + avl = remove_int(avl, 502); + avl = remove_int(avl, 34); + avl = gpr_avl_add(avl, box(74), box(997)); + avl = gpr_avl_add(avl, box(834), box(998)); + avl = gpr_avl_add(avl, box(514), box(999)); + avl = gpr_avl_add(avl, box(75), box(1000)); + avl = remove_int(avl, 745); + avl = gpr_avl_add(avl, box(362), box(1002)); + avl = remove_int(avl, 215); + avl = gpr_avl_add(avl, box(624), box(1004)); + avl = remove_int(avl, 404); + avl = remove_int(avl, 359); + avl = remove_int(avl, 491); + avl = gpr_avl_add(avl, box(903), box(1008)); + avl = gpr_avl_add(avl, box(240), box(1009)); + avl = remove_int(avl, 95); + avl = gpr_avl_add(avl, box(119), box(1011)); + avl = gpr_avl_add(avl, box(857), box(1012)); + avl = remove_int(avl, 39); + avl = remove_int(avl, 866); + avl = gpr_avl_add(avl, box(503), box(1015)); + avl = gpr_avl_add(avl, box(740), box(1016)); + avl = remove_int(avl, 637); + avl = remove_int(avl, 156); + avl = remove_int(avl, 6); + avl = remove_int(avl, 745); + avl = remove_int(avl, 433); + avl = remove_int(avl, 283); + avl = gpr_avl_add(avl, box(625), box(1023)); + avl = remove_int(avl, 638); + avl = gpr_avl_add(avl, box(299), box(1025)); + avl = gpr_avl_add(avl, box(584), box(1026)); + avl = remove_int(avl, 863); + avl = gpr_avl_add(avl, box(612), box(1028)); + avl = gpr_avl_add(avl, box(62), box(1029)); + avl = gpr_avl_add(avl, box(432), box(1030)); + avl = remove_int(avl, 371); + avl = remove_int(avl, 790); + avl = remove_int(avl, 227); + avl = remove_int(avl, 836); + avl = gpr_avl_add(avl, box(703), box(1035)); + avl = gpr_avl_add(avl, box(644), box(1036)); + avl = remove_int(avl, 638); + avl = gpr_avl_add(avl, box(13), box(1038)); + avl = remove_int(avl, 66); + avl = remove_int(avl, 82); + avl = gpr_avl_add(avl, box(362), box(1041)); + avl = gpr_avl_add(avl, box(783), box(1042)); + avl = remove_int(avl, 60); + avl = gpr_avl_add(avl, box(80), box(1044)); + avl = gpr_avl_add(avl, box(825), box(1045)); + avl = gpr_avl_add(avl, box(688), box(1046)); + avl = gpr_avl_add(avl, box(662), box(1047)); + avl = remove_int(avl, 156); + avl = remove_int(avl, 376); + avl = remove_int(avl, 99); + avl = gpr_avl_add(avl, box(526), box(1051)); + avl = gpr_avl_add(avl, box(168), box(1052)); + avl = remove_int(avl, 646); + avl = remove_int(avl, 380); + avl = remove_int(avl, 833); + avl = gpr_avl_add(avl, box(53), box(1056)); + avl = remove_int(avl, 105); + avl = gpr_avl_add(avl, box(373), box(1058)); + avl = gpr_avl_add(avl, box(184), box(1059)); + avl = remove_int(avl, 288); + avl = gpr_avl_add(avl, box(966), box(1061)); + avl = remove_int(avl, 158); + avl = gpr_avl_add(avl, box(406), box(1063)); + avl = remove_int(avl, 470); + avl = gpr_avl_add(avl, box(283), box(1065)); + avl = gpr_avl_add(avl, box(838), box(1066)); + avl = gpr_avl_add(avl, box(288), box(1067)); + avl = gpr_avl_add(avl, box(950), box(1068)); + avl = gpr_avl_add(avl, box(163), box(1069)); + avl = remove_int(avl, 623); + avl = remove_int(avl, 769); + avl = gpr_avl_add(avl, box(144), box(1072)); + avl = gpr_avl_add(avl, box(489), box(1073)); + avl = remove_int(avl, 15); + avl = gpr_avl_add(avl, box(971), box(1075)); + avl = remove_int(avl, 660); + avl = gpr_avl_add(avl, box(255), box(1077)); + avl = remove_int(avl, 494); + avl = gpr_avl_add(avl, box(109), box(1079)); + avl = gpr_avl_add(avl, box(420), box(1080)); + avl = gpr_avl_add(avl, box(509), box(1081)); + avl = remove_int(avl, 178); + avl = gpr_avl_add(avl, box(216), box(1083)); + avl = gpr_avl_add(avl, box(707), box(1084)); + avl = gpr_avl_add(avl, box(411), box(1085)); + avl = gpr_avl_add(avl, box(352), box(1086)); + avl = remove_int(avl, 983); + avl = gpr_avl_add(avl, box(6), box(1088)); + avl = gpr_avl_add(avl, box(1014), box(1089)); + avl = remove_int(avl, 98); + avl = remove_int(avl, 325); + avl = gpr_avl_add(avl, box(851), box(1092)); + avl = remove_int(avl, 553); + avl = gpr_avl_add(avl, box(218), box(1094)); + avl = gpr_avl_add(avl, box(261), box(1095)); + avl = remove_int(avl, 31); + avl = gpr_avl_add(avl, box(872), box(1097)); + avl = remove_int(avl, 543); + avl = remove_int(avl, 314); + avl = remove_int(avl, 443); + avl = gpr_avl_add(avl, box(533), box(1101)); + avl = remove_int(avl, 881); + avl = remove_int(avl, 269); + avl = remove_int(avl, 940); + avl = remove_int(avl, 909); + avl = remove_int(avl, 197); + avl = remove_int(avl, 773); + avl = remove_int(avl, 790); + avl = remove_int(avl, 345); + avl = gpr_avl_add(avl, box(965), box(1110)); + avl = remove_int(avl, 622); + avl = gpr_avl_add(avl, box(352), box(1112)); + avl = remove_int(avl, 182); + avl = gpr_avl_add(avl, box(534), box(1114)); + avl = gpr_avl_add(avl, box(97), box(1115)); + avl = gpr_avl_add(avl, box(198), box(1116)); + avl = remove_int(avl, 750); + avl = gpr_avl_add(avl, box(98), box(1118)); + avl = remove_int(avl, 943); + avl = gpr_avl_add(avl, box(254), box(1120)); + avl = gpr_avl_add(avl, box(30), box(1121)); + avl = remove_int(avl, 14); + avl = remove_int(avl, 475); + avl = remove_int(avl, 82); + avl = gpr_avl_add(avl, box(789), box(1125)); + avl = gpr_avl_add(avl, box(402), box(1126)); + avl = remove_int(avl, 1019); + avl = gpr_avl_add(avl, box(858), box(1128)); + avl = gpr_avl_add(avl, box(625), box(1129)); + avl = remove_int(avl, 675); + avl = remove_int(avl, 323); + avl = gpr_avl_add(avl, box(329), box(1132)); + avl = remove_int(avl, 929); + avl = remove_int(avl, 44); + avl = gpr_avl_add(avl, box(443), box(1135)); + avl = gpr_avl_add(avl, box(653), box(1136)); + avl = gpr_avl_add(avl, box(750), box(1137)); + avl = gpr_avl_add(avl, box(252), box(1138)); + avl = gpr_avl_add(avl, box(449), box(1139)); + avl = remove_int(avl, 1022); + avl = remove_int(avl, 357); + avl = remove_int(avl, 602); + avl = remove_int(avl, 131); + avl = gpr_avl_add(avl, box(531), box(1144)); + avl = remove_int(avl, 806); + avl = gpr_avl_add(avl, box(455), box(1146)); + avl = remove_int(avl, 31); + avl = gpr_avl_add(avl, box(154), box(1148)); + avl = gpr_avl_add(avl, box(189), box(1149)); + avl = remove_int(avl, 786); + avl = gpr_avl_add(avl, box(496), box(1151)); + avl = gpr_avl_add(avl, box(81), box(1152)); + avl = gpr_avl_add(avl, box(59), box(1153)); + avl = remove_int(avl, 424); + avl = remove_int(avl, 668); + avl = gpr_avl_add(avl, box(723), box(1156)); + avl = gpr_avl_add(avl, box(822), box(1157)); + avl = gpr_avl_add(avl, box(354), box(1158)); + avl = remove_int(avl, 738); + avl = gpr_avl_add(avl, box(686), box(1160)); + avl = gpr_avl_add(avl, box(43), box(1161)); + avl = gpr_avl_add(avl, box(625), box(1162)); + avl = gpr_avl_add(avl, box(902), box(1163)); + avl = gpr_avl_add(avl, box(12), box(1164)); + avl = gpr_avl_add(avl, box(977), box(1165)); + avl = gpr_avl_add(avl, box(699), box(1166)); + avl = gpr_avl_add(avl, box(189), box(1167)); + avl = remove_int(avl, 672); + avl = remove_int(avl, 90); + avl = remove_int(avl, 757); + avl = remove_int(avl, 494); + avl = gpr_avl_add(avl, box(759), box(1172)); + avl = remove_int(avl, 758); + avl = remove_int(avl, 222); + avl = gpr_avl_add(avl, box(975), box(1175)); + avl = remove_int(avl, 993); + avl = gpr_avl_add(avl, box(2), box(1177)); + avl = gpr_avl_add(avl, box(70), box(1178)); + avl = remove_int(avl, 350); + avl = remove_int(avl, 972); + avl = remove_int(avl, 880); + avl = gpr_avl_add(avl, box(753), box(1182)); + avl = remove_int(avl, 404); + avl = gpr_avl_add(avl, box(294), box(1184)); + avl = remove_int(avl, 474); + avl = gpr_avl_add(avl, box(228), box(1186)); + avl = gpr_avl_add(avl, box(484), box(1187)); + avl = remove_int(avl, 238); + avl = remove_int(avl, 53); + avl = remove_int(avl, 691); + avl = gpr_avl_add(avl, box(345), box(1191)); + avl = remove_int(avl, 0); + avl = gpr_avl_add(avl, box(230), box(1193)); + avl = remove_int(avl, 227); + avl = remove_int(avl, 152); + avl = gpr_avl_add(avl, box(884), box(1196)); + avl = remove_int(avl, 823); + avl = remove_int(avl, 53); + avl = gpr_avl_add(avl, box(1015), box(1199)); + avl = gpr_avl_add(avl, box(697), box(1200)); + avl = gpr_avl_add(avl, box(376), box(1201)); + avl = remove_int(avl, 411); + avl = gpr_avl_add(avl, box(888), box(1203)); + avl = remove_int(avl, 55); + avl = gpr_avl_add(avl, box(85), box(1205)); + avl = remove_int(avl, 947); + avl = remove_int(avl, 382); + avl = remove_int(avl, 777); + avl = gpr_avl_add(avl, box(1017), box(1209)); + avl = gpr_avl_add(avl, box(169), box(1210)); + avl = gpr_avl_add(avl, box(156), box(1211)); + avl = remove_int(avl, 153); + avl = remove_int(avl, 642); + avl = remove_int(avl, 158); + avl = gpr_avl_add(avl, box(554), box(1215)); + avl = gpr_avl_add(avl, box(76), box(1216)); + avl = gpr_avl_add(avl, box(756), box(1217)); + avl = remove_int(avl, 767); + avl = remove_int(avl, 112); + avl = remove_int(avl, 539); + avl = remove_int(avl, 544); + avl = remove_int(avl, 628); + avl = remove_int(avl, 385); + avl = remove_int(avl, 514); + avl = remove_int(avl, 362); + avl = gpr_avl_add(avl, box(523), box(1226)); + avl = gpr_avl_add(avl, box(712), box(1227)); + avl = gpr_avl_add(avl, box(474), box(1228)); + avl = gpr_avl_add(avl, box(882), box(1229)); + avl = gpr_avl_add(avl, box(965), box(1230)); + avl = remove_int(avl, 464); + avl = gpr_avl_add(avl, box(319), box(1232)); + avl = gpr_avl_add(avl, box(504), box(1233)); + avl = remove_int(avl, 818); + avl = gpr_avl_add(avl, box(884), box(1235)); + avl = gpr_avl_add(avl, box(813), box(1236)); + avl = gpr_avl_add(avl, box(795), box(1237)); + avl = remove_int(avl, 306); + avl = gpr_avl_add(avl, box(799), box(1239)); + avl = remove_int(avl, 534); + avl = gpr_avl_add(avl, box(480), box(1241)); + avl = gpr_avl_add(avl, box(656), box(1242)); + avl = gpr_avl_add(avl, box(709), box(1243)); + avl = gpr_avl_add(avl, box(500), box(1244)); + avl = remove_int(avl, 740); + avl = gpr_avl_add(avl, box(980), box(1246)); + avl = gpr_avl_add(avl, box(458), box(1247)); + avl = remove_int(avl, 377); + avl = remove_int(avl, 338); + avl = gpr_avl_add(avl, box(554), box(1250)); + avl = gpr_avl_add(avl, box(504), box(1251)); + avl = gpr_avl_add(avl, box(603), box(1252)); + avl = gpr_avl_add(avl, box(761), box(1253)); + avl = remove_int(avl, 431); + avl = gpr_avl_add(avl, box(707), box(1255)); + avl = gpr_avl_add(avl, box(673), box(1256)); + avl = remove_int(avl, 998); + avl = remove_int(avl, 332); + avl = remove_int(avl, 413); + avl = remove_int(avl, 227); + avl = remove_int(avl, 249); + avl = remove_int(avl, 309); + avl = remove_int(avl, 459); + avl = gpr_avl_add(avl, box(645), box(1264)); + avl = remove_int(avl, 858); + avl = remove_int(avl, 997); + avl = gpr_avl_add(avl, box(519), box(1267)); + avl = remove_int(avl, 614); + avl = remove_int(avl, 462); + avl = remove_int(avl, 792); + avl = gpr_avl_add(avl, box(987), box(1271)); + avl = gpr_avl_add(avl, box(309), box(1272)); + avl = remove_int(avl, 747); + avl = gpr_avl_add(avl, box(621), box(1274)); + avl = gpr_avl_add(avl, box(450), box(1275)); + avl = remove_int(avl, 265); + avl = remove_int(avl, 8); + avl = remove_int(avl, 383); + avl = gpr_avl_add(avl, box(238), box(1279)); + avl = remove_int(avl, 241); + avl = gpr_avl_add(avl, box(180), box(1281)); + avl = gpr_avl_add(avl, box(411), box(1282)); + avl = gpr_avl_add(avl, box(791), box(1283)); + avl = gpr_avl_add(avl, box(955), box(1284)); + avl = remove_int(avl, 24); + avl = remove_int(avl, 375); + avl = gpr_avl_add(avl, box(140), box(1287)); + avl = remove_int(avl, 949); + avl = gpr_avl_add(avl, box(301), box(1289)); + avl = gpr_avl_add(avl, box(0), box(1290)); + avl = remove_int(avl, 371); + avl = remove_int(avl, 427); + avl = remove_int(avl, 841); + avl = remove_int(avl, 847); + avl = gpr_avl_add(avl, box(814), box(1295)); + avl = gpr_avl_add(avl, box(127), box(1296)); + avl = gpr_avl_add(avl, box(279), box(1297)); + avl = remove_int(avl, 669); + avl = remove_int(avl, 541); + avl = remove_int(avl, 275); + avl = remove_int(avl, 299); + avl = remove_int(avl, 552); + avl = gpr_avl_add(avl, box(310), box(1303)); + avl = gpr_avl_add(avl, box(304), box(1304)); + avl = gpr_avl_add(avl, box(1), box(1305)); + avl = gpr_avl_add(avl, box(339), box(1306)); + avl = remove_int(avl, 570); + avl = remove_int(avl, 752); + avl = remove_int(avl, 552); + avl = remove_int(avl, 442); + avl = remove_int(avl, 639); + avl = gpr_avl_add(avl, box(313), box(1312)); + avl = remove_int(avl, 85); + avl = gpr_avl_add(avl, box(964), box(1314)); + avl = gpr_avl_add(avl, box(559), box(1315)); + avl = remove_int(avl, 167); + avl = gpr_avl_add(avl, box(866), box(1317)); + avl = remove_int(avl, 275); + avl = gpr_avl_add(avl, box(173), box(1319)); + avl = gpr_avl_add(avl, box(765), box(1320)); + avl = remove_int(avl, 883); + avl = gpr_avl_add(avl, box(547), box(1322)); + avl = gpr_avl_add(avl, box(847), box(1323)); + avl = remove_int(avl, 817); + avl = remove_int(avl, 850); + avl = remove_int(avl, 718); + avl = gpr_avl_add(avl, box(806), box(1327)); + avl = gpr_avl_add(avl, box(360), box(1328)); + avl = remove_int(avl, 991); + avl = gpr_avl_add(avl, box(493), box(1330)); + avl = remove_int(avl, 516); + avl = gpr_avl_add(avl, box(361), box(1332)); + avl = remove_int(avl, 355); + avl = gpr_avl_add(avl, box(512), box(1334)); + avl = gpr_avl_add(avl, box(191), box(1335)); + avl = remove_int(avl, 703); + avl = gpr_avl_add(avl, box(333), box(1337)); + avl = remove_int(avl, 481); + avl = gpr_avl_add(avl, box(501), box(1339)); + avl = remove_int(avl, 532); + avl = remove_int(avl, 510); + avl = gpr_avl_add(avl, box(793), box(1342)); + avl = gpr_avl_add(avl, box(234), box(1343)); + avl = remove_int(avl, 159); + avl = remove_int(avl, 429); + avl = remove_int(avl, 728); + avl = remove_int(avl, 288); + avl = gpr_avl_add(avl, box(281), box(1348)); + avl = gpr_avl_add(avl, box(702), box(1349)); + avl = gpr_avl_add(avl, box(149), box(1350)); + avl = remove_int(avl, 22); + avl = remove_int(avl, 944); + avl = remove_int(avl, 55); + avl = remove_int(avl, 512); + avl = remove_int(avl, 676); + avl = remove_int(avl, 884); + avl = gpr_avl_add(avl, box(246), box(1357)); + avl = gpr_avl_add(avl, box(455), box(1358)); + avl = remove_int(avl, 782); + avl = remove_int(avl, 682); + avl = gpr_avl_add(avl, box(243), box(1361)); + avl = gpr_avl_add(avl, box(109), box(1362)); + avl = gpr_avl_add(avl, box(452), box(1363)); + avl = remove_int(avl, 151); + avl = gpr_avl_add(avl, box(159), box(1365)); + avl = remove_int(avl, 1023); + avl = gpr_avl_add(avl, box(129), box(1367)); + avl = gpr_avl_add(avl, box(537), box(1368)); + avl = remove_int(avl, 321); + avl = gpr_avl_add(avl, box(740), box(1370)); + avl = remove_int(avl, 45); + avl = remove_int(avl, 136); + avl = gpr_avl_add(avl, box(229), box(1373)); + avl = remove_int(avl, 772); + avl = gpr_avl_add(avl, box(181), box(1375)); + avl = remove_int(avl, 175); + avl = gpr_avl_add(avl, box(817), box(1377)); + avl = remove_int(avl, 956); + avl = gpr_avl_add(avl, box(675), box(1379)); + avl = gpr_avl_add(avl, box(375), box(1380)); + avl = remove_int(avl, 384); + avl = gpr_avl_add(avl, box(1016), box(1382)); + avl = remove_int(avl, 295); + avl = remove_int(avl, 697); + avl = remove_int(avl, 554); + avl = remove_int(avl, 590); + avl = remove_int(avl, 1014); + avl = gpr_avl_add(avl, box(890), box(1388)); + avl = gpr_avl_add(avl, box(293), box(1389)); + avl = remove_int(avl, 207); + avl = remove_int(avl, 46); + avl = gpr_avl_add(avl, box(899), box(1392)); + avl = gpr_avl_add(avl, box(666), box(1393)); + avl = gpr_avl_add(avl, box(85), box(1394)); + avl = gpr_avl_add(avl, box(914), box(1395)); + avl = gpr_avl_add(avl, box(128), box(1396)); + avl = gpr_avl_add(avl, box(835), box(1397)); + avl = gpr_avl_add(avl, box(787), box(1398)); + avl = gpr_avl_add(avl, box(649), box(1399)); + avl = gpr_avl_add(avl, box(723), box(1400)); + avl = remove_int(avl, 874); + avl = gpr_avl_add(avl, box(778), box(1402)); + avl = gpr_avl_add(avl, box(1015), box(1403)); + avl = gpr_avl_add(avl, box(59), box(1404)); + avl = gpr_avl_add(avl, box(259), box(1405)); + avl = gpr_avl_add(avl, box(758), box(1406)); + avl = remove_int(avl, 648); + avl = gpr_avl_add(avl, box(145), box(1408)); + avl = gpr_avl_add(avl, box(440), box(1409)); + avl = remove_int(avl, 608); + avl = remove_int(avl, 690); + avl = gpr_avl_add(avl, box(605), box(1412)); + avl = remove_int(avl, 856); + avl = remove_int(avl, 608); + avl = gpr_avl_add(avl, box(829), box(1415)); + avl = gpr_avl_add(avl, box(660), box(1416)); + avl = remove_int(avl, 596); + avl = gpr_avl_add(avl, box(519), box(1418)); + avl = gpr_avl_add(avl, box(35), box(1419)); + avl = gpr_avl_add(avl, box(871), box(1420)); + avl = remove_int(avl, 845); + avl = gpr_avl_add(avl, box(600), box(1422)); + avl = gpr_avl_add(avl, box(215), box(1423)); + avl = remove_int(avl, 761); + avl = gpr_avl_add(avl, box(975), box(1425)); + avl = remove_int(avl, 987); + avl = gpr_avl_add(avl, box(58), box(1427)); + avl = remove_int(avl, 119); + avl = gpr_avl_add(avl, box(937), box(1429)); + avl = gpr_avl_add(avl, box(372), box(1430)); + avl = gpr_avl_add(avl, box(11), box(1431)); + avl = gpr_avl_add(avl, box(398), box(1432)); + avl = gpr_avl_add(avl, box(423), box(1433)); + avl = remove_int(avl, 171); + avl = gpr_avl_add(avl, box(473), box(1435)); + avl = remove_int(avl, 752); + avl = remove_int(avl, 625); + avl = remove_int(avl, 764); + avl = remove_int(avl, 49); + avl = gpr_avl_add(avl, box(472), box(1440)); + avl = remove_int(avl, 847); + avl = remove_int(avl, 642); + avl = remove_int(avl, 1004); + avl = remove_int(avl, 795); + avl = remove_int(avl, 465); + avl = gpr_avl_add(avl, box(636), box(1446)); + avl = remove_int(avl, 152); + avl = gpr_avl_add(avl, box(61), box(1448)); + avl = remove_int(avl, 929); + avl = remove_int(avl, 9); + avl = gpr_avl_add(avl, box(251), box(1451)); + avl = gpr_avl_add(avl, box(672), box(1452)); + avl = gpr_avl_add(avl, box(66), box(1453)); + avl = remove_int(avl, 693); + avl = remove_int(avl, 914); + avl = remove_int(avl, 116); + avl = remove_int(avl, 577); + avl = gpr_avl_add(avl, box(618), box(1458)); + avl = gpr_avl_add(avl, box(495), box(1459)); + avl = remove_int(avl, 450); + avl = gpr_avl_add(avl, box(533), box(1461)); + avl = gpr_avl_add(avl, box(414), box(1462)); + avl = remove_int(avl, 74); + avl = remove_int(avl, 236); + avl = gpr_avl_add(avl, box(707), box(1465)); + avl = gpr_avl_add(avl, box(357), box(1466)); + avl = gpr_avl_add(avl, box(1007), box(1467)); + avl = gpr_avl_add(avl, box(811), box(1468)); + avl = gpr_avl_add(avl, box(418), box(1469)); + avl = gpr_avl_add(avl, box(164), box(1470)); + avl = gpr_avl_add(avl, box(622), box(1471)); + avl = remove_int(avl, 22); + avl = remove_int(avl, 14); + avl = remove_int(avl, 732); + avl = remove_int(avl, 7); + avl = remove_int(avl, 447); + avl = gpr_avl_add(avl, box(221), box(1477)); + avl = gpr_avl_add(avl, box(202), box(1478)); + avl = gpr_avl_add(avl, box(312), box(1479)); + avl = remove_int(avl, 274); + avl = gpr_avl_add(avl, box(684), box(1481)); + avl = gpr_avl_add(avl, box(954), box(1482)); + avl = gpr_avl_add(avl, box(637), box(1483)); + avl = remove_int(avl, 716); + avl = gpr_avl_add(avl, box(198), box(1485)); + avl = remove_int(avl, 340); + avl = remove_int(avl, 137); + avl = remove_int(avl, 995); + avl = remove_int(avl, 1004); + avl = gpr_avl_add(avl, box(661), box(1490)); + avl = gpr_avl_add(avl, box(862), box(1491)); + avl = remove_int(avl, 527); + avl = gpr_avl_add(avl, box(945), box(1493)); + avl = remove_int(avl, 355); + avl = remove_int(avl, 144); + avl = gpr_avl_add(avl, box(229), box(1496)); + avl = gpr_avl_add(avl, box(237), box(1497)); + avl = remove_int(avl, 471); + avl = remove_int(avl, 901); + avl = gpr_avl_add(avl, box(905), box(1500)); + avl = remove_int(avl, 19); + avl = remove_int(avl, 896); + avl = remove_int(avl, 585); + avl = remove_int(avl, 308); + avl = gpr_avl_add(avl, box(547), box(1505)); + avl = gpr_avl_add(avl, box(552), box(1506)); + avl = gpr_avl_add(avl, box(30), box(1507)); + avl = gpr_avl_add(avl, box(445), box(1508)); + avl = remove_int(avl, 785); + avl = remove_int(avl, 185); + avl = gpr_avl_add(avl, box(405), box(1511)); + avl = gpr_avl_add(avl, box(733), box(1512)); + avl = gpr_avl_add(avl, box(573), box(1513)); + avl = gpr_avl_add(avl, box(492), box(1514)); + avl = gpr_avl_add(avl, box(343), box(1515)); + avl = gpr_avl_add(avl, box(527), box(1516)); + avl = gpr_avl_add(avl, box(596), box(1517)); + avl = gpr_avl_add(avl, box(519), box(1518)); + avl = remove_int(avl, 243); + avl = remove_int(avl, 722); + avl = gpr_avl_add(avl, box(772), box(1521)); + avl = remove_int(avl, 152); + avl = remove_int(avl, 305); + avl = gpr_avl_add(avl, box(754), box(1524)); + avl = gpr_avl_add(avl, box(373), box(1525)); + avl = remove_int(avl, 995); + avl = gpr_avl_add(avl, box(329), box(1527)); + avl = remove_int(avl, 397); + avl = gpr_avl_add(avl, box(884), box(1529)); + avl = remove_int(avl, 329); + avl = remove_int(avl, 240); + avl = gpr_avl_add(avl, box(566), box(1532)); + avl = gpr_avl_add(avl, box(232), box(1533)); + avl = remove_int(avl, 993); + avl = gpr_avl_add(avl, box(888), box(1535)); + avl = remove_int(avl, 242); + avl = gpr_avl_add(avl, box(941), box(1537)); + avl = remove_int(avl, 415); + avl = gpr_avl_add(avl, box(992), box(1539)); + avl = remove_int(avl, 289); + avl = gpr_avl_add(avl, box(60), box(1541)); + avl = gpr_avl_add(avl, box(97), box(1542)); + avl = remove_int(avl, 965); + avl = remove_int(avl, 267); + avl = remove_int(avl, 360); + avl = gpr_avl_add(avl, box(5), box(1546)); + avl = remove_int(avl, 429); + avl = gpr_avl_add(avl, box(412), box(1548)); + avl = remove_int(avl, 632); + avl = remove_int(avl, 113); + avl = gpr_avl_add(avl, box(48), box(1551)); + avl = gpr_avl_add(avl, box(108), box(1552)); + avl = gpr_avl_add(avl, box(750), box(1553)); + avl = remove_int(avl, 188); + avl = gpr_avl_add(avl, box(668), box(1555)); + avl = remove_int(avl, 37); + avl = remove_int(avl, 737); + avl = gpr_avl_add(avl, box(93), box(1558)); + avl = gpr_avl_add(avl, box(628), box(1559)); + avl = gpr_avl_add(avl, box(480), box(1560)); + avl = remove_int(avl, 958); + avl = remove_int(avl, 565); + avl = remove_int(avl, 32); + avl = remove_int(avl, 1); + avl = remove_int(avl, 335); + avl = gpr_avl_add(avl, box(136), box(1566)); + avl = gpr_avl_add(avl, box(469), box(1567)); + avl = remove_int(avl, 349); + avl = gpr_avl_add(avl, box(768), box(1569)); + avl = gpr_avl_add(avl, box(915), box(1570)); + avl = remove_int(avl, 1014); + avl = gpr_avl_add(avl, box(117), box(1572)); + avl = remove_int(avl, 62); + avl = gpr_avl_add(avl, box(382), box(1574)); + avl = remove_int(avl, 571); + avl = gpr_avl_add(avl, box(655), box(1576)); + avl = gpr_avl_add(avl, box(323), box(1577)); + avl = remove_int(avl, 869); + avl = remove_int(avl, 151); + avl = gpr_avl_add(avl, box(1019), box(1580)); + avl = gpr_avl_add(avl, box(984), box(1581)); + avl = gpr_avl_add(avl, box(870), box(1582)); + avl = gpr_avl_add(avl, box(376), box(1583)); + avl = remove_int(avl, 625); + avl = gpr_avl_add(avl, box(733), box(1585)); + avl = remove_int(avl, 532); + avl = remove_int(avl, 444); + avl = gpr_avl_add(avl, box(428), box(1588)); + avl = gpr_avl_add(avl, box(860), box(1589)); + avl = gpr_avl_add(avl, box(173), box(1590)); + avl = remove_int(avl, 649); + avl = remove_int(avl, 913); + avl = remove_int(avl, 1); + avl = remove_int(avl, 304); + avl = gpr_avl_add(avl, box(604), box(1595)); + avl = gpr_avl_add(avl, box(639), box(1596)); + avl = remove_int(avl, 431); + avl = gpr_avl_add(avl, box(993), box(1598)); + avl = remove_int(avl, 681); + avl = remove_int(avl, 927); + avl = gpr_avl_add(avl, box(87), box(1601)); + avl = gpr_avl_add(avl, box(91), box(1602)); + avl = remove_int(avl, 61); + avl = remove_int(avl, 14); + avl = remove_int(avl, 305); + avl = remove_int(avl, 304); + avl = remove_int(avl, 1016); + avl = gpr_avl_add(avl, box(903), box(1608)); + avl = gpr_avl_add(avl, box(951), box(1609)); + avl = gpr_avl_add(avl, box(146), box(1610)); + avl = gpr_avl_add(avl, box(482), box(1611)); + avl = gpr_avl_add(avl, box(71), box(1612)); + avl = remove_int(avl, 246); + avl = remove_int(avl, 696); + avl = gpr_avl_add(avl, box(636), box(1615)); + avl = gpr_avl_add(avl, box(295), box(1616)); + avl = remove_int(avl, 11); + avl = remove_int(avl, 231); + avl = gpr_avl_add(avl, box(905), box(1619)); + avl = gpr_avl_add(avl, box(993), box(1620)); + avl = gpr_avl_add(avl, box(433), box(1621)); + avl = gpr_avl_add(avl, box(117), box(1622)); + avl = gpr_avl_add(avl, box(467), box(1623)); + avl = remove_int(avl, 419); + avl = gpr_avl_add(avl, box(179), box(1625)); + avl = remove_int(avl, 926); + avl = remove_int(avl, 326); + avl = gpr_avl_add(avl, box(551), box(1628)); + avl = remove_int(avl, 14); + avl = remove_int(avl, 476); + avl = remove_int(avl, 823); + avl = gpr_avl_add(avl, box(350), box(1632)); + avl = gpr_avl_add(avl, box(133), box(1633)); + avl = remove_int(avl, 906); + avl = gpr_avl_add(avl, box(827), box(1635)); + avl = gpr_avl_add(avl, box(201), box(1636)); + avl = remove_int(avl, 124); + avl = remove_int(avl, 662); + avl = gpr_avl_add(avl, box(314), box(1639)); + avl = gpr_avl_add(avl, box(986), box(1640)); + avl = gpr_avl_add(avl, box(622), box(1641)); + avl = remove_int(avl, 130); + avl = gpr_avl_add(avl, box(861), box(1643)); + avl = remove_int(avl, 497); + avl = remove_int(avl, 905); + avl = gpr_avl_add(avl, box(502), box(1646)); + avl = remove_int(avl, 721); + avl = gpr_avl_add(avl, box(514), box(1648)); + avl = gpr_avl_add(avl, box(410), box(1649)); + avl = remove_int(avl, 869); + avl = remove_int(avl, 247); + avl = gpr_avl_add(avl, box(450), box(1652)); + avl = remove_int(avl, 364); + avl = gpr_avl_add(avl, box(963), box(1654)); + avl = gpr_avl_add(avl, box(146), box(1655)); + avl = remove_int(avl, 147); + avl = remove_int(avl, 789); + avl = gpr_avl_add(avl, box(693), box(1658)); + avl = gpr_avl_add(avl, box(959), box(1659)); + avl = remove_int(avl, 478); + avl = gpr_avl_add(avl, box(116), box(1661)); + avl = gpr_avl_add(avl, box(520), box(1662)); + avl = gpr_avl_add(avl, box(809), box(1663)); + avl = gpr_avl_add(avl, box(667), box(1664)); + avl = gpr_avl_add(avl, box(406), box(1665)); + avl = remove_int(avl, 409); + avl = gpr_avl_add(avl, box(558), box(1667)); + avl = gpr_avl_add(avl, box(0), box(1668)); + avl = gpr_avl_add(avl, box(948), box(1669)); + avl = gpr_avl_add(avl, box(576), box(1670)); + avl = remove_int(avl, 864); + avl = remove_int(avl, 840); + avl = remove_int(avl, 1001); + avl = gpr_avl_add(avl, box(232), box(1674)); + avl = remove_int(avl, 676); + avl = remove_int(avl, 752); + avl = remove_int(avl, 667); + avl = remove_int(avl, 605); + avl = gpr_avl_add(avl, box(258), box(1679)); + avl = gpr_avl_add(avl, box(648), box(1680)); + avl = gpr_avl_add(avl, box(761), box(1681)); + avl = remove_int(avl, 293); + avl = remove_int(avl, 893); + avl = gpr_avl_add(avl, box(194), box(1684)); + avl = remove_int(avl, 233); + avl = gpr_avl_add(avl, box(888), box(1686)); + avl = remove_int(avl, 470); + avl = remove_int(avl, 703); + avl = remove_int(avl, 190); + avl = remove_int(avl, 359); + avl = gpr_avl_add(avl, box(621), box(1691)); + avl = remove_int(avl, 634); + avl = remove_int(avl, 335); + avl = gpr_avl_add(avl, box(718), box(1694)); + avl = gpr_avl_add(avl, box(463), box(1695)); + avl = gpr_avl_add(avl, box(233), box(1696)); + avl = remove_int(avl, 376); + avl = remove_int(avl, 496); + avl = remove_int(avl, 819); + avl = remove_int(avl, 38); + avl = remove_int(avl, 436); + avl = remove_int(avl, 102); + avl = gpr_avl_add(avl, box(607), box(1703)); + avl = remove_int(avl, 329); + avl = gpr_avl_add(avl, box(716), box(1705)); + avl = remove_int(avl, 639); + avl = remove_int(avl, 775); + avl = remove_int(avl, 578); + avl = remove_int(avl, 464); + avl = remove_int(avl, 679); + avl = remove_int(avl, 615); + avl = remove_int(avl, 104); + avl = gpr_avl_add(avl, box(414), box(1713)); + avl = gpr_avl_add(avl, box(212), box(1714)); + avl = gpr_avl_add(avl, box(266), box(1715)); + avl = gpr_avl_add(avl, box(238), box(1716)); + avl = remove_int(avl, 153); + avl = gpr_avl_add(avl, box(585), box(1718)); + avl = remove_int(avl, 121); + avl = gpr_avl_add(avl, box(534), box(1720)); + avl = remove_int(avl, 579); + avl = gpr_avl_add(avl, box(127), box(1722)); + avl = gpr_avl_add(avl, box(399), box(1723)); + avl = remove_int(avl, 417); + avl = gpr_avl_add(avl, box(978), box(1725)); + avl = gpr_avl_add(avl, box(768), box(1726)); + avl = remove_int(avl, 985); + avl = gpr_avl_add(avl, box(536), box(1728)); + avl = gpr_avl_add(avl, box(449), box(1729)); + avl = gpr_avl_add(avl, box(586), box(1730)); + avl = remove_int(avl, 998); + avl = remove_int(avl, 394); + avl = remove_int(avl, 141); + avl = gpr_avl_add(avl, box(889), box(1734)); + avl = gpr_avl_add(avl, box(871), box(1735)); + avl = gpr_avl_add(avl, box(76), box(1736)); + avl = gpr_avl_add(avl, box(549), box(1737)); + avl = gpr_avl_add(avl, box(757), box(1738)); + avl = remove_int(avl, 908); + avl = gpr_avl_add(avl, box(789), box(1740)); + avl = remove_int(avl, 224); + avl = gpr_avl_add(avl, box(407), box(1742)); + avl = gpr_avl_add(avl, box(381), box(1743)); + avl = gpr_avl_add(avl, box(561), box(1744)); + avl = gpr_avl_add(avl, box(667), box(1745)); + avl = gpr_avl_add(avl, box(522), box(1746)); + avl = gpr_avl_add(avl, box(948), box(1747)); + avl = remove_int(avl, 770); + avl = gpr_avl_add(avl, box(872), box(1749)); + avl = gpr_avl_add(avl, box(327), box(1750)); + avl = remove_int(avl, 10); + avl = gpr_avl_add(avl, box(122), box(1752)); + avl = remove_int(avl, 606); + avl = gpr_avl_add(avl, box(485), box(1754)); + avl = remove_int(avl, 6); + avl = gpr_avl_add(avl, box(329), box(1756)); + avl = gpr_avl_add(avl, box(783), box(1757)); + avl = remove_int(avl, 416); + avl = gpr_avl_add(avl, box(656), box(1759)); + avl = gpr_avl_add(avl, box(971), box(1760)); + avl = gpr_avl_add(avl, box(77), box(1761)); + avl = gpr_avl_add(avl, box(942), box(1762)); + avl = remove_int(avl, 361); + avl = gpr_avl_add(avl, box(66), box(1764)); + avl = gpr_avl_add(avl, box(299), box(1765)); + avl = gpr_avl_add(avl, box(929), box(1766)); + avl = gpr_avl_add(avl, box(797), box(1767)); + avl = remove_int(avl, 869); + avl = remove_int(avl, 907); + avl = gpr_avl_add(avl, box(870), box(1770)); + avl = remove_int(avl, 580); + avl = remove_int(avl, 120); + avl = gpr_avl_add(avl, box(913), box(1773)); + avl = remove_int(avl, 480); + avl = gpr_avl_add(avl, box(489), box(1775)); + avl = remove_int(avl, 845); + avl = gpr_avl_add(avl, box(896), box(1777)); + avl = remove_int(avl, 567); + avl = remove_int(avl, 427); + avl = gpr_avl_add(avl, box(443), box(1780)); + avl = gpr_avl_add(avl, box(3), box(1781)); + avl = remove_int(avl, 12); + avl = gpr_avl_add(avl, box(376), box(1783)); + avl = gpr_avl_add(avl, box(155), box(1784)); + avl = gpr_avl_add(avl, box(188), box(1785)); + avl = gpr_avl_add(avl, box(149), box(1786)); + avl = gpr_avl_add(avl, box(178), box(1787)); + avl = remove_int(avl, 84); + avl = gpr_avl_add(avl, box(805), box(1789)); + avl = gpr_avl_add(avl, box(612), box(1790)); + avl = remove_int(avl, 991); + avl = gpr_avl_add(avl, box(837), box(1792)); + avl = remove_int(avl, 173); + avl = remove_int(avl, 72); + avl = gpr_avl_add(avl, box(1014), box(1795)); + avl = remove_int(avl, 303); + avl = gpr_avl_add(avl, box(865), box(1797)); + avl = gpr_avl_add(avl, box(793), box(1798)); + avl = remove_int(avl, 173); + avl = remove_int(avl, 477); + avl = gpr_avl_add(avl, box(950), box(1801)); + avl = gpr_avl_add(avl, box(105), box(1802)); + avl = gpr_avl_add(avl, box(895), box(1803)); + avl = gpr_avl_add(avl, box(171), box(1804)); + avl = gpr_avl_add(avl, box(753), box(1805)); + avl = gpr_avl_add(avl, box(946), box(1806)); + avl = remove_int(avl, 194); + avl = remove_int(avl, 559); + avl = remove_int(avl, 116); + avl = gpr_avl_add(avl, box(968), box(1810)); + avl = remove_int(avl, 124); + avl = remove_int(avl, 99); + avl = gpr_avl_add(avl, box(563), box(1813)); + avl = remove_int(avl, 182); + avl = gpr_avl_add(avl, box(816), box(1815)); + avl = remove_int(avl, 73); + avl = remove_int(avl, 261); + avl = gpr_avl_add(avl, box(847), box(1818)); + avl = gpr_avl_add(avl, box(368), box(1819)); + avl = gpr_avl_add(avl, box(808), box(1820)); + avl = gpr_avl_add(avl, box(779), box(1821)); + avl = remove_int(avl, 818); + avl = gpr_avl_add(avl, box(466), box(1823)); + avl = remove_int(avl, 316); + avl = gpr_avl_add(avl, box(986), box(1825)); + avl = gpr_avl_add(avl, box(688), box(1826)); + avl = gpr_avl_add(avl, box(509), box(1827)); + avl = gpr_avl_add(avl, box(51), box(1828)); + avl = remove_int(avl, 655); + avl = remove_int(avl, 785); + avl = remove_int(avl, 893); + avl = gpr_avl_add(avl, box(167), box(1832)); + avl = remove_int(avl, 13); + avl = remove_int(avl, 263); + avl = gpr_avl_add(avl, box(1009), box(1835)); + avl = remove_int(avl, 480); + avl = remove_int(avl, 778); + avl = remove_int(avl, 713); + avl = remove_int(avl, 628); + avl = gpr_avl_add(avl, box(803), box(1840)); + avl = remove_int(avl, 267); + avl = gpr_avl_add(avl, box(676), box(1842)); + avl = gpr_avl_add(avl, box(231), box(1843)); + avl = gpr_avl_add(avl, box(824), box(1844)); + avl = remove_int(avl, 961); + avl = gpr_avl_add(avl, box(311), box(1846)); + avl = gpr_avl_add(avl, box(420), box(1847)); + avl = gpr_avl_add(avl, box(960), box(1848)); + avl = gpr_avl_add(avl, box(468), box(1849)); + avl = gpr_avl_add(avl, box(815), box(1850)); + avl = remove_int(avl, 247); + avl = remove_int(avl, 194); + avl = gpr_avl_add(avl, box(546), box(1853)); + avl = remove_int(avl, 222); + avl = remove_int(avl, 914); + avl = remove_int(avl, 741); + avl = gpr_avl_add(avl, box(470), box(1857)); + avl = gpr_avl_add(avl, box(933), box(1858)); + avl = gpr_avl_add(avl, box(97), box(1859)); + avl = remove_int(avl, 564); + avl = remove_int(avl, 295); + avl = gpr_avl_add(avl, box(864), box(1862)); + avl = remove_int(avl, 329); + avl = gpr_avl_add(avl, box(124), box(1864)); + avl = gpr_avl_add(avl, box(1000), box(1865)); + avl = gpr_avl_add(avl, box(228), box(1866)); + avl = gpr_avl_add(avl, box(187), box(1867)); + avl = remove_int(avl, 224); + avl = remove_int(avl, 306); + avl = remove_int(avl, 884); + avl = gpr_avl_add(avl, box(449), box(1871)); + avl = gpr_avl_add(avl, box(353), box(1872)); + avl = gpr_avl_add(avl, box(994), box(1873)); + avl = gpr_avl_add(avl, box(596), box(1874)); + avl = gpr_avl_add(avl, box(996), box(1875)); + avl = gpr_avl_add(avl, box(101), box(1876)); + avl = gpr_avl_add(avl, box(1012), box(1877)); + avl = gpr_avl_add(avl, box(982), box(1878)); + avl = gpr_avl_add(avl, box(742), box(1879)); + avl = remove_int(avl, 92); + avl = remove_int(avl, 1022); + avl = gpr_avl_add(avl, box(941), box(1882)); + avl = remove_int(avl, 742); + avl = remove_int(avl, 919); + avl = gpr_avl_add(avl, box(588), box(1885)); + avl = remove_int(avl, 221); + avl = gpr_avl_add(avl, box(356), box(1887)); + avl = gpr_avl_add(avl, box(932), box(1888)); + avl = remove_int(avl, 837); + avl = gpr_avl_add(avl, box(394), box(1890)); + avl = gpr_avl_add(avl, box(642), box(1891)); + avl = gpr_avl_add(avl, box(52), box(1892)); + avl = gpr_avl_add(avl, box(437), box(1893)); + avl = gpr_avl_add(avl, box(948), box(1894)); + avl = gpr_avl_add(avl, box(93), box(1895)); + avl = remove_int(avl, 873); + avl = remove_int(avl, 336); + avl = remove_int(avl, 277); + avl = remove_int(avl, 932); + avl = gpr_avl_add(avl, box(80), box(1900)); + avl = gpr_avl_add(avl, box(952), box(1901)); + avl = gpr_avl_add(avl, box(510), box(1902)); + avl = remove_int(avl, 876); + avl = remove_int(avl, 612); + avl = gpr_avl_add(avl, box(923), box(1905)); + avl = gpr_avl_add(avl, box(475), box(1906)); + avl = remove_int(avl, 478); + avl = remove_int(avl, 148); + avl = gpr_avl_add(avl, box(538), box(1909)); + avl = remove_int(avl, 47); + avl = gpr_avl_add(avl, box(89), box(1911)); + avl = remove_int(avl, 723); + avl = gpr_avl_add(avl, box(687), box(1913)); + avl = gpr_avl_add(avl, box(480), box(1914)); + avl = gpr_avl_add(avl, box(149), box(1915)); + avl = remove_int(avl, 68); + avl = remove_int(avl, 862); + avl = remove_int(avl, 363); + avl = gpr_avl_add(avl, box(996), box(1919)); + avl = remove_int(avl, 380); + avl = gpr_avl_add(avl, box(957), box(1921)); + avl = remove_int(avl, 413); + avl = gpr_avl_add(avl, box(360), box(1923)); + avl = gpr_avl_add(avl, box(304), box(1924)); + avl = gpr_avl_add(avl, box(634), box(1925)); + avl = gpr_avl_add(avl, box(506), box(1926)); + avl = remove_int(avl, 248); + avl = gpr_avl_add(avl, box(124), box(1928)); + avl = gpr_avl_add(avl, box(181), box(1929)); + avl = remove_int(avl, 507); + avl = gpr_avl_add(avl, box(141), box(1931)); + avl = remove_int(avl, 409); + avl = remove_int(avl, 129); + avl = remove_int(avl, 694); + avl = remove_int(avl, 723); + avl = gpr_avl_add(avl, box(998), box(1936)); + avl = gpr_avl_add(avl, box(906), box(1937)); + avl = gpr_avl_add(avl, box(44), box(1938)); + avl = remove_int(avl, 949); + avl = remove_int(avl, 117); + avl = gpr_avl_add(avl, box(700), box(1941)); + avl = gpr_avl_add(avl, box(258), box(1942)); + avl = remove_int(avl, 828); + avl = gpr_avl_add(avl, box(860), box(1944)); + avl = gpr_avl_add(avl, box(987), box(1945)); + avl = gpr_avl_add(avl, box(316), box(1946)); + avl = gpr_avl_add(avl, box(919), box(1947)); + avl = remove_int(avl, 84); + avl = gpr_avl_add(avl, box(473), box(1949)); + avl = remove_int(avl, 127); + avl = remove_int(avl, 829); + avl = remove_int(avl, 829); + avl = gpr_avl_add(avl, box(488), box(1953)); + avl = gpr_avl_add(avl, box(954), box(1954)); + avl = remove_int(avl, 198); + avl = remove_int(avl, 972); + avl = remove_int(avl, 670); + avl = gpr_avl_add(avl, box(822), box(1958)); + avl = remove_int(avl, 589); + avl = remove_int(avl, 459); + avl = gpr_avl_add(avl, box(1003), box(1961)); + avl = gpr_avl_add(avl, box(657), box(1962)); + avl = gpr_avl_add(avl, box(477), box(1963)); + avl = gpr_avl_add(avl, box(923), box(1964)); + avl = remove_int(avl, 496); + avl = remove_int(avl, 99); + avl = gpr_avl_add(avl, box(127), box(1967)); + avl = gpr_avl_add(avl, box(1013), box(1968)); + avl = gpr_avl_add(avl, box(778), box(1969)); + avl = remove_int(avl, 5); + avl = remove_int(avl, 990); + avl = remove_int(avl, 850); + avl = remove_int(avl, 160); + avl = remove_int(avl, 86); + avl = gpr_avl_add(avl, box(283), box(1975)); + avl = remove_int(avl, 278); + avl = remove_int(avl, 297); + avl = remove_int(avl, 137); + avl = remove_int(avl, 653); + avl = gpr_avl_add(avl, box(702), box(1980)); + avl = remove_int(avl, 63); + avl = remove_int(avl, 427); + avl = remove_int(avl, 706); + avl = remove_int(avl, 806); + avl = gpr_avl_add(avl, box(335), box(1985)); + avl = gpr_avl_add(avl, box(412), box(1986)); + avl = remove_int(avl, 766); + avl = remove_int(avl, 937); + avl = remove_int(avl, 886); + avl = remove_int(avl, 652); + avl = gpr_avl_add(avl, box(545), box(1991)); + avl = gpr_avl_add(avl, box(408), box(1992)); + avl = gpr_avl_add(avl, box(841), box(1993)); + avl = remove_int(avl, 593); + avl = gpr_avl_add(avl, box(582), box(1995)); + avl = gpr_avl_add(avl, box(597), box(1996)); + avl = remove_int(avl, 49); + avl = remove_int(avl, 835); + avl = gpr_avl_add(avl, box(417), box(1999)); + avl = gpr_avl_add(avl, box(191), box(2000)); + avl = remove_int(avl, 406); + avl = gpr_avl_add(avl, box(30), box(2002)); + avl = remove_int(avl, 841); + avl = remove_int(avl, 50); + avl = gpr_avl_add(avl, box(967), box(2005)); + avl = gpr_avl_add(avl, box(849), box(2006)); + avl = remove_int(avl, 608); + avl = gpr_avl_add(avl, box(306), box(2008)); + avl = remove_int(avl, 779); + avl = gpr_avl_add(avl, box(897), box(2010)); + avl = gpr_avl_add(avl, box(147), box(2011)); + avl = remove_int(avl, 982); + avl = gpr_avl_add(avl, box(470), box(2013)); + avl = remove_int(avl, 951); + avl = gpr_avl_add(avl, box(388), box(2015)); + avl = remove_int(avl, 616); + avl = remove_int(avl, 721); + avl = remove_int(avl, 942); + avl = remove_int(avl, 589); + avl = gpr_avl_add(avl, box(218), box(2020)); + avl = remove_int(avl, 671); + avl = gpr_avl_add(avl, box(1020), box(2022)); + avl = remove_int(avl, 277); + avl = gpr_avl_add(avl, box(681), box(2024)); + avl = gpr_avl_add(avl, box(179), box(2025)); + avl = gpr_avl_add(avl, box(370), box(2026)); + avl = gpr_avl_add(avl, box(0), box(2027)); + avl = remove_int(avl, 523); + avl = gpr_avl_add(avl, box(99), box(2029)); + avl = gpr_avl_add(avl, box(334), box(2030)); + avl = gpr_avl_add(avl, box(569), box(2031)); + avl = gpr_avl_add(avl, box(257), box(2032)); + avl = remove_int(avl, 572); + avl = gpr_avl_add(avl, box(805), box(2034)); + avl = gpr_avl_add(avl, box(143), box(2035)); + avl = gpr_avl_add(avl, box(670), box(2036)); + avl = remove_int(avl, 42); + avl = gpr_avl_add(avl, box(46), box(2038)); + avl = remove_int(avl, 970); + avl = gpr_avl_add(avl, box(353), box(2040)); + avl = remove_int(avl, 258); + avl = gpr_avl_add(avl, box(451), box(2042)); + avl = gpr_avl_add(avl, box(28), box(2043)); + avl = gpr_avl_add(avl, box(729), box(2044)); + avl = gpr_avl_add(avl, box(401), box(2045)); + avl = gpr_avl_add(avl, box(614), box(2046)); + avl = remove_int(avl, 990); + avl = remove_int(avl, 212); + avl = remove_int(avl, 22); + avl = remove_int(avl, 677); + avl = gpr_avl_add(avl, box(1016), box(2051)); + avl = gpr_avl_add(avl, box(980), box(2052)); + avl = gpr_avl_add(avl, box(990), box(2053)); + avl = gpr_avl_add(avl, box(355), box(2054)); + avl = remove_int(avl, 730); + avl = remove_int(avl, 37); + avl = gpr_avl_add(avl, box(407), box(2057)); + avl = gpr_avl_add(avl, box(222), box(2058)); + avl = gpr_avl_add(avl, box(439), box(2059)); + avl = gpr_avl_add(avl, box(563), box(2060)); + avl = remove_int(avl, 992); + avl = remove_int(avl, 786); + avl = gpr_avl_add(avl, box(1), box(2063)); + avl = gpr_avl_add(avl, box(473), box(2064)); + avl = gpr_avl_add(avl, box(992), box(2065)); + avl = remove_int(avl, 190); + avl = remove_int(avl, 450); + avl = remove_int(avl, 1020); + avl = remove_int(avl, 149); + avl = gpr_avl_add(avl, box(329), box(2070)); + avl = gpr_avl_add(avl, box(35), box(2071)); + avl = remove_int(avl, 843); + avl = gpr_avl_add(avl, box(855), box(2073)); + avl = remove_int(avl, 878); + avl = gpr_avl_add(avl, box(993), box(2075)); + avl = gpr_avl_add(avl, box(87), box(2076)); + avl = gpr_avl_add(avl, box(572), box(2077)); + avl = remove_int(avl, 896); + avl = gpr_avl_add(avl, box(849), box(2079)); + avl = remove_int(avl, 597); + avl = gpr_avl_add(avl, box(472), box(2081)); + avl = remove_int(avl, 778); + avl = remove_int(avl, 934); + avl = remove_int(avl, 314); + avl = gpr_avl_add(avl, box(101), box(2085)); + avl = remove_int(avl, 938); + avl = remove_int(avl, 1010); + avl = gpr_avl_add(avl, box(579), box(2088)); + avl = remove_int(avl, 798); + avl = remove_int(avl, 88); + avl = gpr_avl_add(avl, box(851), box(2091)); + avl = remove_int(avl, 705); + avl = gpr_avl_add(avl, box(26), box(2093)); + avl = remove_int(avl, 973); + avl = gpr_avl_add(avl, box(923), box(2095)); + avl = remove_int(avl, 668); + avl = gpr_avl_add(avl, box(310), box(2097)); + avl = gpr_avl_add(avl, box(269), box(2098)); + avl = remove_int(avl, 173); + avl = gpr_avl_add(avl, box(279), box(2100)); + avl = remove_int(avl, 203); + avl = gpr_avl_add(avl, box(411), box(2102)); + avl = remove_int(avl, 950); + avl = gpr_avl_add(avl, box(6), box(2104)); + avl = remove_int(avl, 400); + avl = remove_int(avl, 468); + avl = remove_int(avl, 271); + avl = gpr_avl_add(avl, box(627), box(2108)); + avl = remove_int(avl, 727); + avl = remove_int(avl, 148); + avl = remove_int(avl, 98); + avl = remove_int(avl, 997); + avl = remove_int(avl, 215); + avl = remove_int(avl, 628); + avl = remove_int(avl, 826); + avl = remove_int(avl, 664); + avl = gpr_avl_add(avl, box(76), box(2117)); + avl = remove_int(avl, 194); + avl = remove_int(avl, 18); + avl = gpr_avl_add(avl, box(727), box(2120)); + avl = remove_int(avl, 295); + avl = gpr_avl_add(avl, box(645), box(2122)); + avl = remove_int(avl, 321); + avl = remove_int(avl, 863); + avl = gpr_avl_add(avl, box(824), box(2125)); + avl = gpr_avl_add(avl, box(651), box(2126)); + avl = gpr_avl_add(avl, box(804), box(2127)); + avl = remove_int(avl, 307); + avl = gpr_avl_add(avl, box(867), box(2129)); + avl = remove_int(avl, 384); + avl = gpr_avl_add(avl, box(819), box(2131)); + avl = remove_int(avl, 674); + avl = gpr_avl_add(avl, box(76), box(2133)); + avl = remove_int(avl, 898); + avl = gpr_avl_add(avl, box(45), box(2135)); + avl = gpr_avl_add(avl, box(512), box(2136)); + avl = remove_int(avl, 773); + avl = remove_int(avl, 907); + avl = remove_int(avl, 382); + avl = remove_int(avl, 95); + avl = remove_int(avl, 734); + avl = remove_int(avl, 81); + avl = gpr_avl_add(avl, box(348), box(2143)); + avl = remove_int(avl, 509); + avl = remove_int(avl, 301); + avl = gpr_avl_add(avl, box(861), box(2146)); + avl = gpr_avl_add(avl, box(918), box(2147)); + avl = remove_int(avl, 992); + avl = gpr_avl_add(avl, box(356), box(2149)); + avl = remove_int(avl, 64); + avl = remove_int(avl, 444); + avl = remove_int(avl, 741); + avl = gpr_avl_add(avl, box(710), box(2153)); + avl = gpr_avl_add(avl, box(264), box(2154)); + avl = remove_int(avl, 347); + avl = remove_int(avl, 250); + avl = gpr_avl_add(avl, box(82), box(2157)); + avl = gpr_avl_add(avl, box(571), box(2158)); + avl = remove_int(avl, 721); + avl = remove_int(avl, 622); + avl = gpr_avl_add(avl, box(950), box(2161)); + avl = gpr_avl_add(avl, box(94), box(2162)); + avl = remove_int(avl, 970); + avl = gpr_avl_add(avl, box(815), box(2164)); + avl = remove_int(avl, 930); + avl = remove_int(avl, 703); + avl = gpr_avl_add(avl, box(432), box(2167)); + avl = remove_int(avl, 544); + avl = gpr_avl_add(avl, box(21), box(2169)); + avl = gpr_avl_add(avl, box(186), box(2170)); + avl = remove_int(avl, 143); + avl = gpr_avl_add(avl, box(425), box(2172)); + avl = remove_int(avl, 769); + avl = gpr_avl_add(avl, box(656), box(2174)); + avl = remove_int(avl, 29); + avl = gpr_avl_add(avl, box(464), box(2176)); + avl = remove_int(avl, 713); + avl = gpr_avl_add(avl, box(800), box(2178)); + avl = remove_int(avl, 621); + avl = gpr_avl_add(avl, box(962), box(2180)); + avl = remove_int(avl, 448); + avl = gpr_avl_add(avl, box(878), box(2182)); + avl = remove_int(avl, 39); + avl = remove_int(avl, 999); + avl = gpr_avl_add(avl, box(182), box(2185)); + avl = gpr_avl_add(avl, box(429), box(2186)); + avl = gpr_avl_add(avl, box(598), box(2187)); + avl = remove_int(avl, 551); + avl = gpr_avl_add(avl, box(827), box(2189)); + avl = gpr_avl_add(avl, box(809), box(2190)); + avl = remove_int(avl, 438); + avl = remove_int(avl, 811); + avl = gpr_avl_add(avl, box(808), box(2193)); + avl = gpr_avl_add(avl, box(788), box(2194)); + avl = remove_int(avl, 156); + avl = gpr_avl_add(avl, box(933), box(2196)); + avl = gpr_avl_add(avl, box(344), box(2197)); + avl = remove_int(avl, 460); + avl = gpr_avl_add(avl, box(161), box(2199)); + avl = gpr_avl_add(avl, box(444), box(2200)); + avl = remove_int(avl, 597); + avl = remove_int(avl, 668); + avl = gpr_avl_add(avl, box(703), box(2203)); + avl = remove_int(avl, 515); + avl = gpr_avl_add(avl, box(380), box(2205)); + avl = gpr_avl_add(avl, box(338), box(2206)); + avl = remove_int(avl, 550); + avl = remove_int(avl, 946); + avl = remove_int(avl, 714); + avl = remove_int(avl, 739); + avl = gpr_avl_add(avl, box(413), box(2211)); + avl = remove_int(avl, 450); + avl = gpr_avl_add(avl, box(411), box(2213)); + avl = gpr_avl_add(avl, box(117), box(2214)); + avl = gpr_avl_add(avl, box(322), box(2215)); + avl = gpr_avl_add(avl, box(915), box(2216)); + avl = gpr_avl_add(avl, box(410), box(2217)); + avl = gpr_avl_add(avl, box(66), box(2218)); + avl = remove_int(avl, 756); + avl = remove_int(avl, 596); + avl = gpr_avl_add(avl, box(882), box(2221)); + avl = gpr_avl_add(avl, box(930), box(2222)); + avl = gpr_avl_add(avl, box(36), box(2223)); + avl = remove_int(avl, 742); + avl = gpr_avl_add(avl, box(539), box(2225)); + avl = gpr_avl_add(avl, box(596), box(2226)); + avl = remove_int(avl, 82); + avl = remove_int(avl, 686); + avl = remove_int(avl, 933); + avl = remove_int(avl, 42); + avl = remove_int(avl, 340); + avl = gpr_avl_add(avl, box(126), box(2232)); + avl = gpr_avl_add(avl, box(493), box(2233)); + avl = gpr_avl_add(avl, box(839), box(2234)); + avl = remove_int(avl, 774); + avl = gpr_avl_add(avl, box(337), box(2236)); + avl = remove_int(avl, 322); + avl = gpr_avl_add(avl, box(16), box(2238)); + avl = remove_int(avl, 73); + avl = remove_int(avl, 85); + avl = remove_int(avl, 191); + avl = remove_int(avl, 541); + avl = gpr_avl_add(avl, box(704), box(2243)); + avl = remove_int(avl, 767); + avl = remove_int(avl, 1006); + avl = remove_int(avl, 844); + avl = remove_int(avl, 742); + avl = gpr_avl_add(avl, box(48), box(2248)); + avl = gpr_avl_add(avl, box(138), box(2249)); + avl = gpr_avl_add(avl, box(437), box(2250)); + avl = gpr_avl_add(avl, box(275), box(2251)); + avl = remove_int(avl, 520); + avl = gpr_avl_add(avl, box(1019), box(2253)); + avl = remove_int(avl, 955); + avl = gpr_avl_add(avl, box(270), box(2255)); + avl = remove_int(avl, 680); + avl = remove_int(avl, 698); + avl = gpr_avl_add(avl, box(735), box(2258)); + avl = gpr_avl_add(avl, box(400), box(2259)); + avl = remove_int(avl, 991); + avl = gpr_avl_add(avl, box(263), box(2261)); + avl = remove_int(avl, 704); + avl = gpr_avl_add(avl, box(757), box(2263)); + avl = remove_int(avl, 194); + avl = remove_int(avl, 616); + avl = remove_int(avl, 784); + avl = gpr_avl_add(avl, box(382), box(2267)); + avl = gpr_avl_add(avl, box(464), box(2268)); + avl = gpr_avl_add(avl, box(817), box(2269)); + avl = remove_int(avl, 445); + avl = gpr_avl_add(avl, box(412), box(2271)); + avl = remove_int(avl, 525); + avl = gpr_avl_add(avl, box(299), box(2273)); + avl = gpr_avl_add(avl, box(464), box(2274)); + avl = gpr_avl_add(avl, box(715), box(2275)); + avl = remove_int(avl, 58); + avl = remove_int(avl, 218); + avl = gpr_avl_add(avl, box(961), box(2278)); + avl = gpr_avl_add(avl, box(491), box(2279)); + avl = remove_int(avl, 846); + avl = gpr_avl_add(avl, box(762), box(2281)); + avl = remove_int(avl, 974); + avl = remove_int(avl, 887); + avl = gpr_avl_add(avl, box(498), box(2284)); + avl = remove_int(avl, 810); + avl = remove_int(avl, 743); + avl = remove_int(avl, 22); + avl = remove_int(avl, 284); + avl = gpr_avl_add(avl, box(482), box(2289)); + avl = gpr_avl_add(avl, box(1021), box(2290)); + avl = remove_int(avl, 155); + avl = remove_int(avl, 128); + avl = gpr_avl_add(avl, box(819), box(2293)); + avl = gpr_avl_add(avl, box(324), box(2294)); + avl = remove_int(avl, 196); + avl = remove_int(avl, 370); + avl = remove_int(avl, 753); + avl = remove_int(avl, 56); + avl = remove_int(avl, 735); + avl = gpr_avl_add(avl, box(272), box(2300)); + avl = gpr_avl_add(avl, box(474), box(2301)); + avl = gpr_avl_add(avl, box(719), box(2302)); + avl = gpr_avl_add(avl, box(236), box(2303)); + avl = remove_int(avl, 818); + avl = gpr_avl_add(avl, box(727), box(2305)); + avl = remove_int(avl, 892); + avl = remove_int(avl, 871); + avl = remove_int(avl, 231); + avl = gpr_avl_add(avl, box(62), box(2309)); + avl = gpr_avl_add(avl, box(953), box(2310)); + avl = remove_int(avl, 701); + avl = gpr_avl_add(avl, box(193), box(2312)); + avl = remove_int(avl, 619); + avl = remove_int(avl, 22); + avl = remove_int(avl, 804); + avl = remove_int(avl, 851); + avl = gpr_avl_add(avl, box(286), box(2317)); + avl = gpr_avl_add(avl, box(751), box(2318)); + avl = remove_int(avl, 525); + avl = gpr_avl_add(avl, box(217), box(2320)); + avl = remove_int(avl, 336); + avl = gpr_avl_add(avl, box(86), box(2322)); + avl = gpr_avl_add(avl, box(81), box(2323)); + avl = gpr_avl_add(avl, box(850), box(2324)); + avl = remove_int(avl, 872); + avl = gpr_avl_add(avl, box(402), box(2326)); + avl = gpr_avl_add(avl, box(54), box(2327)); + avl = gpr_avl_add(avl, box(980), box(2328)); + avl = gpr_avl_add(avl, box(845), box(2329)); + avl = remove_int(avl, 1004); + avl = remove_int(avl, 273); + avl = remove_int(avl, 879); + avl = gpr_avl_add(avl, box(354), box(2333)); + avl = gpr_avl_add(avl, box(58), box(2334)); + avl = gpr_avl_add(avl, box(127), box(2335)); + avl = remove_int(avl, 84); + avl = gpr_avl_add(avl, box(360), box(2337)); + avl = remove_int(avl, 648); + avl = remove_int(avl, 488); + avl = remove_int(avl, 585); + avl = remove_int(avl, 230); + avl = gpr_avl_add(avl, box(887), box(2342)); + avl = remove_int(avl, 558); + avl = remove_int(avl, 958); + avl = gpr_avl_add(avl, box(822), box(2345)); + avl = remove_int(avl, 1004); + avl = remove_int(avl, 747); + avl = gpr_avl_add(avl, box(631), box(2348)); + avl = gpr_avl_add(avl, box(442), box(2349)); + avl = remove_int(avl, 957); + avl = remove_int(avl, 964); + avl = gpr_avl_add(avl, box(10), box(2352)); + avl = remove_int(avl, 189); + avl = gpr_avl_add(avl, box(742), box(2354)); + avl = remove_int(avl, 108); + avl = gpr_avl_add(avl, box(1014), box(2356)); + avl = remove_int(avl, 266); + avl = remove_int(avl, 623); + avl = remove_int(avl, 697); + avl = gpr_avl_add(avl, box(180), box(2360)); + avl = remove_int(avl, 472); + avl = gpr_avl_add(avl, box(567), box(2362)); + avl = remove_int(avl, 1020); + avl = remove_int(avl, 273); + avl = gpr_avl_add(avl, box(864), box(2365)); + avl = gpr_avl_add(avl, box(1009), box(2366)); + avl = remove_int(avl, 224); + avl = remove_int(avl, 81); + avl = gpr_avl_add(avl, box(653), box(2369)); + avl = remove_int(avl, 67); + avl = remove_int(avl, 102); + avl = remove_int(avl, 76); + avl = remove_int(avl, 935); + avl = remove_int(avl, 169); + avl = remove_int(avl, 232); + avl = remove_int(avl, 79); + avl = gpr_avl_add(avl, box(509), box(2377)); + avl = remove_int(avl, 900); + avl = remove_int(avl, 822); + avl = remove_int(avl, 945); + avl = remove_int(avl, 356); + avl = gpr_avl_add(avl, box(443), box(2382)); + avl = gpr_avl_add(avl, box(925), box(2383)); + avl = remove_int(avl, 994); + avl = remove_int(avl, 324); + avl = gpr_avl_add(avl, box(291), box(2386)); + avl = remove_int(avl, 94); + avl = remove_int(avl, 795); + avl = remove_int(avl, 42); + avl = gpr_avl_add(avl, box(613), box(2390)); + avl = remove_int(avl, 289); + avl = gpr_avl_add(avl, box(980), box(2392)); + avl = remove_int(avl, 316); + avl = gpr_avl_add(avl, box(281), box(2394)); + avl = gpr_avl_add(avl, box(1006), box(2395)); + avl = remove_int(avl, 776); + avl = gpr_avl_add(avl, box(108), box(2397)); + avl = gpr_avl_add(avl, box(918), box(2398)); + avl = remove_int(avl, 721); + avl = remove_int(avl, 563); + avl = gpr_avl_add(avl, box(925), box(2401)); + avl = remove_int(avl, 448); + avl = remove_int(avl, 198); + avl = remove_int(avl, 1); + avl = gpr_avl_add(avl, box(160), box(2405)); + avl = remove_int(avl, 515); + avl = gpr_avl_add(avl, box(284), box(2407)); + avl = gpr_avl_add(avl, box(225), box(2408)); + avl = remove_int(avl, 304); + avl = gpr_avl_add(avl, box(714), box(2410)); + avl = gpr_avl_add(avl, box(708), box(2411)); + avl = gpr_avl_add(avl, box(624), box(2412)); + avl = remove_int(avl, 662); + avl = remove_int(avl, 825); + avl = remove_int(avl, 383); + avl = remove_int(avl, 381); + avl = gpr_avl_add(avl, box(194), box(2417)); + avl = remove_int(avl, 280); + avl = remove_int(avl, 25); + avl = remove_int(avl, 633); + avl = gpr_avl_add(avl, box(897), box(2421)); + avl = remove_int(avl, 636); + avl = remove_int(avl, 596); + avl = remove_int(avl, 757); + avl = remove_int(avl, 343); + avl = remove_int(avl, 162); + avl = remove_int(avl, 913); + avl = remove_int(avl, 843); + avl = remove_int(avl, 280); + avl = remove_int(avl, 911); + avl = gpr_avl_add(avl, box(1008), box(2431)); + avl = remove_int(avl, 948); + avl = remove_int(avl, 74); + avl = remove_int(avl, 571); + avl = gpr_avl_add(avl, box(486), box(2435)); + avl = gpr_avl_add(avl, box(285), box(2436)); + avl = remove_int(avl, 304); + avl = remove_int(avl, 516); + avl = gpr_avl_add(avl, box(758), box(2439)); + avl = gpr_avl_add(avl, box(776), box(2440)); + avl = remove_int(avl, 696); + avl = gpr_avl_add(avl, box(104), box(2442)); + avl = gpr_avl_add(avl, box(700), box(2443)); + avl = gpr_avl_add(avl, box(114), box(2444)); + avl = gpr_avl_add(avl, box(567), box(2445)); + avl = remove_int(avl, 620); + avl = gpr_avl_add(avl, box(270), box(2447)); + avl = remove_int(avl, 730); + avl = gpr_avl_add(avl, box(749), box(2449)); + avl = gpr_avl_add(avl, box(443), box(2450)); + avl = remove_int(avl, 457); + avl = gpr_avl_add(avl, box(571), box(2452)); + avl = gpr_avl_add(avl, box(626), box(2453)); + avl = remove_int(avl, 638); + avl = remove_int(avl, 313); + + gpr_avl_unref(avl); +} + +static void test_stress(void) { + int added[1024]; + int i, j; + int deletions = 0; + gpr_avl avl; + + gpr_log(GPR_DEBUG, "test_stress"); + + srand((unsigned)time(NULL)); + avl = gpr_avl_create(&int_int_vtable); + + memset(added, 0, sizeof(added)); + + for (i = 1; deletions < 1000; i++) { + int idx = rand() % (int)GPR_ARRAY_SIZE(added); + GPR_ASSERT(i); + if (rand() < RAND_MAX / 2) { + added[idx] = i; + fprintf(stderr, "avl = gpr_avl_add(avl, box(%d), box(%d)); /* d=%d */\n", + idx, i, deletions); + avl = gpr_avl_add(avl, box(idx), box(i)); + } else { + deletions += (added[idx] != 0); + added[idx] = 0; + fprintf(stderr, "avl = remove_int(avl, %d); /* d=%d */\n", idx, + deletions); + avl = remove_int(avl, idx); + } + for (j = 0; j < (int)GPR_ARRAY_SIZE(added); j++) { + if (added[j] != 0) { + check_get(avl, j, added[j]); + } else { + check_negget(avl, j); + } + } + } } int main(int argc, char *argv[]) { @@ -169,6 +3659,11 @@ int main(int argc, char *argv[]) { test_rl(); test_unbalanced(); test_replace(); + test_remove(); + test_badcase1(); + test_badcase2(); + test_badcase3(); + test_stress(); return 0; } From 20d99c0c9637eb7107a0f2b543ba6c0690596a5f Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 23 Nov 2015 15:02:26 -0800 Subject: [PATCH 09/13] AVL: add documentation --- include/grpc/support/avl.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/include/grpc/support/avl.h b/include/grpc/support/avl.h index d80eafec577..5c222e6c29e 100644 --- a/include/grpc/support/avl.h +++ b/include/grpc/support/avl.h @@ -36,6 +36,7 @@ #include +/** internal node of an AVL tree */ typedef struct gpr_avl_node { gpr_refcount refs; void *key; @@ -46,23 +47,45 @@ typedef struct gpr_avl_node { } gpr_avl_node; typedef struct gpr_avl_vtable { + /** destroy a key */ void (*destroy_key)(void *key); + /** copy a key, returning new value */ void *(*copy_key)(void *key); + /** compare key1, key2; return <0 if key1 < key2, + >0 if key1 > key2, 0 if key1 == key2 */ long (*compare_keys)(void *key1, void *key2); + /** destroy a value */ void (*destroy_value)(void *value); + /** copy a value */ void *(*copy_value)(void *value); } gpr_avl_vtable; +/** "pointer" to an AVL tree - this is a reference + counted object - use gpr_avl_ref to add a reference, + gpr_avl_unref when done with a reference */ typedef struct gpr_avl { const gpr_avl_vtable *vtable; gpr_avl_node *root; } gpr_avl; +/** create an immutable AVL tree */ gpr_avl gpr_avl_create(const gpr_avl_vtable *vtable); +/** add a reference to an existing tree - returns + the tree as a convenience */ gpr_avl gpr_avl_ref(gpr_avl avl); +/** remove a reference to a tree - destroying it if there + are no references left */ void gpr_avl_unref(gpr_avl avl); +/** return a new tree with (key, value) added to avl. + implicitly unrefs avl to allow easy chaining. + if key exists in avl, the new tree's key entry updated + (i.e. a duplicate is not created) */ gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value); +/** return a new tree with key deleted */ gpr_avl gpr_avl_remove(gpr_avl avl, void *key); +/** lookup key, and return the associated value. + does not mutate avl. + returns NULL if key is not found. */ void *gpr_avl_get(gpr_avl avl, void *key); #endif From a3c03e6854e1fde8785235b9893fb57904f7c9c5 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 23 Nov 2015 15:13:45 -0800 Subject: [PATCH 10/13] Fix memory leak --- test/core/support/avl_test.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/core/support/avl_test.c b/test/core/support/avl_test.c index 981888c1ec2..6530fe4269e 100644 --- a/test/core/support/avl_test.c +++ b/test/core/support/avl_test.c @@ -3647,6 +3647,8 @@ static void test_stress(void) { } } } + + gpr_avl_unref(avl); } int main(int argc, char *argv[]) { From 9c721ff3f72b676158652bf7e588ec740b393150 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 23 Nov 2015 15:16:12 -0800 Subject: [PATCH 11/13] faster asserts --- src/core/support/avl.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/core/support/avl.c b/src/core/support/avl.c index 7b67637520f..98e728818a2 100644 --- a/src/core/support/avl.c +++ b/src/core/support/avl.c @@ -76,7 +76,6 @@ static long calculate_height(gpr_avl_node *node) { return node == NULL ? 0 : 1 + GPR_MAX(calculate_height(node->left), calculate_height(node->right)); } -#endif static gpr_avl_node *assert_invariants(gpr_avl_node *n) { if (n == NULL) return NULL; @@ -86,6 +85,11 @@ static gpr_avl_node *assert_invariants(gpr_avl_node *n) { assert(labs(node_height(n->left) - node_height(n->right)) <= 1); return n; } +#else +static gpr_avl_node *assert_invariants(gpr_avl_node *n) { + return n; +} +#endif gpr_avl_node *new_node(void *key, void *value, gpr_avl_node *left, gpr_avl_node *right) { From 22d11e1a7646f78897b77f8bc0051fc10d459e89 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 23 Nov 2015 15:33:54 -0800 Subject: [PATCH 12/13] Reduce code size for AVL tree By rewriting a few stanza's to give the compiler more flexibility in order of operations, reduce code size by about 1kb. --- src/core/support/avl.c | 59 ++++++++++++++---------------------------- 1 file changed, 20 insertions(+), 39 deletions(-) diff --git a/src/core/support/avl.c b/src/core/support/avl.c index 98e728818a2..28b4eb9f421 100644 --- a/src/core/support/avl.c +++ b/src/core/support/avl.c @@ -86,9 +86,7 @@ static gpr_avl_node *assert_invariants(gpr_avl_node *n) { return n; } #else -static gpr_avl_node *assert_invariants(gpr_avl_node *n) { - return n; -} +static gpr_avl_node *assert_invariants(gpr_avl_node *n) { return n; } #endif gpr_avl_node *new_node(void *key, void *value, gpr_avl_node *left, @@ -201,28 +199,21 @@ static gpr_avl_node *rebalance(const gpr_avl_vtable *vtable, void *key, static gpr_avl_node *add(const gpr_avl_vtable *vtable, gpr_avl_node *node, void *key, void *value) { long cmp; - gpr_avl_node *l; - gpr_avl_node *r; if (node == NULL) { return new_node(key, value, NULL, NULL); } cmp = vtable->compare_keys(node->key, key); if (cmp == 0) { - return assert_invariants( - new_node(key, value, ref_node(node->left), ref_node(node->right))); - } - - l = node->left; - r = node->right; - if (cmp > 0) { - l = add(vtable, l, key, value); - ref_node(r); + return new_node(key, value, ref_node(node->left), ref_node(node->right)); + } else if (cmp > 0) { + return rebalance(vtable, vtable->copy_key(node->key), + vtable->copy_value(node->value), + add(vtable, node->left, key, value), ref_node(node->right)); } else { - r = add(vtable, r, key, value); - ref_node(l); + return rebalance(vtable, vtable->copy_key(node->key), + vtable->copy_value(node->value), ref_node(node->left), + add(vtable, node->right, key, value)); } - return rebalance(vtable, vtable->copy_key(node->key), - vtable->copy_value(node->value), l, r); } gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value) { @@ -250,8 +241,6 @@ static gpr_avl_node *in_order_tail(gpr_avl_node *node) { static gpr_avl_node *remove(const gpr_avl_vtable *vtable, gpr_avl_node *node, void *key) { long cmp; - gpr_avl_node *l; - gpr_avl_node *r; if (node == NULL) { return NULL; } @@ -263,30 +252,22 @@ static gpr_avl_node *remove(const gpr_avl_vtable *vtable, gpr_avl_node *node, return ref_node(node->left); } else if (node->left->height < node->right->height) { gpr_avl_node *h = in_order_head(node->right); - l = ref_node(node->left); - r = remove(vtable, node->right, h->key); - return assert_invariants(rebalance(vtable, vtable->copy_key(h->key), - vtable->copy_value(h->value), l, r)); + return rebalance(vtable, vtable->copy_key(h->key), + vtable->copy_value(h->value), ref_node(node->left), remove(vtable, node->right, h->key)); } else { gpr_avl_node *h = in_order_tail(node->left); - l = remove(vtable, node->left, h->key); - r = ref_node(node->right); - return assert_invariants(rebalance(vtable, vtable->copy_key(h->key), - vtable->copy_value(h->value), l, r)); + return rebalance(vtable, vtable->copy_key(h->key), + vtable->copy_value(h->value), remove(vtable, node->left, h->key), ref_node(node->right)); } - } - - l = node->left; - r = node->right; - if (cmp > 0) { - l = remove(vtable, l, key); - ref_node(r); + } else if (cmp > 0) { + return rebalance(vtable, vtable->copy_key(node->key), + vtable->copy_value(node->value), + remove(vtable, node->left, key), ref_node(node->right)); } else { - r = remove(vtable, r, key); - ref_node(l); + return rebalance(vtable, vtable->copy_key(node->key), + vtable->copy_value(node->value), ref_node(node->left), + remove(vtable, node->right, key)); } - return rebalance(vtable, vtable->copy_key(node->key), - vtable->copy_value(node->value), l, r); } gpr_avl gpr_avl_remove(gpr_avl avl, void *key) { From 3328a5828fda9b56d6f72471878a735bc5583008 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 23 Nov 2015 15:39:32 -0800 Subject: [PATCH 13/13] clang-format --- include/grpc/support/avl.h | 2 +- src/core/support/avl.c | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/include/grpc/support/avl.h b/include/grpc/support/avl.h index 5c222e6c29e..d462f52bfe0 100644 --- a/include/grpc/support/avl.h +++ b/include/grpc/support/avl.h @@ -77,7 +77,7 @@ gpr_avl gpr_avl_ref(gpr_avl avl); are no references left */ void gpr_avl_unref(gpr_avl avl); /** return a new tree with (key, value) added to avl. - implicitly unrefs avl to allow easy chaining. + implicitly unrefs avl to allow easy chaining. if key exists in avl, the new tree's key entry updated (i.e. a duplicate is not created) */ gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value); diff --git a/src/core/support/avl.c b/src/core/support/avl.c index 28b4eb9f421..9734c9987fe 100644 --- a/src/core/support/avl.c +++ b/src/core/support/avl.c @@ -206,9 +206,9 @@ static gpr_avl_node *add(const gpr_avl_vtable *vtable, gpr_avl_node *node, if (cmp == 0) { return new_node(key, value, ref_node(node->left), ref_node(node->right)); } else if (cmp > 0) { - return rebalance(vtable, vtable->copy_key(node->key), - vtable->copy_value(node->value), - add(vtable, node->left, key, value), ref_node(node->right)); + return rebalance( + vtable, vtable->copy_key(node->key), vtable->copy_value(node->value), + add(vtable, node->left, key, value), ref_node(node->right)); } else { return rebalance(vtable, vtable->copy_key(node->key), vtable->copy_value(node->value), ref_node(node->left), @@ -253,11 +253,13 @@ static gpr_avl_node *remove(const gpr_avl_vtable *vtable, gpr_avl_node *node, } else if (node->left->height < node->right->height) { gpr_avl_node *h = in_order_head(node->right); return rebalance(vtable, vtable->copy_key(h->key), - vtable->copy_value(h->value), ref_node(node->left), remove(vtable, node->right, h->key)); + vtable->copy_value(h->value), ref_node(node->left), + remove(vtable, node->right, h->key)); } else { gpr_avl_node *h = in_order_tail(node->left); - return rebalance(vtable, vtable->copy_key(h->key), - vtable->copy_value(h->value), remove(vtable, node->left, h->key), ref_node(node->right)); + return rebalance( + vtable, vtable->copy_key(h->key), vtable->copy_value(h->value), + remove(vtable, node->left, h->key), ref_node(node->right)); } } else if (cmp > 0) { return rebalance(vtable, vtable->copy_key(node->key),