summaryrefslogtreecommitdiff
path: root/grpc/src/core/lib/surface/lame_client.cc
diff options
context:
space:
mode:
Diffstat (limited to 'grpc/src/core/lib/surface/lame_client.cc')
-rw-r--r--grpc/src/core/lib/surface/lame_client.cc67
1 files changed, 43 insertions, 24 deletions
diff --git a/grpc/src/core/lib/surface/lame_client.cc b/grpc/src/core/lib/surface/lame_client.cc
index d32cc28e..65e659ac 100644
--- a/grpc/src/core/lib/surface/lame_client.cc
+++ b/grpc/src/core/lib/surface/lame_client.cc
@@ -35,15 +35,23 @@
#include "src/core/lib/transport/connectivity_state.h"
#include "src/core/lib/transport/static_metadata.h"
+#define GRPC_ARG_LAME_FILTER_ERROR "grpc.lame_filter_error"
+
namespace grpc_core {
namespace {
struct ChannelData {
- ChannelData() : state_tracker("lame_channel", GRPC_CHANNEL_SHUTDOWN) {}
+ explicit ChannelData(grpc_channel_element_args* args)
+ : state_tracker("lame_channel", GRPC_CHANNEL_SHUTDOWN) {
+ grpc_error_handle err = grpc_channel_args_find_pointer<grpc_error>(
+ args->channel_args, GRPC_ARG_LAME_FILTER_ERROR);
+ if (err != nullptr) error = GRPC_ERROR_REF(err);
+ }
+
~ChannelData() { GRPC_ERROR_UNREF(error); }
- grpc_error* error = GRPC_ERROR_NONE;
+ grpc_error_handle error = GRPC_ERROR_NONE;
Mutex mu;
ConnectivityStateTracker state_tracker;
};
@@ -90,8 +98,8 @@ static void lame_start_transport_op(grpc_channel_element* elem,
}
}
-static grpc_error* lame_init_call_elem(grpc_call_element* elem,
- const grpc_call_element_args* args) {
+static grpc_error_handle lame_init_call_elem(
+ grpc_call_element* elem, const grpc_call_element_args* args) {
CallData* calld = static_cast<CallData*>(elem->call_data);
calld->call_combiner = args->call_combiner;
return GRPC_ERROR_NONE;
@@ -103,11 +111,9 @@ static void lame_destroy_call_elem(grpc_call_element* /*elem*/,
ExecCtx::Run(DEBUG_LOCATION, then_schedule_closure, GRPC_ERROR_NONE);
}
-static grpc_error* lame_init_channel_elem(grpc_channel_element* elem,
- grpc_channel_element_args* args) {
- GPR_ASSERT(args->is_first);
- GPR_ASSERT(args->is_last);
- new (elem->channel_data) ChannelData;
+static grpc_error_handle lame_init_channel_elem(
+ grpc_channel_element* elem, grpc_channel_element_args* args) {
+ new (elem->channel_data) ChannelData(args);
return GRPC_ERROR_NONE;
}
@@ -116,12 +122,25 @@ static void lame_destroy_channel_elem(grpc_channel_element* elem) {
chand->~ChannelData();
}
+// Channel arg vtable for a grpc_error_handle.
+void* ErrorCopy(void* p) {
+ grpc_error_handle error = static_cast<grpc_error_handle>(p);
+ return GRPC_ERROR_REF(error);
+}
+void ErrorDestroy(void* p) {
+ grpc_error_handle error = static_cast<grpc_error_handle>(p);
+ GRPC_ERROR_UNREF(error);
+}
+int ErrorCompare(void* p, void* q) { return GPR_ICMP(p, q); }
+const grpc_arg_pointer_vtable kLameFilterErrorArgVtable = {
+ ErrorCopy, ErrorDestroy, ErrorCompare};
+
} // namespace
-void SetLameFilterError(grpc_channel_element* elem, grpc_error* error) {
- GPR_ASSERT(elem->filter == &grpc_lame_filter);
- auto chand = static_cast<grpc_core::ChannelData*>(elem->channel_data);
- chand->error = error;
+grpc_arg MakeLameClientErrorArg(grpc_error_handle error) {
+ return grpc_channel_arg_pointer_create(
+ const_cast<char*>(GRPC_ARG_LAME_FILTER_ERROR), error,
+ &kLameFilterErrorArgVtable);
}
} // namespace grpc_core
@@ -146,20 +165,20 @@ grpc_channel* grpc_lame_client_channel_create(const char* target,
grpc_status_code error_code,
const char* error_message) {
grpc_core::ExecCtx exec_ctx;
- grpc_channel_element* elem;
- grpc_channel* channel =
- grpc_channel_create(target, nullptr, GRPC_CLIENT_LAME_CHANNEL, nullptr);
- elem = grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
GRPC_API_TRACE(
"grpc_lame_client_channel_create(target=%s, error_code=%d, "
"error_message=%s)",
3, (target, (int)error_code, error_message));
- grpc_core::SetLameFilterError(
- elem, grpc_error_set_str(
- grpc_error_set_int(
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("lame client channel"),
- GRPC_ERROR_INT_GRPC_STATUS, error_code),
- GRPC_ERROR_STR_GRPC_MESSAGE,
- grpc_slice_from_static_string(error_message)));
+ grpc_error_handle error = grpc_error_set_str(
+ grpc_error_set_int(
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("lame client channel"),
+ GRPC_ERROR_INT_GRPC_STATUS, error_code),
+ GRPC_ERROR_STR_GRPC_MESSAGE,
+ grpc_slice_from_static_string(error_message));
+ grpc_arg error_arg = grpc_core::MakeLameClientErrorArg(error);
+ grpc_channel_args args = {1, &error_arg};
+ grpc_channel* channel =
+ grpc_channel_create(target, &args, GRPC_CLIENT_LAME_CHANNEL, nullptr);
+ GRPC_ERROR_UNREF(error);
return channel;
}