aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md53
-rw-r--r--Makefile15
-rw-r--r--build.json3
-rw-r--r--include/grpc/support/host_port.h5
-rw-r--r--src/core/iomgr/resolve_address_posix.c (renamed from src/core/iomgr/resolve_address.c)67
-rw-r--r--src/core/iomgr/resolve_address_windows.c166
-rw-r--r--src/core/iomgr/tcp_client_windows.c5
-rw-r--r--src/core/iomgr/tcp_server_windows.c5
-rw-r--r--src/core/support/cpu_windows.c2
-rw-r--r--src/core/support/host_port.c58
-rw-r--r--src/core/surface/init.c2
-rw-r--r--src/core/surface/server.c2
-rw-r--r--src/core/transport/chttp2_transport.c4
-rw-r--r--vsprojects/vs2013/grpc.vcxproj4
-rw-r--r--vsprojects/vs2013/grpc.vcxproj.filters5
-rw-r--r--vsprojects/vs2013/grpc_shared.vcxproj4
-rw-r--r--vsprojects/vs2013/grpc_shared.vcxproj.filters5
-rw-r--r--vsprojects/vs2013/grpc_unsecure.vcxproj4
-rw-r--r--vsprojects/vs2013/grpc_unsecure.vcxproj.filters5
19 files changed, 333 insertions, 81 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000000..57d176f663
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,53 @@
+# How to contribute
+
+We definitely welcome patches and contribution to grpc! Here is some guideline
+and information about how to do so.
+
+## Getting started
+
+### Legal requirements
+
+In order to protect both you and ourselves, you will need to sign the
+[Contributor License Agreement](https://cla.developers.google.com/clas).
+
+### Technical requirements
+
+You will need several tools to work with this repository. In addition to all of
+the packages described in the [INSTALL](INSTALL) file, you will also need
+python, and the mako template renderer. To install the latter, using pip, one
+should simply be able to do `pip install mako`.
+
+In order to run all of the tests we provide, you will need valgrind and clang.
+More specifically, under debian, you will need the package libc++-dev to
+properly run all the tests.
+
+If you are planning to work on any of the languages other than C and C++, you
+will also need their appropriate development environments.
+
+If you want to work under Windows, we recommend you to use Visual Studio 2013.
+The [Community or Express editions](http://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx)
+are free and suitable for developing with grpc. Note however that our test
+environment and tools are available for Unix environments only at the moment.
+
+## Testing your changes
+
+We provide a tool to help you run our suite of tests in various environments.
+In order to run most of the available tests, one would need to run:
+
+`./tools/run_tests/run_tests.py`
+
+If you want to run all the possible tests for all possible languages, do this:
+
+`./tools/run_tests/run_tests.py -lall -call`
+
+## Adding or removing source code
+
+Each language uses its own build system to work. Currently, the root's Makefile
+and the Visual Studio project files are building the C and C++ source code only
+at the moment. In order to ease the maintenance of these files, we have a
+template system. Please do not contribute manual changes to any of the generated
+files. Instead, modify the template files, or the build.json file, and
+re-generate the project files using the following command:
+
+`./tools/buildgen/generate_projects.sh`
+
diff --git a/Makefile b/Makefile
index db84b1ac01..b39beeb549 100644
--- a/Makefile
+++ b/Makefile
@@ -2324,7 +2324,8 @@ LIBGRPC_SRC = \
src/core/iomgr/pollset_multipoller_with_poll_posix.c \
src/core/iomgr/pollset_posix.c \
src/core/iomgr/pollset_windows.c \
- src/core/iomgr/resolve_address.c \
+ src/core/iomgr/resolve_address_posix.c \
+ src/core/iomgr/resolve_address_windows.c \
src/core/iomgr/sockaddr_utils.c \
src/core/iomgr/socket_utils_common_posix.c \
src/core/iomgr/socket_utils_linux.c \
@@ -2464,7 +2465,8 @@ src/core/iomgr/pollset_multipoller_with_epoll.c: $(OPENSSL_DEP)
src/core/iomgr/pollset_multipoller_with_poll_posix.c: $(OPENSSL_DEP)
src/core/iomgr/pollset_posix.c: $(OPENSSL_DEP)
src/core/iomgr/pollset_windows.c: $(OPENSSL_DEP)
-src/core/iomgr/resolve_address.c: $(OPENSSL_DEP)
+src/core/iomgr/resolve_address_posix.c: $(OPENSSL_DEP)
+src/core/iomgr/resolve_address_windows.c: $(OPENSSL_DEP)
src/core/iomgr/sockaddr_utils.c: $(OPENSSL_DEP)
src/core/iomgr/socket_utils_common_posix.c: $(OPENSSL_DEP)
src/core/iomgr/socket_utils_linux.c: $(OPENSSL_DEP)
@@ -2621,7 +2623,8 @@ $(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_epoll.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_poll_posix.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_posix.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_windows.o:
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address.o:
+$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_posix.o:
+$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_windows.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/sockaddr_utils.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_common_posix.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_linux.o:
@@ -2793,7 +2796,8 @@ LIBGRPC_UNSECURE_SRC = \
src/core/iomgr/pollset_multipoller_with_poll_posix.c \
src/core/iomgr/pollset_posix.c \
src/core/iomgr/pollset_windows.c \
- src/core/iomgr/resolve_address.c \
+ src/core/iomgr/resolve_address_posix.c \
+ src/core/iomgr/resolve_address_windows.c \
src/core/iomgr/sockaddr_utils.c \
src/core/iomgr/socket_utils_common_posix.c \
src/core/iomgr/socket_utils_linux.c \
@@ -2928,7 +2932,8 @@ $(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_epoll.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_poll_posix.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_posix.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_windows.o:
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address.o:
+$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_posix.o:
+$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_windows.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/sockaddr_utils.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_common_posix.o:
$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_linux.o:
diff --git a/build.json b/build.json
index f1f11650c1..f6ef33b25f 100644
--- a/build.json
+++ b/build.json
@@ -136,7 +136,8 @@
"src/core/iomgr/pollset_multipoller_with_poll_posix.c",
"src/core/iomgr/pollset_posix.c",
"src/core/iomgr/pollset_windows.c",
- "src/core/iomgr/resolve_address.c",
+ "src/core/iomgr/resolve_address_posix.c",
+ "src/core/iomgr/resolve_address_windows.c",
"src/core/iomgr/sockaddr_utils.c",
"src/core/iomgr/socket_utils_common_posix.c",
"src/core/iomgr/socket_utils_linux.c",
diff --git a/include/grpc/support/host_port.h b/include/grpc/support/host_port.h
index 362046cb95..2dac38a157 100644
--- a/include/grpc/support/host_port.h
+++ b/include/grpc/support/host_port.h
@@ -50,6 +50,11 @@ extern "C" {
In the unlikely event of an error, returns -1 and sets *out to NULL. */
int gpr_join_host_port(char **out, const char *host, int port);
+/* Given a name in the form "host:port" or "[ho:st]:port", split into hostname
+ and port number, into newly allocated strings, which must later be
+ destroyed using gpr_free(). */
+void gpr_split_host_port(const char *name, char **host, char **port);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/core/iomgr/resolve_address.c b/src/core/iomgr/resolve_address_posix.c
index ce9b157e31..edf40b5ad1 100644
--- a/src/core/iomgr/resolve_address.c
+++ b/src/core/iomgr/resolve_address_posix.c
@@ -31,9 +31,8 @@
*
*/
-#ifndef _POSIX_SOURCE
-#define _POSIX_SOURCE
-#endif
+#include <grpc/support/port_platform.h>
+#ifdef GPR_POSIX_SOCKET
#include "src/core/iomgr/sockaddr.h"
#include "src/core/iomgr/resolve_address.h"
@@ -46,6 +45,7 @@
#include "src/core/iomgr/sockaddr_utils.h"
#include "src/core/support/string.h"
#include <grpc/support/alloc.h>
+#include <grpc/support/host_port.h>
#include <grpc/support/log.h>
#include <grpc/support/thd.h>
#include <grpc/support/time.h>
@@ -57,63 +57,6 @@ typedef struct {
void *arg;
} request;
-static void split_host_port(const char *name, char **host, char **port) {
- const char *host_start;
- size_t host_len;
- const char *port_start;
-
- *host = NULL;
- *port = NULL;
-
- if (name[0] == '[') {
- /* Parse a bracketed host, typically an IPv6 literal. */
- const char *rbracket = strchr(name, ']');
- if (rbracket == NULL) {
- /* Unmatched [ */
- return;
- }
- if (rbracket[1] == '\0') {
- /* ]<end> */
- port_start = NULL;
- } else if (rbracket[1] == ':') {
- /* ]:<port?> */
- port_start = rbracket + 2;
- } else {
- /* ]<invalid> */
- return;
- }
- host_start = name + 1;
- host_len = rbracket - host_start;
- if (memchr(host_start, ':', host_len) == NULL) {
- /* Require all bracketed hosts to contain a colon, because a hostname or
- IPv4 address should never use brackets. */
- return;
- }
- } else {
- const char *colon = strchr(name, ':');
- if (colon != NULL && strchr(colon + 1, ':') == NULL) {
- /* Exactly 1 colon. Split into host:port. */
- host_start = name;
- host_len = colon - name;
- port_start = colon + 1;
- } else {
- /* 0 or 2+ colons. Bare hostname or IPv6 litearal. */
- host_start = name;
- host_len = strlen(name);
- port_start = NULL;
- }
- }
-
- /* Allocate return values. */
- *host = gpr_malloc(host_len + 1);
- memcpy(*host, host_start, host_len);
- (*host)[host_len] = '\0';
-
- if (port_start != NULL) {
- *port = gpr_strdup(port_start);
- }
-}
-
grpc_resolved_addresses *grpc_blocking_resolve_address(
const char *name, const char *default_port) {
struct addrinfo hints;
@@ -139,7 +82,7 @@ grpc_resolved_addresses *grpc_blocking_resolve_address(
}
/* parse name, splitting it into host and port parts */
- split_host_port(name, &host, &port);
+ gpr_split_host_port(name, &host, &port);
if (host == NULL) {
gpr_log(GPR_ERROR, "unparseable host:port: '%s'", name);
goto done;
@@ -233,3 +176,5 @@ void grpc_resolve_address(const char *name, const char *default_port,
r->arg = arg;
gpr_thd_new(&id, do_request, r, NULL);
}
+
+#endif
diff --git a/src/core/iomgr/resolve_address_windows.c b/src/core/iomgr/resolve_address_windows.c
new file mode 100644
index 0000000000..877b3f35ed
--- /dev/null
+++ b/src/core/iomgr/resolve_address_windows.c
@@ -0,0 +1,166 @@
+/*
+ *
+ * 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/support/port_platform.h>
+#ifdef GPR_WINSOCK_SOCKET
+
+#include "src/core/iomgr/sockaddr.h"
+#include "src/core/iomgr/resolve_address.h"
+
+#include <sys/types.h>
+#include <string.h>
+
+#include "src/core/iomgr/iomgr_internal.h"
+#include "src/core/iomgr/sockaddr_utils.h"
+#include "src/core/support/string.h"
+#include <grpc/support/alloc.h>
+#include <grpc/support/host_port.h>
+#include <grpc/support/log.h>
+#include <grpc/support/thd.h>
+#include <grpc/support/time.h>
+
+typedef struct {
+ char *name;
+ char *default_port;
+ grpc_resolve_cb cb;
+ void *arg;
+} request;
+
+grpc_resolved_addresses *grpc_blocking_resolve_address(
+ const char *name, const char *default_port) {
+ struct addrinfo hints;
+ struct addrinfo *result = NULL, *resp;
+ char *host;
+ char *port;
+ int s;
+ size_t i;
+ grpc_resolved_addresses *addrs = NULL;
+ const gpr_timespec start_time = gpr_now();
+
+ /* parse name, splitting it into host and port parts */
+ gpr_split_host_port(name, &host, &port);
+ if (host == NULL) {
+ gpr_log(GPR_ERROR, "unparseable host:port: '%s'", name);
+ goto done;
+ }
+ if (port == NULL) {
+ if (default_port == NULL) {
+ gpr_log(GPR_ERROR, "no port in name '%s'", name);
+ goto done;
+ }
+ port = gpr_strdup(default_port);
+ }
+
+ /* Call getaddrinfo */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC; /* ipv4 or ipv6 */
+ hints.ai_socktype = SOCK_STREAM; /* stream socket */
+ hints.ai_flags = AI_PASSIVE; /* for wildcard IP address */
+
+ s = getaddrinfo(host, port, &hints, &result);
+ if (s != 0) {
+ gpr_log(GPR_ERROR, "getaddrinfo: %s", gai_strerror(s));
+ goto done;
+ }
+
+ /* Success path: set addrs non-NULL, fill it in */
+ addrs = gpr_malloc(sizeof(grpc_resolved_addresses));
+ addrs->naddrs = 0;
+ for (resp = result; resp != NULL; resp = resp->ai_next) {
+ addrs->naddrs++;
+ }
+ addrs->addrs = gpr_malloc(sizeof(grpc_resolved_address) * addrs->naddrs);
+ i = 0;
+ for (resp = result; resp != NULL; resp = resp->ai_next) {
+ memcpy(&addrs->addrs[i].addr, resp->ai_addr, resp->ai_addrlen);
+ addrs->addrs[i].len = resp->ai_addrlen;
+ i++;
+ }
+
+ /* Temporary logging, to help identify flakiness in dualstack_socket_test. */
+ {
+ const gpr_timespec delay = gpr_time_sub(gpr_now(), start_time);
+ const int delay_ms =
+ delay.tv_sec * GPR_MS_PER_SEC + delay.tv_nsec / GPR_NS_PER_MS;
+ gpr_log(GPR_INFO, "logspam: getaddrinfo(%s, %s) resolved %d addrs in %dms:",
+ host, port, addrs->naddrs, delay_ms);
+ for (i = 0; i < addrs->naddrs; i++) {
+ char *buf;
+ grpc_sockaddr_to_string(&buf, (struct sockaddr *)&addrs->addrs[i].addr,
+ 0);
+ gpr_log(GPR_INFO, "logspam: [%d] %s", i, buf);
+ gpr_free(buf);
+ }
+ }
+
+done:
+ gpr_free(host);
+ gpr_free(port);
+ if (result) {
+ freeaddrinfo(result);
+ }
+ return addrs;
+}
+
+/* Thread function to asynch-ify grpc_blocking_resolve_address */
+static void do_request(void *rp) {
+ request *r = rp;
+ grpc_resolved_addresses *resolved =
+ grpc_blocking_resolve_address(r->name, r->default_port);
+ void *arg = r->arg;
+ grpc_resolve_cb cb = r->cb;
+ gpr_free(r->name);
+ gpr_free(r->default_port);
+ gpr_free(r);
+ cb(arg, resolved);
+ grpc_iomgr_unref();
+}
+
+void grpc_resolved_addresses_destroy(grpc_resolved_addresses *addrs) {
+ gpr_free(addrs->addrs);
+ gpr_free(addrs);
+}
+
+void grpc_resolve_address(const char *name, const char *default_port,
+ grpc_resolve_cb cb, void *arg) {
+ request *r = gpr_malloc(sizeof(request));
+ gpr_thd_id id;
+ grpc_iomgr_ref();
+ r->name = gpr_strdup(name);
+ r->default_port = gpr_strdup(default_port);
+ r->cb = cb;
+ r->arg = arg;
+ gpr_thd_new(&id, do_request, r, NULL);
+}
+
+#endif
diff --git a/src/core/iomgr/tcp_client_windows.c b/src/core/iomgr/tcp_client_windows.c
index 2bd93c6af2..181d89cb6d 100644
--- a/src/core/iomgr/tcp_client_windows.c
+++ b/src/core/iomgr/tcp_client_windows.c
@@ -43,12 +43,13 @@
#include <grpc/support/slice_buffer.h>
#include <grpc/support/useful.h>
+#include "src/core/iomgr/alarm.h"
+#include "src/core/iomgr/iocp_windows.h"
#include "src/core/iomgr/tcp_client.h"
#include "src/core/iomgr/tcp_windows.h"
-#include "src/core/iomgr/socket_windows.h"
-#include "src/core/iomgr/alarm.h"
#include "src/core/iomgr/sockaddr.h"
#include "src/core/iomgr/sockaddr_utils.h"
+#include "src/core/iomgr/socket_windows.h"
typedef struct {
void(*cb)(void *arg, grpc_endpoint *tcp);
diff --git a/src/core/iomgr/tcp_server_windows.c b/src/core/iomgr/tcp_server_windows.c
index c6864efdc5..59319da26d 100644
--- a/src/core/iomgr/tcp_server_windows.c
+++ b/src/core/iomgr/tcp_server_windows.c
@@ -355,8 +355,9 @@ SOCKET grpc_tcp_server_get_socket(grpc_tcp_server *s, unsigned index) {
return (index < s->nports) ? s->ports[index].socket->socket : INVALID_SOCKET;
}
-void grpc_tcp_server_start(grpc_tcp_server *s, grpc_pollset *pollset,
- grpc_tcp_server_cb cb, void *cb_arg) {
+void grpc_tcp_server_start(grpc_tcp_server *s, grpc_pollset **pollset,
+ size_t pollset_count, grpc_tcp_server_cb cb,
+ void *cb_arg) {
size_t i;
GPR_ASSERT(cb);
gpr_mu_lock(&s->mu);
diff --git a/src/core/support/cpu_windows.c b/src/core/support/cpu_windows.c
index 9a460cc484..cb454ccd3b 100644
--- a/src/core/support/cpu_windows.c
+++ b/src/core/support/cpu_windows.c
@@ -35,8 +35,6 @@
#ifdef GPR_WIN32
-#include "src/core/support/cpu.h"
-
#include <grpc/support/log.h>
unsigned gpr_cpu_num_cores(void) {
diff --git a/src/core/support/host_port.c b/src/core/support/host_port.c
index 379d30b045..fa49f1a33a 100644
--- a/src/core/support/host_port.c
+++ b/src/core/support/host_port.c
@@ -36,6 +36,7 @@
#include <string.h>
#include "src/core/support/string.h"
+#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
int gpr_join_host_port(char **out, const char *host, int port) {
@@ -47,3 +48,60 @@ int gpr_join_host_port(char **out, const char *host, int port) {
return gpr_asprintf(out, "%s:%d", host, port);
}
}
+
+void gpr_split_host_port(const char *name, char **host, char **port) {
+ const char *host_start;
+ size_t host_len;
+ const char *port_start;
+
+ *host = NULL;
+ *port = NULL;
+
+ if (name[0] == '[') {
+ /* Parse a bracketed host, typically an IPv6 literal. */
+ const char *rbracket = strchr(name, ']');
+ if (rbracket == NULL) {
+ /* Unmatched [ */
+ return;
+ }
+ if (rbracket[1] == '\0') {
+ /* ]<end> */
+ port_start = NULL;
+ } else if (rbracket[1] == ':') {
+ /* ]:<port?> */
+ port_start = rbracket + 2;
+ } else {
+ /* ]<invalid> */
+ return;
+ }
+ host_start = name + 1;
+ host_len = rbracket - host_start;
+ if (memchr(host_start, ':', host_len) == NULL) {
+ /* Require all bracketed hosts to contain a colon, because a hostname or
+ IPv4 address should never use brackets. */
+ return;
+ }
+ } else {
+ const char *colon = strchr(name, ':');
+ if (colon != NULL && strchr(colon + 1, ':') == NULL) {
+ /* Exactly 1 colon. Split into host:port. */
+ host_start = name;
+ host_len = colon - name;
+ port_start = colon + 1;
+ } else {
+ /* 0 or 2+ colons. Bare hostname or IPv6 litearal. */
+ host_start = name;
+ host_len = strlen(name);
+ port_start = NULL;
+ }
+ }
+
+ /* Allocate return values. */
+ *host = gpr_malloc(host_len + 1);
+ memcpy(*host, host_start, host_len);
+ (*host)[host_len] = '\0';
+
+ if (port_start != NULL) {
+ *port = gpr_strdup(port_start);
+ }
+}
diff --git a/src/core/surface/init.c b/src/core/surface/init.c
index fa4614abc8..2d8f36e9c2 100644
--- a/src/core/surface/init.c
+++ b/src/core/surface/init.c
@@ -40,7 +40,7 @@ static gpr_once g_init = GPR_ONCE_INIT;
static gpr_mu g_init_mu;
static int g_initializations;
-static void do_init() {
+static void do_init(void) {
gpr_mu_init(&g_init_mu);
g_initializations = 0;
}
diff --git a/src/core/surface/server.c b/src/core/surface/server.c
index a95215c5de..c99a1b4cc9 100644
--- a/src/core/surface/server.c
+++ b/src/core/surface/server.c
@@ -291,7 +291,7 @@ static void orphan_channel(channel_data *chand) {
static void finish_destroy_channel(void *cd, int success) {
channel_data *chand = cd;
grpc_server *server = chand->server;
- grpc_channel_destroy(chand->channel);
+ grpc_channel_internal_unref(chand->channel);
server_unref(server);
}
diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c
index 982417ec8a..ccd8d0c376 100644
--- a/src/core/transport/chttp2_transport.c
+++ b/src/core/transport/chttp2_transport.c
@@ -191,6 +191,7 @@ struct transport {
gpr_uint8 writing;
gpr_uint8 calling_back;
gpr_uint8 destroying;
+ gpr_uint8 closed;
error_state error_state;
/* stream indexing */
@@ -416,6 +417,7 @@ static void init_transport(transport *t, grpc_transport_setup_callback setup,
t->next_stream_id = is_client ? 1 : 2;
t->last_incoming_stream_id = 0;
t->destroying = 0;
+ t->closed = 0;
t->is_client = is_client;
t->outgoing_window = DEFAULT_WINDOW;
t->incoming_window = DEFAULT_WINDOW;
@@ -521,6 +523,8 @@ static void destroy_transport(grpc_transport *gt) {
static void close_transport(grpc_transport *gt) {
transport *t = (transport *)gt;
gpr_mu_lock(&t->mu);
+ GPR_ASSERT(!t->closed);
+ t->closed = 1;
if (t->ep) {
grpc_endpoint_shutdown(t->ep);
}
diff --git a/vsprojects/vs2013/grpc.vcxproj b/vsprojects/vs2013/grpc.vcxproj
index b55c7f926b..89c0de333c 100644
--- a/vsprojects/vs2013/grpc.vcxproj
+++ b/vsprojects/vs2013/grpc.vcxproj
@@ -283,7 +283,9 @@
</ClCompile>
<ClCompile Include="..\..\src\core\iomgr\pollset_windows.c">
</ClCompile>
- <ClCompile Include="..\..\src\core\iomgr\resolve_address.c">
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c">
+ </ClCompile>
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c">
</ClCompile>
<ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c">
</ClCompile>
diff --git a/vsprojects/vs2013/grpc.vcxproj.filters b/vsprojects/vs2013/grpc.vcxproj.filters
index 9505c37ef4..a2d9f30eda 100644
--- a/vsprojects/vs2013/grpc.vcxproj.filters
+++ b/vsprojects/vs2013/grpc.vcxproj.filters
@@ -145,7 +145,10 @@
<ClCompile Include="..\..\src\core\iomgr\pollset_windows.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
- <ClCompile Include="..\..\src\core\iomgr\resolve_address.c">
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c">
+ <Filter>src\core\iomgr</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c">
diff --git a/vsprojects/vs2013/grpc_shared.vcxproj b/vsprojects/vs2013/grpc_shared.vcxproj
index dfb0899138..81a280d912 100644
--- a/vsprojects/vs2013/grpc_shared.vcxproj
+++ b/vsprojects/vs2013/grpc_shared.vcxproj
@@ -287,7 +287,9 @@
</ClCompile>
<ClCompile Include="..\..\src\core\iomgr\pollset_windows.c">
</ClCompile>
- <ClCompile Include="..\..\src\core\iomgr\resolve_address.c">
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c">
+ </ClCompile>
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c">
</ClCompile>
<ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c">
</ClCompile>
diff --git a/vsprojects/vs2013/grpc_shared.vcxproj.filters b/vsprojects/vs2013/grpc_shared.vcxproj.filters
index 9505c37ef4..a2d9f30eda 100644
--- a/vsprojects/vs2013/grpc_shared.vcxproj.filters
+++ b/vsprojects/vs2013/grpc_shared.vcxproj.filters
@@ -145,7 +145,10 @@
<ClCompile Include="..\..\src\core\iomgr\pollset_windows.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
- <ClCompile Include="..\..\src\core\iomgr\resolve_address.c">
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c">
+ <Filter>src\core\iomgr</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c">
diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj b/vsprojects/vs2013/grpc_unsecure.vcxproj
index 74fc6c96ec..0c81ec4768 100644
--- a/vsprojects/vs2013/grpc_unsecure.vcxproj
+++ b/vsprojects/vs2013/grpc_unsecure.vcxproj
@@ -232,7 +232,9 @@
</ClCompile>
<ClCompile Include="..\..\src\core\iomgr\pollset_windows.c">
</ClCompile>
- <ClCompile Include="..\..\src\core\iomgr\resolve_address.c">
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c">
+ </ClCompile>
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c">
</ClCompile>
<ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c">
</ClCompile>
diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters
index ea34d210bf..4b5370a573 100644
--- a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters
+++ b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters
@@ -91,7 +91,10 @@
<ClCompile Include="..\..\src\core\iomgr\pollset_windows.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
- <ClCompile Include="..\..\src\core\iomgr\resolve_address.c">
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c">
+ <Filter>src\core\iomgr</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c">