|  | diff --git a/third_party/grpc/BUILD b/third_party/grpc/BUILD | 
|  | index 51e861f..a635ebc 100644 | 
|  | --- a/third_party/grpc/BUILD | 
|  | +++ b/third_party/grpc/BUILD | 
|  | @@ -438,7 +438,7 @@ cc_library( | 
|  | ], | 
|  | copts = [ | 
|  | "-std=gnu99", | 
|  | -        "-Wno-implicit-function-declaration", | 
|  | +        "-w", | 
|  | ], | 
|  | includes = [ | 
|  | ".", | 
|  | @@ -570,6 +570,7 @@ cc_library( | 
|  | "include/grpc++/support/sync_stream.h", | 
|  | "include/grpc++/support/time.h", | 
|  | ], | 
|  | +    copts = ["-w"], | 
|  | includes = [ | 
|  | ".", | 
|  | "include", | 
|  | diff --git a/third_party/grpc/include/grpc/impl/codegen/port_platform.h b/third_party/grpc/include/grpc/impl/codegen/port_platform.h | 
|  | index d265e9b..d22bffb 100644 | 
|  | --- a/third_party/grpc/include/grpc/impl/codegen/port_platform.h | 
|  | +++ b/third_party/grpc/include/grpc/impl/codegen/port_platform.h | 
|  | @@ -74,7 +74,45 @@ | 
|  | things.  */ | 
|  |  | 
|  | #if !defined(GPR_NO_AUTODETECT_PLATFORM) | 
|  | -#if defined(_WIN64) || defined(WIN64) | 
|  | + | 
|  | +#if defined(__MSYS__) | 
|  | +#define GPR_PLATFORM_STRING "msys2" | 
|  | +#define GPR_POSIX_CRASH_HANDLER 1 | 
|  | +#ifndef _BSD_SOURCE | 
|  | +#define _BSD_SOURCE | 
|  | +#endif | 
|  | +#ifndef _DEFAULT_SOURCE | 
|  | +#define _DEFAULT_SOURCE | 
|  | +#endif | 
|  | +#ifndef _GNU_SOURCE | 
|  | +#define _GNU_SOURCE | 
|  | +#endif | 
|  | +#include <features.h> | 
|  | +#define GPR_CPU_POSIX 1 | 
|  | +#define GPR_GCC_ATOMIC 1 | 
|  | +#define GPR_GCC_TLS 1 | 
|  | +#define GPR_POSIX_MULTIPOLL_WITH_POLL | 
|  | +#define GPR_POSIX_WAKEUP_FD 1 | 
|  | +#define GPR_POSIX_SOCKET 1 | 
|  | +#define GPR_POSIX_SOCKETADDR 1 | 
|  | +#define GPR_POSIX_ENV 1 | 
|  | +#define GPR_POSIX_NO_SPECIAL_WAKEUP_FD 1 | 
|  | +#define GPR_POSIX_SOCKETUTILS | 
|  | +#define GPR_POSIX_FILE 1 | 
|  | +#define GPR_POSIX_STRING 1 | 
|  | +#define GPR_POSIX_SUBPROCESS 1 | 
|  | +#define GPR_POSIX_SYNC 1 | 
|  | +#define GPR_POSIX_TIME 1 | 
|  | +#define GPR_POSIX_LOG 1 | 
|  | +#define GPR_GETPID_IN_UNISTD_H 1 | 
|  | +#define GPR_HAVE_MSG_NOSIGNAL 1 | 
|  | +#ifdef _LP64 | 
|  | +#define GPR_ARCH_64 1 | 
|  | +#else /* _LP64 */ | 
|  | +#define GPR_ARCH_32 1 | 
|  | +#endif /* _LP64 */ | 
|  | + | 
|  | +#elif defined(_WIN64) || defined(WIN64) | 
|  | #define GPR_PLATFORM_STRING "windows" | 
|  | #define GPR_WIN32 1 | 
|  | #define GPR_ARCH_64 1 | 
|  | diff --git a/third_party/grpc/src/core/iomgr/tcp_server_posix.c b/third_party/grpc/src/core/iomgr/tcp_server_posix.c | 
|  | index 5e07f82..44b970d 100644 | 
|  | --- a/third_party/grpc/src/core/iomgr/tcp_server_posix.c | 
|  | +++ b/third_party/grpc/src/core/iomgr/tcp_server_posix.c | 
|  | @@ -280,13 +280,38 @@ static int prepare_socket(int fd, const struct sockaddr *addr, | 
|  | goto error; | 
|  | } | 
|  |  | 
|  | -  if (!grpc_set_socket_nonblocking(fd, 1) || !grpc_set_socket_cloexec(fd, 1) || | 
|  | -      (addr->sa_family != AF_UNIX && (!grpc_set_socket_low_latency(fd, 1) || | 
|  | -                                      !grpc_set_socket_reuse_addr(fd, 1))) || | 
|  | -      !grpc_set_socket_no_sigpipe_if_possible(fd)) { | 
|  | -    gpr_log(GPR_ERROR, "Unable to configure socket %d: %s", fd, | 
|  | -            strerror(errno)); | 
|  | -    goto error; | 
|  | + | 
|  | +  if (!grpc_set_socket_nonblocking(fd, 1)) { | 
|  | +      gpr_log(GPR_ERROR, "Unable to set socket %d to nonblocking mode: %s", fd, | 
|  | +              strerror(errno)); | 
|  | +      goto error; | 
|  | +  } | 
|  | +  if (!grpc_set_socket_cloexec(fd, 1)) { | 
|  | +      gpr_log(GPR_ERROR, "Unable to set socket %d to close-on-exec: %s", fd, | 
|  | +              strerror(errno)); | 
|  | +      goto error; | 
|  | +  } | 
|  | + | 
|  | +  if (addr->sa_family != AF_UNIX) { | 
|  | +    if (!grpc_set_socket_low_latency(fd, 1)) { | 
|  | +      gpr_log(GPR_ERROR, "Unable to set socket %d to low-latency mode: %s", fd, | 
|  | +              strerror(errno)); | 
|  | +      goto error; | 
|  | +    } | 
|  | + | 
|  | +#if !defined(__MSYS__) | 
|  | +    if (!grpc_set_socket_reuse_addr(fd, 1)) { | 
|  | +      gpr_log(GPR_ERROR, "Unable to set SO_REUSEADDR on socket %d: %s", fd, | 
|  | +              strerror(errno)); | 
|  | +      goto error; | 
|  | +    } | 
|  | +#endif | 
|  | + | 
|  | +    if (!grpc_set_socket_no_sigpipe_if_possible(fd)) { | 
|  | +      gpr_log(GPR_ERROR, "Unable to set SO_NOSIGPIPE on socket %d: %s", fd, | 
|  | +              strerror(errno)); | 
|  | +      goto error; | 
|  | +    } | 
|  | } | 
|  |  | 
|  | GPR_ASSERT(addr_len < ~(socklen_t)0); | 
|  | diff --git a/third_party/grpc/src/core/support/log_linux.c b/third_party/grpc/src/core/support/log_linux.c | 
|  | index d66b7a3..93a0c1b 100644 | 
|  | --- a/third_party/grpc/src/core/support/log_linux.c | 
|  | +++ b/third_party/grpc/src/core/support/log_linux.c | 
|  | @@ -51,7 +51,6 @@ | 
|  | #include <stdarg.h> | 
|  | #include <string.h> | 
|  | #include <time.h> | 
|  | -#include <linux/unistd.h> | 
|  | #include <sys/syscall.h> | 
|  | #include <unistd.h> | 
|  |  | 
|  | diff --git a/tools/build_rules/genproto.bzl b/tools/build_rules/genproto.bzl | 
|  | index 62284a3..bc76cd1 100644 | 
|  | --- a/tools/build_rules/genproto.bzl | 
|  | +++ b/tools/build_rules/genproto.bzl | 
|  | @@ -25,6 +25,8 @@ def gensrcjar_impl(ctx): | 
|  | "JAR='%s'" % ctx.executable._jar.path, | 
|  | "OUTPUT='%s'" % out.path, | 
|  | "PROTO_COMPILER='%s'" % ctx.executable._proto_compiler.path, | 
|  | +        "GRPC_JAVA_PLUGIN='%s'" % ctx.executable.grpc_java_plugin.path if \ | 
|  | +            ctx.executable.grpc_java_plugin else "", | 
|  | "SOURCE='%s'" % ctx.file.src.path, | 
|  | ctx.executable._gensrcjar.path, | 
|  | ]), | 
|  | @@ -43,14 +45,19 @@ gensrcjar = rule( | 
|  | allow_files = proto_filetype, | 
|  | single_file = True, | 
|  | ), | 
|  | +        "grpc_java_plugin": attr.label( | 
|  | +            cfg = "host", | 
|  | +            executable = True, | 
|  | +            single_file = True, | 
|  | +        ), | 
|  | "_gensrcjar": attr.label( | 
|  | -            default = Label("@bazel_tools//tools/build_rules:gensrcjar"), | 
|  | +            default = Label("//tools/build_rules:gensrcjar"), | 
|  | executable = True, | 
|  | ), | 
|  | # TODO(bazel-team): this should be a hidden attribute with a default | 
|  | # value, but Skylark needs to support select first. | 
|  | "_proto_compiler": attr.label( | 
|  | -            default = Label("@bazel_tools//third_party/protobuf:protoc"), | 
|  | +            default = Label("//third_party/protobuf:protoc"), | 
|  | allow_files = True, | 
|  | executable = True, | 
|  | single_file = True, | 
|  | @@ -73,13 +80,42 @@ gensrcjar = rule( | 
|  | outputs = {"srcjar": "lib%{name}.srcjar"}, | 
|  | ) | 
|  |  | 
|  | +def cc_grpc_library(name, src): | 
|  | +  basename = src[:-len(".proto")] | 
|  | + | 
|  | +  native.genrule( | 
|  | +      name = name + "_codegen", | 
|  | +      srcs = [src], | 
|  | +      tools = ["//third_party/protobuf:protoc", "//third_party/grpc:cpp_plugin"], | 
|  | +      cmd = "\\\n".join([ | 
|  | +          "$(location //third_party/protobuf:protoc)", | 
|  | +          "    --plugin=protoc-gen-grpc=$(location //third_party/grpc:cpp_plugin)", | 
|  | +          "    --cpp_out=$(GENDIR)", | 
|  | +          "    --grpc_out=$(GENDIR)", | 
|  | +          "    $(location " + src + ")"]), | 
|  | +      outs = [basename + ".grpc.pb.h", basename + ".grpc.pb.cc", basename + ".pb.cc", basename + ".pb.h"]) | 
|  | + | 
|  | +  native.cc_library( | 
|  | +      name = name, | 
|  | +      srcs = [basename + ".grpc.pb.cc", basename + ".pb.cc"], | 
|  | +      hdrs = [basename + ".grpc.pb.h", basename + ".pb.h"], | 
|  | +      deps = ["//third_party/grpc:grpc++"], | 
|  | +      includes = ["."]) | 
|  | + | 
|  | # TODO(bazel-team): support proto => proto dependencies too | 
|  | -def java_proto_library(name, src): | 
|  | -  gensrcjar(name=name + "_srcjar", src=src) | 
|  | +def java_proto_library(name, src, use_grpc_plugin=False): | 
|  | +  grpc_java_plugin = None | 
|  | +  if use_grpc_plugin: | 
|  | +    grpc_java_plugin = "//third_party/grpc:grpc-java-plugin" | 
|  | + | 
|  | +  gensrcjar(name=name + "_srcjar", src=src, grpc_java_plugin=grpc_java_plugin) | 
|  | +  deps = ["//third_party/protobuf"] | 
|  | +  if use_grpc_plugin: | 
|  | +    deps += ["//third_party/grpc:grpc-jar", "//third_party:guava"] | 
|  | native.java_library( | 
|  | name=name, | 
|  | srcs=[name + "_srcjar"], | 
|  | -    deps=["@bazel_tools//third_party/protobuf"], | 
|  | +    deps=deps, | 
|  | # The generated code has lots of 'rawtypes' warnings. | 
|  | javacopts=["-Xlint:-rawtypes"], | 
|  | ) | 
|  | diff --git a/tools/build_rules/gensrcjar.sh b/tools/build_rules/gensrcjar.sh | 
|  | index b94408a..c1674a3 100755 | 
|  | --- a/tools/build_rules/gensrcjar.sh | 
|  | +++ b/tools/build_rules/gensrcjar.sh | 
|  | @@ -65,8 +65,14 @@ main() { | 
|  | "${PREPROCESSOR}" <"${SOURCE}" >"${processed_source}" \ | 
|  | || err "Preprocessor ${PREPROCESSOR} failed" | 
|  |  | 
|  | -  "${PROTO_COMPILER}" --java_out="${proto_output}" "${processed_source}" \ | 
|  | -      || err "proto_compiler failed" | 
|  | +  if [ -n "${GRPC_JAVA_PLUGIN}" ]; then | 
|  | +    "${PROTO_COMPILER}" --plugin=protoc-gen-grpc="${GRPC_JAVA_PLUGIN}" \ | 
|  | +        --grpc_out="${proto_output}" --java_out="${proto_output}" "${processed_source}" \ | 
|  | +        || err "proto_compiler failed" | 
|  | +  else | 
|  | +    "${PROTO_COMPILER}" --java_out="${proto_output}" "${processed_source}" \ | 
|  | +        || err "proto_compiler failed" | 
|  | +  fi | 
|  | find "${proto_output}" -exec touch -t "${TIMESTAMP}" '{}' \; \ | 
|  | || err "Failed to reset timestamps" | 
|  | "${JAR}" cMf "${OUTPUT}.tmp" -C "${proto_output}" . \ |