diff --git a/Makefile b/Makefile index 9523e95052b6a8bb83cb06608d575d306e052ae1..79dec086e49d385f83b1190187526fce0078b679 100644 --- a/Makefile +++ b/Makefile @@ -157,7 +157,7 @@ LD_asan = clang LDXX_asan = clang++ CPPFLAGS_asan = -O0 -fsanitize=address -fno-omit-frame-pointer LDFLAGS_asan = -fsanitize=address -DEFINES_asan = GRPC_TEST_SLOWDOWN_BUILD_FACTOR=5 +DEFINES_asan = GRPC_TEST_SLOWDOWN_BUILD_FACTOR=3 VALID_CONFIG_msan = 1 REQUIRE_CUSTOM_LIBRARIES_msan = 1 @@ -168,7 +168,7 @@ LDXX_msan = clang++-libc++ CPPFLAGS_msan = -O0 -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 OPENSSL_CFLAGS_msan = -DPURIFY LDFLAGS_msan = -fsanitize=memory -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -DEFINES_msan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=20 +DEFINES_msan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=4 VALID_CONFIG_ubsan = 1 REQUIRE_CUSTOM_LIBRARIES_ubsan = 1 @@ -179,7 +179,7 @@ LDXX_ubsan = clang++ CPPFLAGS_ubsan = -O1 -fsanitize=undefined -fno-omit-frame-pointer OPENSSL_CFLAGS_ubsan = -DPURIFY LDFLAGS_ubsan = -fsanitize=undefined -DEFINES_ubsan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=10 +DEFINES_ubsan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=3 VALID_CONFIG_gcov = 1 CC_gcov = gcc @@ -333,6 +333,19 @@ HOST_LDLIBS = $(LDLIBS) HAS_PKG_CONFIG = $(shell command -v pkg-config >/dev/null 2>&1 && echo true || echo false) +PC_TEMPLATE = prefix=$(prefix)\nexec_prefix=\$${prefix}\nincludedir=\$${prefix}/include\nlibdir=\$${exec_prefix}/lib\n\nName: $(PC_NAME)\nDescription: $(PC_DESCRIPTION)\nVersion: $(VERSION)\nCflags: -I\$${includedir} $(PC_CFLAGS)\nRequires.private: $(PC_REQUIRES_PRIVATE)\nLibs: -L\$${libdir}\nLibs.private: $(PC_LIBS_PRIVATE) + +# gpr .pc file +PC_NAME = gRPC Portable Runtime +PC_DESCRIPTION = gRPC Portable Runtime +PC_CFLAGS = -pthread +PC_REQUIRES_PRIVATE = +PC_LIBS_PRIVATE = -lpthread +ifeq ($(SYSTEM),Darwin) +PC_LIBS_PRIVATE += -lrt +endif +GPR_PC_FILE := $(PC_TEMPLATE) + ifeq ($(SYSTEM),MINGW32) SHARED_EXT = dll endif @@ -446,6 +459,9 @@ else HAS_EMBEDDED_PROTOBUF = true endif +PC_REQUIRES_GRPC = gpr +PC_LIBS_GRPC = + ifeq ($(HAS_SYSTEM_ZLIB),false) ifeq ($(HAS_EMBEDDED_ZLIB),true) ZLIB_DEP = $(LIBDIR)/$(CONFIG)/zlib/libz.a @@ -458,14 +474,21 @@ else ifeq ($(HAS_PKG_CONFIG),true) CPPFLAGS += $(shell pkg-config --cflags zlib) LDFLAGS += $(shell pkg-config --libs-only-L zlib) +PC_REQUIRES_GRPC += zlib +else +PC_LIBS_GRPC += -lz endif endif OPENSSL_PKG_CONFIG = false +PC_REQUIRES_SECURE = +PC_LIBS_SECURE = + ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true) ifeq ($(HAS_PKG_CONFIG),true) OPENSSL_PKG_CONFIG = true +PC_REQUIRES_SECURE = openssl CPPFLAGS := $(shell pkg-config --cflags openssl) $(CPPFLAGS) LDFLAGS_OPENSSL_PKG_CONFIG = $(shell pkg-config --libs-only-L openssl) ifeq ($(SYSTEM),Linux) @@ -478,6 +501,7 @@ else LIBS_SECURE = $(OPENSSL_LIBS) ifeq ($(OPENSSL_REQUIRES_DL),true) LIBS_SECURE += dl +PC_LIBS_SECURE = $(addprefix -l, $(LIBS_SECURE)) endif endif else @@ -501,11 +525,31 @@ else LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE)) endif +# grpc .pc file +PC_NAME = gRPC +PC_DESCRIPTION = high performance general RPC framework +PC_CFLAGS = +PC_REQUIRES_PRIVATE = $(PC_REQUIRES_GRPC) $(PC_REQUIRES_SECURE) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) $(PC_LIBS_SECURE) +GRPC_PC_FILE := $(PC_TEMPLATE) + +# gprc_unsecure .pc file +PC_NAME = gRPC unsecure +PC_DESCRIPTION = high performance general RPC framework without SSL +PC_CFLAGS = +PC_REQUIRES_PRIVATE = $(PC_REQUIRES_GRPC) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) +GRPC_UNSECURE_PC_FILE := $(PC_TEMPLATE) + PROTOBUF_PKG_CONFIG = false +PC_REQUIRES_GRPCXX = +PC_LIBS_GRPCXX = + ifeq ($(HAS_SYSTEM_PROTOBUF),true) ifeq ($(HAS_PKG_CONFIG),true) PROTOBUF_PKG_CONFIG = true +PC_REQUIRES_GRPCXX = protobuf CPPFLAGS := $(shell pkg-config --cflags protobuf) $(CPPFLAGS) LDFLAGS_PROTOBUF_PKG_CONFIG = $(shell pkg-config --libs-only-L protobuf) ifeq ($(SYSTEM),Linux) @@ -513,6 +557,8 @@ ifneq ($(LDFLAGS_PROTOBUF_PKG_CONFIG),) LDFLAGS_PROTOBUF_PKG_CONFIG += $(shell pkg-config --libs-only-L protobuf | sed s/L/Wl,-rpath,/) endif endif +else +PC_LIBS_GRPCXX = -lprotobuf endif else ifeq ($(HAS_EMBEDDED_PROTOBUF),true) @@ -536,6 +582,22 @@ else LDLIBS_PROTOBUF += $(addprefix -l, $(LIBS_PROTOBUF)) endif +# grpc++ .pc file +PC_NAME = gRPC++ +PC_DESCRIPTION = C++ wrapper for gRPC +PC_CFLAGS = +PC_REQUIRES_PRIVATE = grpc $(PC_REQUIRES_GRPCXX) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) +GRPCXX_PC_FILE := $(PC_TEMPLATE) + +# grpc++_unsecure .pc file +PC_NAME = gRPC++ unsecure +PC_DESCRIPTION = C++ wrapper for gRPC without SSL +PC_CFLAGS = +PC_REQUIRES_PRIVATE = grpc_unsecure $(PC_REQUIRES_GRPCXX) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) +GRPCXX_UNSECURE_PC_FILE := $(PC_TEMPLATE) + ifeq ($(MAKECMDGOALS),clean) NO_DEPS = true endif @@ -1297,15 +1359,15 @@ $(LIBDIR)/$(CONFIG)/protobuf/libprotobuf.a: third_party/protobuf/configure static: static_c static_cxx -static_c: $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a +static_c: pc_c pc_c_unsecure $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a -static_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a +static_cxx: pc_cxx pc_cxx_unsecure pc_gpr $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a shared: shared_c shared_cxx -shared_c: $(LIBDIR)/$(CONFIG)/libgpr.$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/libgrpc.$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.$(SHARED_EXT) +shared_c: pc_c pc_c_unsecure pc_gpr $(LIBDIR)/$(CONFIG)/libgpr.$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/libgrpc.$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.$(SHARED_EXT) -shared_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++.$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.$(SHARED_EXT) +shared_cxx: pc_cxx pc_cxx_unsecure $(LIBDIR)/$(CONFIG)/libgrpc++.$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.$(SHARED_EXT) shared_csharp: shared_c $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext.$(SHARED_EXT) grpc_csharp_ext: shared_csharp @@ -1315,6 +1377,15 @@ plugins: $(PROTOC_PLUGINS) privatelibs: privatelibs_c privatelibs_cxx privatelibs_c: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fake_security.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds_posix.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_with_poll.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_fullstack_with_poll.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_one_byte_at_a_time.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_with_grpc_trace.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_message_length.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libend2end_test_registered_call.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload_and_call_creds.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_flags.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_server_finishes_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_with_high_initial_sequence_number.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a $(LIBDIR)/$(CONFIG)/libbad_client_test.a +pc_gpr: $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc + +pc_c: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc + +pc_c_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc + +pc_cxx: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc + +pc_cxx_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a $(LIBDIR)/$(CONFIG)/libinterop_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a $(LIBDIR)/$(CONFIG)/libinterop_server_main.a $(LIBDIR)/$(CONFIG)/libqps.a @@ -2533,6 +2604,31 @@ ifeq ($(CONFIG),opt) $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext.$(SHARED_EXT) endif +$(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo -e "$(GPR_PC_FILE)" >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo -e "$(GRPC_PC_FILE)" >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo -e "$(GRPC_UNSECURE_PC_FILE)" >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo -e "$(GRPCXX_PC_FILE)" >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo -e "$(GRPCXX_UNSECURE_PC_FILE)" >$@ + ifeq ($(NO_PROTOC),true) $(GENDIR)/examples/pubsub/empty.pb.cc: protoc_dep_error $(GENDIR)/examples/pubsub/empty.grpc.pb.cc: protoc_dep_error @@ -2740,7 +2836,7 @@ install-headers_cxx: install-static: install-static_c install-static_cxx -install-static_c: static_c strip-static_c +install-static_c: static_c strip-static_c install-pkg-config_c $(E) "[INSTALL] Installing libgpr.a" $(Q) $(INSTALL) -d $(prefix)/lib $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgpr.a $(prefix)/lib/libgpr.a @@ -2751,7 +2847,7 @@ install-static_c: static_c strip-static_c $(Q) $(INSTALL) -d $(prefix)/lib $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(prefix)/lib/libgrpc_unsecure.a -install-static_cxx: static_cxx strip-static_cxx +install-static_cxx: static_cxx strip-static_cxx install-pkg-config_cxx $(E) "[INSTALL] Installing libgrpc++.a" $(Q) $(INSTALL) -d $(prefix)/lib $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(prefix)/lib/libgrpc++.a @@ -2761,7 +2857,7 @@ install-static_cxx: static_cxx strip-static_cxx -install-shared_c: shared_c strip-shared_c +install-shared_c: shared_c strip-shared_c install-pkg-config_c ifeq ($(SYSTEM),MINGW32) $(E) "[INSTALL] Installing gpr.$(SHARED_EXT)" $(Q) $(INSTALL) -d $(prefix)/lib @@ -2811,7 +2907,7 @@ endif endif -install-shared_cxx: shared_cxx strip-shared_cxx install-shared_c +install-shared_cxx: shared_cxx strip-shared_cxx install-shared_c install-pkg-config_cxx ifeq ($(SYSTEM),MINGW32) $(E) "[INSTALL] Installing grpc++.$(SHARED_EXT)" $(Q) $(INSTALL) -d $(prefix)/lib @@ -2886,6 +2982,19 @@ else $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_ruby_plugin $(prefix)/bin/grpc_ruby_plugin endif +install-pkg-config_c: pc_gpr pc_c pc_c_unsecure + $(E) "[INSTALL] Installing C pkg-config files" + $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc $(prefix)/lib/pkgconfig/gpr.pc + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc $(prefix)/lib/pkgconfig/grpc.pc + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc $(prefix)/lib/pkgconfig/grpc_unsecure.pc + +install-pkg-config_cxx: pc_cxx pc_cxx_unsecure + $(E) "[INSTALL] Installing C++ pkg-config files" + $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc $(prefix)/lib/pkgconfig/grpc++.pc + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc $(prefix)/lib/pkgconfig/grpc++_unsecure.pc + install-certs: etc/roots.pem $(E) "[INSTALL] Installing root certificates" $(Q) $(INSTALL) -d $(prefix)/share/grpc diff --git a/src/core/iomgr/fd_posix.c b/src/core/iomgr/fd_posix.c index 2075c43945d7cfb152a24baa12c654740711e21b..e8c24c772a1dcff07fc93a2fc84faf8e2e926dd3 100644 --- a/src/core/iomgr/fd_posix.c +++ b/src/core/iomgr/fd_posix.c @@ -74,6 +74,7 @@ static void freelist_fd(grpc_fd *fd) { gpr_mu_lock(&fd_freelist_mu); fd->freelist_next = fd_freelist; fd_freelist = fd; + grpc_iomgr_unregister_object(&fd->iomgr_object); gpr_mu_unlock(&fd_freelist_mu); } @@ -139,7 +140,6 @@ static void unref_by(grpc_fd *fd, int n) { #endif old = gpr_atm_full_fetch_add(&fd->refst, -n); if (old == n) { - grpc_iomgr_unregister_object(&fd->iomgr_object); freelist_fd(fd); } else { GPR_ASSERT(old > n); diff --git a/src/core/iomgr/resolve_address_posix.c b/src/core/iomgr/resolve_address_posix.c index 20d8c58eb4b1fda13a5cb89566b2622a2b2d4101..dbf884c76957c6d64c377cb8f7cf69f266556472 100644 --- a/src/core/iomgr/resolve_address_posix.c +++ b/src/core/iomgr/resolve_address_posix.c @@ -155,9 +155,9 @@ static void do_request(void *rp) { grpc_resolve_cb cb = r->cb; gpr_free(r->name); gpr_free(r->default_port); + cb(arg, resolved); grpc_iomgr_unregister_object(&r->iomgr_object); gpr_free(r); - cb(arg, resolved); } void grpc_resolved_addresses_destroy(grpc_resolved_addresses *addrs) { diff --git a/src/core/surface/call.c b/src/core/surface/call.c index 8550056bcbc5166a848e1c9b3d2cce408c1a987c..ae1b215767f81a4388c4d143aef20d5a5171ae68 100644 --- a/src/core/surface/call.c +++ b/src/core/surface/call.c @@ -160,6 +160,8 @@ struct grpc_call { gpr_uint8 bound_pollset; /* is an error status set */ gpr_uint8 error_status_set; + /** should the alarm be cancelled */ + gpr_uint8 cancel_alarm; /* flags with bits corresponding to write states allowing us to determine what was sent */ @@ -471,6 +473,7 @@ static void unlock(grpc_call *call) { int completing_requests = 0; int start_op = 0; int i; + int cancel_alarm = 0; memset(&op, 0, sizeof(op)); @@ -478,6 +481,9 @@ static void unlock(grpc_call *call) { start_op = op.cancel_with_status != GRPC_STATUS_OK; call->cancel_with_status = GRPC_STATUS_OK; /* reset */ + cancel_alarm = call->cancel_alarm; + call->cancel_alarm = 0; + if (!call->receiving && need_more_data(call)) { op.recv_ops = &call->recv_ops; op.recv_state = &call->recv_state; @@ -512,6 +518,10 @@ static void unlock(grpc_call *call) { gpr_mu_unlock(&call->mu); + if (cancel_alarm) { + grpc_alarm_cancel(&call->alarm); + } + if (start_op) { execute_op(call, &op); } @@ -804,10 +814,7 @@ static void call_on_done_recv(void *pc, int success) { if (call->recv_state == GRPC_STREAM_CLOSED) { GPR_ASSERT(call->read_state <= READ_STATE_STREAM_CLOSED); call->read_state = READ_STATE_STREAM_CLOSED; - if (call->have_alarm) { - grpc_alarm_cancel(&call->alarm); - call->have_alarm = 0; - } + call->cancel_alarm |= call->have_alarm; GRPC_CALL_INTERNAL_UNREF(call, "closed", 0); } finish_read_ops(call); @@ -986,7 +993,7 @@ static void finish_read_ops(grpc_call *call) { switch (call->read_state) { case READ_STATE_STREAM_CLOSED: - if (empty) { + if (empty && !call->have_alarm) { finish_ioreq_op(call, GRPC_IOREQ_RECV_CLOSE, 1); } /* fallthrough */ @@ -1084,10 +1091,7 @@ void grpc_call_destroy(grpc_call *c) { lock(c); GPR_ASSERT(!c->destroy_called); c->destroy_called = 1; - if (c->have_alarm) { - grpc_alarm_cancel(&c->alarm); - c->have_alarm = 0; - } + c->cancel_alarm |= c->have_alarm; cancel = c->read_state != READ_STATE_STREAM_CLOSED; unlock(c); if (cancel) grpc_call_cancel(c); @@ -1167,12 +1171,14 @@ grpc_call *grpc_call_from_top_element(grpc_call_element *elem) { static void call_alarm(void *arg, int success) { grpc_call *call = arg; + lock(call); + call->have_alarm = 0; if (success) { - lock(call); cancel_with_status(call, GRPC_STATUS_DEADLINE_EXCEEDED, "Deadline Exceeded"); - unlock(call); } + finish_read_ops(call); + unlock(call); GRPC_CALL_INTERNAL_UNREF(call, "alarm", 1); } diff --git a/templates/Makefile.template b/templates/Makefile.template index 3b04d7d04152e1ae9cb7438b977bf8e9a67cb3b9..f0cd0d97e3d60dbaf2d827ead3accc56fa6d538a 100644 --- a/templates/Makefile.template +++ b/templates/Makefile.template @@ -171,7 +171,7 @@ LD_asan = clang LDXX_asan = clang++ CPPFLAGS_asan = -O0 -fsanitize=address -fno-omit-frame-pointer LDFLAGS_asan = -fsanitize=address -DEFINES_asan = GRPC_TEST_SLOWDOWN_BUILD_FACTOR=5 +DEFINES_asan = GRPC_TEST_SLOWDOWN_BUILD_FACTOR=3 VALID_CONFIG_msan = 1 REQUIRE_CUSTOM_LIBRARIES_msan = 1 @@ -182,7 +182,7 @@ LDXX_msan = clang++-libc++ CPPFLAGS_msan = -O0 -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 OPENSSL_CFLAGS_msan = -DPURIFY LDFLAGS_msan = -fsanitize=memory -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -DEFINES_msan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=20 +DEFINES_msan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=4 VALID_CONFIG_ubsan = 1 REQUIRE_CUSTOM_LIBRARIES_ubsan = 1 @@ -193,7 +193,7 @@ LDXX_ubsan = clang++ CPPFLAGS_ubsan = -O1 -fsanitize=undefined -fno-omit-frame-pointer OPENSSL_CFLAGS_ubsan = -DPURIFY LDFLAGS_ubsan = -fsanitize=undefined -DEFINES_ubsan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=10 +DEFINES_ubsan = NDEBUG GRPC_TEST_SLOWDOWN_BUILD_FACTOR=3 VALID_CONFIG_gcov = 1 CC_gcov = gcc @@ -347,6 +347,30 @@ HOST_LDLIBS = $(LDLIBS) HAS_PKG_CONFIG = $(shell command -v pkg-config >/dev/null 2>&1 && echo true || echo false) +PC_TEMPLATE = prefix=$(prefix)\n\ +exec_prefix=${'\$${prefix}'}\n\ +includedir=${'\$${prefix}'}/include\n\ +libdir=${'\$${exec_prefix}'}/lib\n\ +\n\ +Name: $(PC_NAME)\n\ +Description: $(PC_DESCRIPTION)\n\ +Version: $(VERSION)\n\ +Cflags: -I${'\$${includedir}'} $(PC_CFLAGS)\n\ +Requires.private: $(PC_REQUIRES_PRIVATE)\n\ +Libs: -L${'\$${libdir}'}\n\ +Libs.private: $(PC_LIBS_PRIVATE) + +# gpr .pc file +PC_NAME = gRPC Portable Runtime +PC_DESCRIPTION = gRPC Portable Runtime +PC_CFLAGS = -pthread +PC_REQUIRES_PRIVATE = +PC_LIBS_PRIVATE = -lpthread +ifeq ($(SYSTEM),Darwin) +PC_LIBS_PRIVATE += -lrt +endif +GPR_PC_FILE := $(PC_TEMPLATE) + ifeq ($(SYSTEM),MINGW32) SHARED_EXT = dll endif @@ -460,6 +484,9 @@ else HAS_EMBEDDED_PROTOBUF = true endif +PC_REQUIRES_GRPC = gpr +PC_LIBS_GRPC = + ifeq ($(HAS_SYSTEM_ZLIB),false) ifeq ($(HAS_EMBEDDED_ZLIB),true) ZLIB_DEP = $(LIBDIR)/$(CONFIG)/zlib/libz.a @@ -472,14 +499,21 @@ else ifeq ($(HAS_PKG_CONFIG),true) CPPFLAGS += $(shell pkg-config --cflags zlib) LDFLAGS += $(shell pkg-config --libs-only-L zlib) +PC_REQUIRES_GRPC += zlib +else +PC_LIBS_GRPC += -lz endif endif OPENSSL_PKG_CONFIG = false +PC_REQUIRES_SECURE = +PC_LIBS_SECURE = + ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true) ifeq ($(HAS_PKG_CONFIG),true) OPENSSL_PKG_CONFIG = true +PC_REQUIRES_SECURE = openssl CPPFLAGS := $(shell pkg-config --cflags openssl) $(CPPFLAGS) LDFLAGS_OPENSSL_PKG_CONFIG = $(shell pkg-config --libs-only-L openssl) ifeq ($(SYSTEM),Linux) @@ -492,6 +526,7 @@ else LIBS_SECURE = $(OPENSSL_LIBS) ifeq ($(OPENSSL_REQUIRES_DL),true) LIBS_SECURE += dl +PC_LIBS_SECURE = $(addprefix -l, $(LIBS_SECURE)) endif endif else @@ -515,11 +550,31 @@ else LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE)) endif +# grpc .pc file +PC_NAME = gRPC +PC_DESCRIPTION = high performance general RPC framework +PC_CFLAGS = +PC_REQUIRES_PRIVATE = $(PC_REQUIRES_GRPC) $(PC_REQUIRES_SECURE) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) $(PC_LIBS_SECURE) +GRPC_PC_FILE := $(PC_TEMPLATE) + +# gprc_unsecure .pc file +PC_NAME = gRPC unsecure +PC_DESCRIPTION = high performance general RPC framework without SSL +PC_CFLAGS = +PC_REQUIRES_PRIVATE = $(PC_REQUIRES_GRPC) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) +GRPC_UNSECURE_PC_FILE := $(PC_TEMPLATE) + PROTOBUF_PKG_CONFIG = false +PC_REQUIRES_GRPCXX = +PC_LIBS_GRPCXX = + ifeq ($(HAS_SYSTEM_PROTOBUF),true) ifeq ($(HAS_PKG_CONFIG),true) PROTOBUF_PKG_CONFIG = true +PC_REQUIRES_GRPCXX = protobuf CPPFLAGS := $(shell pkg-config --cflags protobuf) $(CPPFLAGS) LDFLAGS_PROTOBUF_PKG_CONFIG = $(shell pkg-config --libs-only-L protobuf) ifeq ($(SYSTEM),Linux) @@ -527,6 +582,8 @@ ifneq ($(LDFLAGS_PROTOBUF_PKG_CONFIG),) LDFLAGS_PROTOBUF_PKG_CONFIG += $(shell pkg-config --libs-only-L protobuf | sed s/L/Wl,-rpath,/) endif endif +else +PC_LIBS_GRPCXX = -lprotobuf endif else ifeq ($(HAS_EMBEDDED_PROTOBUF),true) @@ -550,6 +607,22 @@ else LDLIBS_PROTOBUF += $(addprefix -l, $(LIBS_PROTOBUF)) endif +# grpc++ .pc file +PC_NAME = gRPC++ +PC_DESCRIPTION = C++ wrapper for gRPC +PC_CFLAGS = +PC_REQUIRES_PRIVATE = grpc $(PC_REQUIRES_GRPCXX) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) +GRPCXX_PC_FILE := $(PC_TEMPLATE) + +# grpc++_unsecure .pc file +PC_NAME = gRPC++ unsecure +PC_DESCRIPTION = C++ wrapper for gRPC without SSL +PC_CFLAGS = +PC_REQUIRES_PRIVATE = grpc_unsecure $(PC_REQUIRES_GRPCXX) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) +GRPCXX_UNSECURE_PC_FILE := $(PC_TEMPLATE) + ifeq ($(MAKECMDGOALS),clean) NO_DEPS = true endif @@ -740,7 +813,7 @@ $(LIBDIR)/$(CONFIG)/protobuf/libprotobuf.a: third_party/protobuf/configure static: static_c static_cxx -static_c: \ +static_c: pc_c pc_c_unsecure \ % for lib in libs: % if lib.build == 'all' and lib.language == 'c': $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ @@ -748,7 +821,7 @@ static_c: \ % endfor -static_cxx: \ +static_cxx: pc_cxx pc_cxx_unsecure pc_gpr\ % for lib in libs: % if lib.build == 'all' and lib.language == 'c++': $(LIBDIR)/$(CONFIG)/lib${lib.name}.a\ @@ -758,7 +831,7 @@ static_cxx: \ shared: shared_c shared_cxx -shared_c: \ +shared_c: pc_c pc_c_unsecure pc_gpr\ % for lib in libs: % if lib.build == 'all' and lib.language == 'c': $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\ @@ -766,7 +839,7 @@ shared_c: \ % endfor -shared_cxx: \ +shared_cxx: pc_cxx pc_cxx_unsecure \ % for lib in libs: % if lib.build == 'all' and lib.language == 'c++': $(LIBDIR)/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\ @@ -794,6 +867,15 @@ privatelibs_c: \ % endif % endfor +pc_gpr: $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc + +pc_c: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc + +pc_c_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc + +pc_cxx: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc + +pc_cxx_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc privatelibs_cxx: \ % for lib in libs: @@ -966,6 +1048,31 @@ ifeq ($(CONFIG),opt) % endfor endif +$(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo -e "$(GPR_PC_FILE)" >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo -e "$(GRPC_PC_FILE)" >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo -e "$(GRPC_UNSECURE_PC_FILE)" >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo -e "$(GRPCXX_PC_FILE)" >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo -e "$(GRPCXX_UNSECURE_PC_FILE)" >$@ + % for p in protos: ifeq ($(NO_PROTOC),true) $(GENDIR)/${p}.pb.cc: protoc_dep_error @@ -1040,7 +1147,7 @@ install-headers_cxx: install-static: install-static_c install-static_cxx -install-static_c: static_c strip-static_c +install-static_c: static_c strip-static_c install-pkg-config_c % for lib in libs: % if lib.language == "c": % if lib.build == "all": @@ -1051,7 +1158,7 @@ install-static_c: static_c strip-static_c % endif % endfor -install-static_cxx: static_cxx strip-static_cxx +install-static_cxx: static_cxx strip-static_cxx install-pkg-config_cxx % for lib in libs: % if lib.language == "c++": % if lib.build == "all": @@ -1090,10 +1197,10 @@ endif endif </%def> -install-shared_c: shared_c strip-shared_c +install-shared_c: shared_c strip-shared_c install-pkg-config_c ${install_shared("c")} -install-shared_cxx: shared_cxx strip-shared_cxx install-shared_c +install-shared_cxx: shared_cxx strip-shared_cxx install-shared_c install-pkg-config_cxx ${install_shared("c++")} install-shared_csharp: shared_csharp strip-shared_csharp @@ -1112,6 +1219,19 @@ else % endfor endif +install-pkg-config_c: pc_gpr pc_c pc_c_unsecure + $(E) "[INSTALL] Installing C pkg-config files" + $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc $(prefix)/lib/pkgconfig/gpr.pc + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc $(prefix)/lib/pkgconfig/grpc.pc + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc $(prefix)/lib/pkgconfig/grpc_unsecure.pc + +install-pkg-config_cxx: pc_cxx pc_cxx_unsecure + $(E) "[INSTALL] Installing C++ pkg-config files" + $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc $(prefix)/lib/pkgconfig/grpc++.pc + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc $(prefix)/lib/pkgconfig/grpc++_unsecure.pc + install-certs: etc/roots.pem $(E) "[INSTALL] Installing root certificates" $(Q) $(INSTALL) -d $(prefix)/share/grpc