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 #ifndef GRPC_CORE_LIB_CHANNEL_CHANNEL_STACK_H
#define 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. /* A channel filter defines how operations on a channel are implemented.
Channel filters are chained together to create full channels, and if those Channel filters are chained together to create full channels, and if those
chains are linear, then channel stacks provide a mechanism to minimize chains are linear, then channel stacks provide a mechanism to minimize

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

@ -41,14 +41,23 @@ namespace testing {
class MyChannelData : public ChannelData { class MyChannelData : public ChannelData {
public: public:
MyChannelData(const grpc_channel_args& args, const char* peer) MyChannelData() {}
: ChannelData(args, peer) {}
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 { class MyCallData : public CallData {
public: public:
explicit MyCallData(const ChannelData& channel_data) MyCallData() {}
: CallData(channel_data) {}
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 // This test ensures that when we make changes to the filter API in

Loading…
Cancel
Save