diff --git a/include/grpc++/client_context.h b/include/grpc++/client_context.h index 1b6769dee11b8899c84ce8e17cd92fc6c1612fe5..8e7c3579e3c105e910300432c9b6fcab2c9c4bf5 100644 --- a/include/grpc++/client_context.h +++ b/include/grpc++/client_context.h @@ -280,6 +280,17 @@ class ClientContext { /// There is no guarantee the call will be cancelled. void TryCancel(); + /// Global Callbacks + /// + /// Can be set exactly once per application to install hooks whenever + /// a client context is constructed and destructed. + class GlobalCallbacks { + public: + virtual void DefaultConstructor(ClientContext* context) = 0; + virtual void Destructor(ClientContext* context) = 0; + }; + static void SetGlobalCallbacks(GlobalCallbacks* callbacks); + private: // Disallow copy and assign. ClientContext(const ClientContext&); diff --git a/src/cpp/client/client_context.cc b/src/cpp/client/client_context.cc index 9bb358b2339f123b58076ff0c6bc9fdb7dcbf153..2aa532808c54a2b2558ae4ac3b5fd0061fe55e00 100644 --- a/src/cpp/client/client_context.cc +++ b/src/cpp/client/client_context.cc @@ -45,17 +45,31 @@ namespace grpc { +class DefaultGlobalClientCallbacks GRPC_FINAL + : public ClientContext::GlobalCallbacks { + public: + void DefaultConstructor(ClientContext* context) GRPC_OVERRIDE {} + void Destructor(ClientContext* context) GRPC_OVERRIDE {} +}; + +static DefaultGlobalClientCallbacks g_default_client_callbacks; +static ClientContext::GlobalCallbacks* g_client_callbacks = + &g_default_client_callbacks; + ClientContext::ClientContext() : initial_metadata_received_(false), call_(nullptr), call_canceled_(false), deadline_(gpr_inf_future(GPR_CLOCK_REALTIME)), - propagate_from_call_(nullptr) {} + propagate_from_call_(nullptr) { + g_client_callbacks->DefaultConstructor(this); +} ClientContext::~ClientContext() { if (call_) { grpc_call_destroy(call_); } + g_client_callbacks->Destructor(this); } std::unique_ptr<ClientContext> ClientContext::FromServerContext( @@ -124,4 +138,11 @@ grpc::string ClientContext::peer() const { return peer; } +void ClientContext::SetGlobalCallbacks(GlobalCallbacks* client_callbacks) { + GPR_ASSERT(g_client_callbacks == &g_default_client_callbacks); + GPR_ASSERT(client_callbacks != NULL); + GPR_ASSERT(client_callbacks != &g_default_client_callbacks); + g_client_callbacks = client_callbacks; +} + } // namespace grpc diff --git a/src/python/grpcio/setup.py b/src/python/grpcio/setup.py index a948ca1fac6d819cb7ebc5d38ff0bb3f2aa7a63f..b8a98c3d859f2243bdcc6305d14edd74dc519f86 100644 --- a/src/python/grpcio/setup.py +++ b/src/python/grpcio/setup.py @@ -163,7 +163,7 @@ else: setuptools.setup( name='grpcio', - version='0.11.0b2', + version='0.12.0b0', ext_modules=CYTHON_EXTENSION_MODULES, packages=list(PACKAGES), package_dir=PACKAGE_DIRECTORIES, diff --git a/tools/run_tests/run_lcov.sh b/tools/run_tests/run_lcov.sh index ec97ebf0a5b8ca5c24352b6e79a16ad0edb491a3..796a0b5ceb2fe1834a1a84fc847dc0825120ad77 100755 --- a/tools/run_tests/run_lcov.sh +++ b/tools/run_tests/run_lcov.sh @@ -33,7 +33,7 @@ set -ex out=$(readlink -f ${1:-coverage}) root=$(readlink -f $(dirname $0)/../..) -shift +shift || true tmp=$(mktemp) cd $root tools/run_tests/run_tests.py -c gcov -l c c++ $@ || true