Clean up C++ filter API.

pull/9067/head
Mark D. Roth 8 years ago
parent bcd54cdf7d
commit aa1cd14729
  1. 7
      src/core/lib/channel/channel_stack.h
  2. 40
      src/cpp/common/channel_filter.h
  3. 17
      test/cpp/common/channel_filter_test.cc

@ -34,6 +34,13 @@
#ifndef GRPC_CORE_LIB_CHANNEL_CHANNEL_STACK_H
#define GRPC_CORE_LIB_CHANNEL_CHANNEL_STACK_H
//////////////////////////////////////////////////////////////////////////////
// IMPORTANT NOTE:
//
// When you update this API, please make the corresponding changes to
// the C++ API in src/cpp/common/channel_filter.{h,cc}
//////////////////////////////////////////////////////////////////////////////
/* A channel filter defines how operations on a channel are implemented.
Channel filters are chained together to create full channels, and if those
chains are linear, then channel stacks provide a mechanism to minimize

@ -217,14 +217,13 @@ class TransportStreamOp {
class ChannelData {
public:
virtual ~ChannelData() {
if (peer_) gpr_free((void *)peer_);
}
/// Initializes the call data.
virtual grpc_error *Init() { return GRPC_ERROR_NONE; }
/// Caller does NOT take ownership of result.
const char *peer() const { return peer_; }
virtual grpc_error *Init(grpc_exec_ctx *exec_ctx,
grpc_channel_element_args *args) {
return GRPC_ERROR_NONE;
}
// TODO(roth): Find a way to avoid passing elem into these methods.
@ -235,11 +234,7 @@ class ChannelData {
const grpc_channel_info *channel_info);
protected:
/// Takes ownership of \a peer.
ChannelData(const grpc_channel_args &args, const char *peer) : peer_(peer) {}
private:
const char *peer_;
ChannelData() {}
};
/// Represents call data.
@ -248,7 +243,10 @@ class CallData {
virtual ~CallData() {}
/// Initializes the call data.
virtual grpc_error *Init() { return GRPC_ERROR_NONE; }
virtual grpc_error *Init(grpc_exec_ctx *exec_ctx, ChannelData *channel_data,
grpc_channel_element_args *args) {
return GRPC_ERROR_NONE;
}
// TODO(roth): Find a way to avoid passing elem into these methods.
@ -266,7 +264,7 @@ class CallData {
virtual char *GetPeer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem);
protected:
explicit CallData(const ChannelData &) {}
CallData() {}
};
namespace internal {
@ -282,14 +280,8 @@ class ChannelFilter final {
static grpc_error *InitChannelElement(grpc_exec_ctx *exec_ctx,
grpc_channel_element *elem,
grpc_channel_element_args *args) {
const char *peer =
args->optional_transport
? grpc_transport_get_peer(exec_ctx, args->optional_transport)
: nullptr;
// Construct the object in the already-allocated memory.
ChannelDataType *channel_data =
new (elem->channel_data) ChannelDataType(*args->channel_args, peer);
return channel_data->Init();
ChannelDataType *channel_data = new (elem->channel_data) ChannelDataType();
return channel_data->Init(exec_ctx, args);
}
static void DestroyChannelElement(grpc_exec_ctx *exec_ctx,
@ -317,11 +309,11 @@ class ChannelFilter final {
static grpc_error *InitCallElement(grpc_exec_ctx *exec_ctx,
grpc_call_element *elem,
grpc_call_element_args *args) {
const ChannelDataType &channel_data =
*(ChannelDataType *)elem->channel_data;
ChannelDataType *channel_data =
(ChannelDataType *)elem->channel_data;
// Construct the object in the already-allocated memory.
CallDataType *call_data = new (elem->call_data) CallDataType(channel_data);
return call_data->Init();
CallDataType *call_data = new (elem->call_data) CallDataType();
return call_data->Init(exec_ctx, channel_data, args);
}
static void DestroyCallElement(grpc_exec_ctx *exec_ctx,

@ -41,14 +41,23 @@ namespace testing {
class MyChannelData : public ChannelData {
public:
MyChannelData(const grpc_channel_args& args, const char* peer)
: ChannelData(args, peer) {}
MyChannelData() {}
grpc_error *Init(grpc_exec_ctx *exec_ctx, grpc_channel_element_args *args) {
(void)args->channel_args; // Make sure field is available.
return GRPC_ERROR_NONE;
}
};
class MyCallData : public CallData {
public:
explicit MyCallData(const ChannelData& channel_data)
: CallData(channel_data) {}
MyCallData() {}
grpc_error *Init(grpc_exec_ctx *exec_ctx, ChannelData *channel_data,
grpc_call_element_args *args) {
(void)args->path; // Make sure field is available.
return GRPC_ERROR_NONE;
}
};
// This test ensures that when we make changes to the filter API in

Loading…
Cancel
Save