Index: third_party/grpc/src/core/iomgr/socket_windows.c |
diff --git a/third_party/grpc/src/core/iomgr/socket_windows.c b/third_party/grpc/src/core/iomgr/socket_windows.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fafb7b6622b593452f76cdcbef4fc8227a5945c9 |
--- /dev/null |
+++ b/third_party/grpc/src/core/iomgr/socket_windows.c |
@@ -0,0 +1,98 @@ |
+/* |
+ * |
+ * 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 <winsock2.h> |
+#include <mswsock.h> |
+ |
+#include <grpc/support/alloc.h> |
+#include <grpc/support/log.h> |
+#include <grpc/support/log_win32.h> |
+#include <grpc/support/string_util.h> |
+ |
+#include "src/core/iomgr/iocp_windows.h" |
+#include "src/core/iomgr/iomgr_internal.h" |
+#include "src/core/iomgr/pollset.h" |
+#include "src/core/iomgr/pollset_windows.h" |
+#include "src/core/iomgr/socket_windows.h" |
+ |
+grpc_winsocket *grpc_winsocket_create(SOCKET socket, const char *name) { |
+ char *final_name; |
+ grpc_winsocket *r = gpr_malloc(sizeof(grpc_winsocket)); |
+ memset(r, 0, sizeof(grpc_winsocket)); |
+ r->socket = socket; |
+ gpr_mu_init(&r->state_mu); |
+ gpr_asprintf(&final_name, "%s:socket=0x%p", name, r); |
+ grpc_iomgr_register_object(&r->iomgr_object, final_name); |
+ gpr_free(final_name); |
+ grpc_iocp_add_socket(r); |
+ return r; |
+} |
+ |
+/* Schedule a shutdown of the socket operations. Will call the pending |
+ operations to abort them. We need to do that this way because of the |
+ various callsites of that function, which happens to be in various |
+ mutex hold states, and that'd be unsafe to call them directly. */ |
+void grpc_winsocket_shutdown(grpc_winsocket *winsocket) { |
+ /* Grab the function pointer for DisconnectEx for that specific socket. |
+ It may change depending on the interface. */ |
+ int status; |
+ GUID guid = WSAID_DISCONNECTEX; |
+ LPFN_DISCONNECTEX DisconnectEx; |
+ DWORD ioctl_num_bytes; |
+ |
+ status = WSAIoctl(winsocket->socket, SIO_GET_EXTENSION_FUNCTION_POINTER, |
+ &guid, sizeof(guid), &DisconnectEx, sizeof(DisconnectEx), |
+ &ioctl_num_bytes, NULL, NULL); |
+ |
+ if (status == 0) { |
+ DisconnectEx(winsocket->socket, NULL, 0, 0); |
+ } else { |
+ char *utf8_message = gpr_format_message(WSAGetLastError()); |
+ gpr_log(GPR_ERROR, "Unable to retrieve DisconnectEx pointer : %s", |
+ utf8_message); |
+ gpr_free(utf8_message); |
+ } |
+ closesocket(winsocket->socket); |
+} |
+ |
+void grpc_winsocket_destroy(grpc_winsocket *winsocket) { |
+ grpc_iomgr_unregister_object(&winsocket->iomgr_object); |
+ gpr_mu_destroy(&winsocket->state_mu); |
+ gpr_free(winsocket); |
+} |
+ |
+#endif /* GPR_WINSOCK_SOCKET */ |