mirror of https://github.com/grpc/grpc.git
parent
8ad26f7f74
commit
0ced984233
7 changed files with 2 additions and 667 deletions
@ -1,138 +0,0 @@ |
|||||||
/*
|
|
||||||
* |
|
||||||
* 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 <grpc/grpc.h> |
|
||||||
|
|
||||||
#include <string.h> |
|
||||||
|
|
||||||
#include <grpc/support/log.h> |
|
||||||
#include <grpc/support/time.h> |
|
||||||
#include <grpc/byte_buffer.h> |
|
||||||
#include "test/core/util/test_config.h" |
|
||||||
|
|
||||||
enum { WRITE_SLICE_LENGTH = 1024, TOTAL_BYTES = 102400 }; |
|
||||||
|
|
||||||
/* Start write the next slice, fill slice.data[0..length - 1] with first % 256,
|
|
||||||
(first + 1) % 256, ... (first + length - 1) % 256. |
|
||||||
Produce a GRPC_WRITE_ACCEPTED event */ |
|
||||||
static void start_write_next_slice(grpc_call *call, int first, int length) { |
|
||||||
int i = 0; |
|
||||||
grpc_byte_buffer *byte_buffer = NULL; |
|
||||||
gpr_slice slice = gpr_slice_malloc(length); |
|
||||||
for (i = 0; i < length; i++) |
|
||||||
GPR_SLICE_START_PTR(slice)[i] = (first + i) % 256; |
|
||||||
byte_buffer = grpc_byte_buffer_create(&slice, 1); |
|
||||||
GPR_ASSERT(grpc_call_start_write_old(call, byte_buffer, (void *)1, 0) == |
|
||||||
GRPC_CALL_OK); |
|
||||||
gpr_slice_unref(slice); |
|
||||||
grpc_byte_buffer_destroy(byte_buffer); |
|
||||||
} |
|
||||||
|
|
||||||
int main(int argc, char **argv) { |
|
||||||
grpc_channel *channel = NULL; |
|
||||||
grpc_call *call = NULL; |
|
||||||
grpc_event *ev = NULL; |
|
||||||
grpc_byte_buffer_reader *bb_reader = NULL; |
|
||||||
grpc_completion_queue *cq = NULL; |
|
||||||
int bytes_written = 0; |
|
||||||
int bytes_read = 0; |
|
||||||
unsigned i = 0; |
|
||||||
int waiting_finishes; |
|
||||||
gpr_slice read_slice; |
|
||||||
|
|
||||||
grpc_test_init(argc, argv); |
|
||||||
|
|
||||||
grpc_init(); |
|
||||||
|
|
||||||
cq = grpc_completion_queue_create(); |
|
||||||
|
|
||||||
GPR_ASSERT(argc == 2); |
|
||||||
channel = grpc_channel_create(argv[1], NULL); |
|
||||||
call = grpc_channel_create_call_old(channel, "/foo", "localhost", |
|
||||||
GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5)); |
|
||||||
GPR_ASSERT(grpc_call_invoke_old(call, cq, (void *)1, (void *)1, 0) == |
|
||||||
GRPC_CALL_OK); |
|
||||||
|
|
||||||
start_write_next_slice(call, bytes_written, WRITE_SLICE_LENGTH); |
|
||||||
bytes_written += WRITE_SLICE_LENGTH; |
|
||||||
GPR_ASSERT(grpc_call_start_read_old(call, (void *)1) == GRPC_CALL_OK); |
|
||||||
waiting_finishes = 2; |
|
||||||
while (waiting_finishes) { |
|
||||||
ev = grpc_completion_queue_next(cq, gpr_inf_future); |
|
||||||
switch (ev->type) { |
|
||||||
case GRPC_WRITE_ACCEPTED: |
|
||||||
if (bytes_written < TOTAL_BYTES) { |
|
||||||
start_write_next_slice(call, bytes_written, WRITE_SLICE_LENGTH); |
|
||||||
bytes_written += WRITE_SLICE_LENGTH; |
|
||||||
} else { |
|
||||||
GPR_ASSERT(grpc_call_writes_done_old(call, (void *)1) == |
|
||||||
GRPC_CALL_OK); |
|
||||||
} |
|
||||||
break; |
|
||||||
case GRPC_CLIENT_METADATA_READ: |
|
||||||
break; |
|
||||||
case GRPC_READ: |
|
||||||
bb_reader = grpc_byte_buffer_reader_create(ev->data.read); |
|
||||||
while (grpc_byte_buffer_reader_next(bb_reader, &read_slice)) { |
|
||||||
for (i = 0; i < GPR_SLICE_LENGTH(read_slice); i++) { |
|
||||||
GPR_ASSERT(GPR_SLICE_START_PTR(read_slice)[i] == bytes_read % 256); |
|
||||||
bytes_read++; |
|
||||||
} |
|
||||||
gpr_slice_unref(read_slice); |
|
||||||
} |
|
||||||
grpc_byte_buffer_reader_destroy(bb_reader); |
|
||||||
if (bytes_read < TOTAL_BYTES) { |
|
||||||
GPR_ASSERT(grpc_call_start_read_old(call, (void *)1) == GRPC_CALL_OK); |
|
||||||
} |
|
||||||
break; |
|
||||||
case GRPC_FINISHED: |
|
||||||
case GRPC_FINISH_ACCEPTED: |
|
||||||
waiting_finishes--; |
|
||||||
break; |
|
||||||
default: |
|
||||||
GPR_ASSERT(0 && "unexpected event"); |
|
||||||
break; |
|
||||||
} |
|
||||||
grpc_event_finish(ev); |
|
||||||
} |
|
||||||
GPR_ASSERT(bytes_read == TOTAL_BYTES); |
|
||||||
gpr_log(GPR_INFO, "All data have been successfully echoed"); |
|
||||||
|
|
||||||
grpc_call_destroy(call); |
|
||||||
grpc_channel_destroy(channel); |
|
||||||
grpc_completion_queue_destroy(cq); |
|
||||||
|
|
||||||
grpc_shutdown(); |
|
||||||
|
|
||||||
return 0; |
|
||||||
} |
|
@ -1,135 +0,0 @@ |
|||||||
/*
|
|
||||||
* |
|
||||||
* 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 _POSIX_SOURCE |
|
||||||
#define _POSIX_SOURCE |
|
||||||
#endif |
|
||||||
|
|
||||||
#include <unistd.h> |
|
||||||
#include <assert.h> |
|
||||||
#include <stdio.h> |
|
||||||
#include <string.h> |
|
||||||
#include <signal.h> |
|
||||||
#include <stdlib.h> |
|
||||||
#include <sys/types.h> |
|
||||||
#include <sys/wait.h> |
|
||||||
|
|
||||||
#include "src/core/iomgr/socket_utils_posix.h" |
|
||||||
#include "src/core/support/string.h" |
|
||||||
#include <grpc/support/alloc.h> |
|
||||||
#include <grpc/support/host_port.h> |
|
||||||
#include <grpc/support/log.h> |
|
||||||
#include "test/core/util/port.h" |
|
||||||
|
|
||||||
int test_client(const char *root, const char *host, int port) { |
|
||||||
int status; |
|
||||||
pid_t cli; |
|
||||||
cli = fork(); |
|
||||||
if (cli == 0) { |
|
||||||
char *binary_path; |
|
||||||
char *binding; |
|
||||||
gpr_asprintf(&binary_path, "%s/echo_client", root); |
|
||||||
gpr_join_host_port(&binding, host, port); |
|
||||||
|
|
||||||
execl(binary_path, binary_path, binding, NULL); |
|
||||||
|
|
||||||
gpr_free(binary_path); |
|
||||||
gpr_free(binding); |
|
||||||
return 1; |
|
||||||
} |
|
||||||
/* wait for client */ |
|
||||||
gpr_log(GPR_INFO, "Waiting for client: %s", host); |
|
||||||
if (waitpid(cli, &status, 0) == -1) return 2; |
|
||||||
if (!WIFEXITED(status)) return 4; |
|
||||||
if (WEXITSTATUS(status)) return WEXITSTATUS(status); |
|
||||||
return 0; |
|
||||||
} |
|
||||||
|
|
||||||
int main(int argc, char **argv) { |
|
||||||
char *me = argv[0]; |
|
||||||
char *lslash = strrchr(me, '/'); |
|
||||||
char root[1024]; |
|
||||||
int port = grpc_pick_unused_port_or_die(); |
|
||||||
int status; |
|
||||||
pid_t svr; |
|
||||||
int ret; |
|
||||||
int do_ipv6 = 1; |
|
||||||
/* seed rng with pid, so we don't end up with the same random numbers as a
|
|
||||||
concurrently running test binary */ |
|
||||||
srand(getpid()); |
|
||||||
if (!grpc_ipv6_loopback_available()) { |
|
||||||
gpr_log(GPR_INFO, "Can't bind to ::1. Skipping IPv6 tests."); |
|
||||||
do_ipv6 = 0; |
|
||||||
} |
|
||||||
/* figure out where we are */ |
|
||||||
if (lslash) { |
|
||||||
memcpy(root, me, lslash - me); |
|
||||||
root[lslash - me] = 0; |
|
||||||
} else { |
|
||||||
strcpy(root, "."); |
|
||||||
} |
|
||||||
/* start the server */ |
|
||||||
svr = fork(); |
|
||||||
if (svr == 0) { |
|
||||||
char *binary_path; |
|
||||||
char *binding; |
|
||||||
gpr_asprintf(&binary_path, "%s/echo_server", root); |
|
||||||
gpr_join_host_port(&binding, "::", port); |
|
||||||
|
|
||||||
execl(binary_path, binary_path, "-bind", binding, NULL); |
|
||||||
|
|
||||||
gpr_free(binary_path); |
|
||||||
gpr_free(binding); |
|
||||||
return 1; |
|
||||||
} |
|
||||||
/* wait a little */ |
|
||||||
sleep(2); |
|
||||||
/* start the clients */ |
|
||||||
ret = test_client(root, "127.0.0.1", port); |
|
||||||
if (ret != 0) return ret; |
|
||||||
ret = test_client(root, "::ffff:127.0.0.1", port); |
|
||||||
if (ret != 0) return ret; |
|
||||||
ret = test_client(root, "localhost", port); |
|
||||||
if (ret != 0) return ret; |
|
||||||
if (do_ipv6) { |
|
||||||
ret = test_client(root, "::1", port); |
|
||||||
if (ret != 0) return ret; |
|
||||||
} |
|
||||||
/* wait for server */ |
|
||||||
gpr_log(GPR_INFO, "Waiting for server"); |
|
||||||
kill(svr, SIGINT); |
|
||||||
if (waitpid(svr, &status, 0) == -1) return 2; |
|
||||||
if (!WIFEXITED(status)) return 4; |
|
||||||
if (WEXITSTATUS(status)) return WEXITSTATUS(status); |
|
||||||
return 0; |
|
||||||
} |
|
@ -1,223 +0,0 @@ |
|||||||
/*
|
|
||||||
* |
|
||||||
* 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 <grpc/grpc.h> |
|
||||||
#include <grpc/grpc_http.h> |
|
||||||
#include <grpc/grpc_security.h> |
|
||||||
|
|
||||||
#include <signal.h> |
|
||||||
#include <stdio.h> |
|
||||||
#include <stdlib.h> |
|
||||||
#include <string.h> |
|
||||||
#include <time.h> |
|
||||||
|
|
||||||
#include "src/core/support/string.h" |
|
||||||
#include "test/core/util/test_config.h" |
|
||||||
#include <grpc/support/alloc.h> |
|
||||||
#include <grpc/support/cmdline.h> |
|
||||||
#include <grpc/support/host_port.h> |
|
||||||
#include <grpc/support/log.h> |
|
||||||
#include <grpc/support/time.h> |
|
||||||
#include "test/core/util/port.h" |
|
||||||
#include "test/core/end2end/data/ssl_test_data.h" |
|
||||||
|
|
||||||
static grpc_completion_queue *cq; |
|
||||||
static grpc_server *server; |
|
||||||
static int got_sigint = 0; |
|
||||||
|
|
||||||
typedef struct { |
|
||||||
gpr_refcount pending_ops; |
|
||||||
gpr_intmax bytes_read; |
|
||||||
} call_state; |
|
||||||
|
|
||||||
static void request_call(void) { |
|
||||||
call_state *tag = gpr_malloc(sizeof(*tag)); |
|
||||||
gpr_ref_init(&tag->pending_ops, 2); |
|
||||||
tag->bytes_read = 0; |
|
||||||
grpc_server_request_call_old(server, tag); |
|
||||||
} |
|
||||||
|
|
||||||
static void assert_read_ok(call_state *s, grpc_byte_buffer *b) { |
|
||||||
grpc_byte_buffer_reader *bb_reader = NULL; |
|
||||||
gpr_slice read_slice; |
|
||||||
unsigned i; |
|
||||||
|
|
||||||
bb_reader = grpc_byte_buffer_reader_create(b); |
|
||||||
while (grpc_byte_buffer_reader_next(bb_reader, &read_slice)) { |
|
||||||
for (i = 0; i < GPR_SLICE_LENGTH(read_slice); i++) { |
|
||||||
GPR_ASSERT(GPR_SLICE_START_PTR(read_slice)[i] == s->bytes_read % 256); |
|
||||||
s->bytes_read++; |
|
||||||
} |
|
||||||
gpr_slice_unref(read_slice); |
|
||||||
} |
|
||||||
grpc_byte_buffer_reader_destroy(bb_reader); |
|
||||||
} |
|
||||||
|
|
||||||
static void sigint_handler(int x) { got_sigint = 1; } |
|
||||||
|
|
||||||
int main(int argc, char **argv) { |
|
||||||
grpc_event *ev; |
|
||||||
call_state *s; |
|
||||||
char *addr_buf = NULL; |
|
||||||
gpr_cmdline *cl; |
|
||||||
int shutdown_started = 0; |
|
||||||
int shutdown_finished = 0; |
|
||||||
|
|
||||||
int secure = 0; |
|
||||||
char *addr = NULL; |
|
||||||
|
|
||||||
char *fake_argv[1]; |
|
||||||
|
|
||||||
#define MAX_ARGS 4 |
|
||||||
grpc_arg arge[MAX_ARGS]; |
|
||||||
grpc_arg *e; |
|
||||||
grpc_channel_args args = {0, NULL}; |
|
||||||
|
|
||||||
grpc_http_server_page home_page = {"/", "text/html", |
|
||||||
"<head>\n" |
|
||||||
"<title>Echo Server</title>\n" |
|
||||||
"</head>\n" |
|
||||||
"<body>\n" |
|
||||||
"Welcome to the world of the future!\n" |
|
||||||
"</body>\n"}; |
|
||||||
|
|
||||||
GPR_ASSERT(argc >= 1); |
|
||||||
fake_argv[0] = argv[0]; |
|
||||||
grpc_test_init(1, fake_argv); |
|
||||||
|
|
||||||
grpc_init(); |
|
||||||
srand(clock()); |
|
||||||
memset(arge, 0, sizeof(arge)); |
|
||||||
args.args = arge; |
|
||||||
|
|
||||||
cl = gpr_cmdline_create("echo server"); |
|
||||||
gpr_cmdline_add_string(cl, "bind", "Bind host:port", &addr); |
|
||||||
gpr_cmdline_add_flag(cl, "secure", "Run with security?", &secure); |
|
||||||
gpr_cmdline_parse(cl, argc, argv); |
|
||||||
gpr_cmdline_destroy(cl); |
|
||||||
|
|
||||||
e = &arge[args.num_args++]; |
|
||||||
e->type = GRPC_ARG_POINTER; |
|
||||||
e->key = GRPC_ARG_SERVE_OVER_HTTP; |
|
||||||
e->value.pointer.p = &home_page; |
|
||||||
|
|
||||||
if (addr == NULL) { |
|
||||||
gpr_join_host_port(&addr_buf, "::", grpc_pick_unused_port_or_die()); |
|
||||||
addr = addr_buf; |
|
||||||
} |
|
||||||
gpr_log(GPR_INFO, "creating server on: %s", addr); |
|
||||||
|
|
||||||
cq = grpc_completion_queue_create(); |
|
||||||
if (secure) { |
|
||||||
grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {test_server1_key, |
|
||||||
test_server1_cert}; |
|
||||||
grpc_server_credentials *ssl_creds = |
|
||||||
grpc_ssl_server_credentials_create(NULL, &pem_key_cert_pair, 1); |
|
||||||
server = grpc_server_create(cq, &args); |
|
||||||
GPR_ASSERT(grpc_server_add_secure_http2_port(server, addr, ssl_creds)); |
|
||||||
grpc_server_credentials_release(ssl_creds); |
|
||||||
} else { |
|
||||||
server = grpc_server_create(cq, &args); |
|
||||||
GPR_ASSERT(grpc_server_add_http2_port(server, addr)); |
|
||||||
} |
|
||||||
grpc_server_start(server); |
|
||||||
|
|
||||||
gpr_free(addr_buf); |
|
||||||
addr = addr_buf = NULL; |
|
||||||
|
|
||||||
request_call(); |
|
||||||
|
|
||||||
signal(SIGINT, sigint_handler); |
|
||||||
while (!shutdown_finished) { |
|
||||||
if (got_sigint && !shutdown_started) { |
|
||||||
gpr_log(GPR_INFO, "Shutting down due to SIGINT"); |
|
||||||
grpc_server_shutdown(server); |
|
||||||
grpc_completion_queue_shutdown(cq); |
|
||||||
shutdown_started = 1; |
|
||||||
} |
|
||||||
ev = grpc_completion_queue_next( |
|
||||||
cq, gpr_time_add(gpr_now(), gpr_time_from_seconds(1))); |
|
||||||
if (!ev) continue; |
|
||||||
s = ev->tag; |
|
||||||
switch (ev->type) { |
|
||||||
case GRPC_SERVER_RPC_NEW: |
|
||||||
if (ev->call != NULL) { |
|
||||||
/* initial ops are already started in request_call */ |
|
||||||
grpc_call_server_accept_old(ev->call, cq, s); |
|
||||||
grpc_call_server_end_initial_metadata_old(ev->call, |
|
||||||
GRPC_WRITE_BUFFER_HINT); |
|
||||||
GPR_ASSERT(grpc_call_start_read_old(ev->call, s) == GRPC_CALL_OK); |
|
||||||
request_call(); |
|
||||||
} else { |
|
||||||
GPR_ASSERT(shutdown_started); |
|
||||||
gpr_free(s); |
|
||||||
} |
|
||||||
break; |
|
||||||
case GRPC_WRITE_ACCEPTED: |
|
||||||
GPR_ASSERT(ev->data.write_accepted == GRPC_OP_OK); |
|
||||||
GPR_ASSERT(grpc_call_start_read_old(ev->call, s) == GRPC_CALL_OK); |
|
||||||
break; |
|
||||||
case GRPC_READ: |
|
||||||
if (ev->data.read) { |
|
||||||
assert_read_ok(ev->tag, ev->data.read); |
|
||||||
GPR_ASSERT(grpc_call_start_write_old(ev->call, ev->data.read, s, |
|
||||||
GRPC_WRITE_BUFFER_HINT) == |
|
||||||
GRPC_CALL_OK); |
|
||||||
} else { |
|
||||||
GPR_ASSERT(grpc_call_start_write_status_old(ev->call, GRPC_STATUS_OK, |
|
||||||
NULL, s) == GRPC_CALL_OK); |
|
||||||
} |
|
||||||
break; |
|
||||||
case GRPC_FINISH_ACCEPTED: |
|
||||||
case GRPC_FINISHED: |
|
||||||
if (gpr_unref(&s->pending_ops)) { |
|
||||||
grpc_call_destroy(ev->call); |
|
||||||
gpr_free(s); |
|
||||||
} |
|
||||||
break; |
|
||||||
case GRPC_QUEUE_SHUTDOWN: |
|
||||||
GPR_ASSERT(shutdown_started); |
|
||||||
shutdown_finished = 1; |
|
||||||
break; |
|
||||||
default: |
|
||||||
GPR_ASSERT(0); |
|
||||||
} |
|
||||||
grpc_event_finish(ev); |
|
||||||
} |
|
||||||
|
|
||||||
grpc_server_destroy(server); |
|
||||||
grpc_completion_queue_destroy(cq); |
|
||||||
grpc_shutdown(); |
|
||||||
|
|
||||||
return 0; |
|
||||||
} |
|
Loading…
Reference in new issue