Skip to content

Commit

Permalink
[C++ BUILD] Internal changes for base context propagation.
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 663460841
  • Loading branch information
nanahpang authored and copybara-github committed Aug 15, 2024
1 parent 910953e commit 8b4a8eb
Show file tree
Hide file tree
Showing 9 changed files with 170 additions and 2 deletions.
21 changes: 21 additions & 0 deletions BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,7 @@ grpc_cc_library(
],
visibility = ["@grpc:grpc++_public_hdrs"],
deps = [
"global_callback_hook",
"grpc_public_hdrs",
"//src/core:gpr_atm",
],
Expand Down Expand Up @@ -951,6 +952,7 @@ grpc_cc_library(
tags = ["nofixdeps"],
visibility = ["@grpc:public"],
deps = [
"global_callback_hook",
"grpc++_base",
"//src/core:gpr_atm",
"//src/core:slice",
Expand Down Expand Up @@ -1260,6 +1262,7 @@ grpc_cc_library(
deps = [
"channel_arg_names",
"generic_stub_internal",
"global_callback_hook",
"gpr",
"grpc++_base_unsecure",
"grpc++_codegen_proto",
Expand Down Expand Up @@ -2455,6 +2458,7 @@ grpc_cc_library(
"config",
"exec_ctx",
"generic_stub_internal",
"global_callback_hook",
"gpr",
"grpc",
"grpc++_codegen_proto",
Expand Down Expand Up @@ -2544,6 +2548,7 @@ grpc_cc_library(
"config",
"exec_ctx",
"generic_stub_internal",
"global_callback_hook",
"gpr",
"grpc_base",
"grpc_core_credentials_header",
Expand Down Expand Up @@ -4913,6 +4918,22 @@ grpc_cc_library(
],
)

grpc_cc_library(
name = "global_callback_hook",
srcs = [
"src/cpp/client/global_callback_hook.cc",
],
hdrs = [
"include/grpcpp/support/global_callback_hook.h",
],
external_deps = [
"absl/base:no_destructor",
"absl/log:check",
"absl/functional:function_ref",
],
language = "c++",
)

# TODO(yashykt): Remove the UPB definitions from here once they are no longer needed
### UPB Targets

Expand Down
13 changes: 13 additions & 0 deletions CMakeLists.txt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions build_autogenerated.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions gRPC-C++.podspec

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 24 additions & 2 deletions include/grpcpp/support/callback_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <grpcpp/impl/codegen/channel_interface.h>
#include <grpcpp/impl/completion_queue_tag.h>
#include <grpcpp/support/config.h>
#include <grpcpp/support/global_callback_hook.h>
#include <grpcpp/support/status.h>

namespace grpc {
Expand Down Expand Up @@ -127,7 +128,18 @@ class CallbackWithStatusTag : public grpc_completion_queue_functor {
auto status = std::move(status_);
func_ = nullptr; // reset to clear this out for sure
status_ = Status(); // reset to clear this out for sure
CatchingCallback(std::move(func), std::move(status));
GetGlobalCallbackHook()->RunCallback(
call_, [func = std::move(func), status = std::move(status)]() {
#if GRPC_ALLOW_EXCEPTIONS
try {
func(status);
} catch (...) {
// nothing to return or change here, just don't crash the library
}
#else // GRPC_ALLOW_EXCEPTIONS
func(status);
#endif // GRPC_ALLOW_EXCEPTIONS
});
grpc_call_unref(call_);
}
};
Expand Down Expand Up @@ -214,7 +226,17 @@ class CallbackWithSuccessTag : public grpc_completion_queue_functor {
#endif

if (do_callback) {
CatchingCallback(func_, ok);
GetGlobalCallbackHook()->RunCallback(call_, [this, ok]() {
#if GRPC_ALLOW_EXCEPTIONS
try {
func_(ok);
} catch (...) {
// nothing to return or change here, just don't crash the library
}
#else // GRPC_ALLOW_EXCEPTIONS
func_(ok);
#endif // GRPC_ALLOW_EXCEPTIONS
});
}
}
};
Expand Down
58 changes: 58 additions & 0 deletions include/grpcpp/support/global_callback_hook.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// Copyright 2024 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef GRPCPP_SUPPORT_GLOBAL_CALLBACK_HOOK_H
#define GRPCPP_SUPPORT_GLOBAL_CALLBACK_HOOK_H

#include "absl/functional/function_ref.h"

struct grpc_call;

namespace grpc {

class GlobalCallbackHook {
public:
virtual ~GlobalCallbackHook() = default;
virtual void RunCallback(grpc_call* call,
absl::FunctionRef<void()> callback) = 0;

protected:
// An exception-safe way of invoking a user-specified callback function.
template <class Func, class... Args>
void CatchingCallback(Func&& func, Args&&... args) {
#if GRPC_ALLOW_EXCEPTIONS
try {
func(std::forward<Args>(args)...);
} catch (...) {
// nothing to return or change here, just don't crash the library
}
#else // GRPC_ALLOW_EXCEPTIONS
func(std::forward<Args>(args)...);
#endif // GRPC_ALLOW_EXCEPTIONS
}
};

class DefaultGlobalCallbackHook final : public GlobalCallbackHook {
public:
void RunCallback(grpc_call* call,
absl::FunctionRef<void()> callback) override {
CatchingCallback(callback);
}
};

std::shared_ptr<GlobalCallbackHook> GetGlobalCallbackHook();
void SetGlobalCallbackHook(GlobalCallbackHook* hook);
} // namespace grpc

#endif // GRPCPP_SUPPORT_GLOBAL_CALLBACK_HOOK_H
Loading

0 comments on commit 8b4a8eb

Please sign in to comment.