|  | @@ -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,
 |