aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Makefile15
-rw-r--r--build.json3
-rw-r--r--src/core/iomgr/resolve_address_posix.c (renamed from src/core/iomgr/resolve_address.c)7
-rw-r--r--src/core/iomgr/resolve_address_windows.c222
-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/surface/init.c2
-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
14 files changed, 266 insertions, 22 deletions
diff --git a/Makefile b/Makefile
index 4efb955c72..24eba78bd4 100644
--- a/Makefile
+++ b/Makefile
@@ -2323,7 +2323,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 \
@@ -2463,7 +2464,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)
@@ -2620,7 +2622,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:
@@ -2792,7 +2795,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 \
@@ -2927,7 +2931,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 002cabe2bc..59eadce4ea 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/src/core/iomgr/resolve_address.c b/src/core/iomgr/resolve_address_posix.c
index ce9b157e31..f172ba9e21 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"
@@ -233,3 +232,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..c1c3a3beed
--- /dev/null
+++ b/src/core/iomgr/resolve_address_windows.c
@@ -0,0 +1,222 @@
+/*
+ *
+ * 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/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;
+
+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;
+ 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 */
+ 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/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/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">