|  | @@ -46,9 +46,9 @@ void CallOpBuffer::Reset(void* next_return_tag) {
 | 
	
		
			
				|  |  |      gpr_free(initial_metadata_);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    send_message_ = nullptr;
 | 
	
		
			
				|  |  | -  if (write_buffer_) {
 | 
	
		
			
				|  |  | -    grpc_byte_buffer_destroy(write_buffer_);
 | 
	
		
			
				|  |  | -    write_buffer_ = nullptr;
 | 
	
		
			
				|  |  | +  if (send_message_buf_) {
 | 
	
		
			
				|  |  | +    grpc_byte_buffer_destroy(send_message_buf_);
 | 
	
		
			
				|  |  | +    send_message_buf_ = nullptr;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    recv_message_ = nullptr;
 | 
	
		
			
				|  |  |    if (recv_message_buf_) {
 | 
	
	
		
			
				|  | @@ -107,6 +107,10 @@ void CallOpBuffer::AddClientRecvStatus(Status *status) {
 | 
	
		
			
				|  |  |    recv_status_ = status;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void CallOpBuffer::AddServerSendStatus(std::multimap<grpc::string, grpc::string>* metadata,
 | 
	
		
			
				|  |  | +                                       const Status& status) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void CallOpBuffer::FillOps(grpc_op *ops, size_t *nops) {
 | 
	
		
			
				|  |  |    *nops = 0;
 | 
	
	
		
			
				|  | @@ -117,12 +121,12 @@ void CallOpBuffer::FillOps(grpc_op *ops, size_t *nops) {
 | 
	
		
			
				|  |  |      (*nops)++;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    if (send_message_) {
 | 
	
		
			
				|  |  | -    bool success = SerializeProto(*send_message_, &write_buffer_);
 | 
	
		
			
				|  |  | +    bool success = SerializeProto(*send_message_, &send_message_buf_);
 | 
	
		
			
				|  |  |      if (!success) {
 | 
	
		
			
				|  |  |        // TODO handle parse failure
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      ops[*nops].op = GRPC_OP_SEND_MESSAGE;
 | 
	
		
			
				|  |  | -    ops[*nops].data.send_message = write_buffer_;
 | 
	
		
			
				|  |  | +    ops[*nops].data.send_message = send_message_buf_;
 | 
	
		
			
				|  |  |      (*nops)++;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    if (recv_message_) {
 | 
	
	
		
			
				|  | @@ -136,7 +140,7 @@ void CallOpBuffer::FillOps(grpc_op *ops, size_t *nops) {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    if (recv_status_) {
 | 
	
		
			
				|  |  |      ops[*nops].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
 | 
	
		
			
				|  |  | -    // ops[*nops].data.recv_status_on_client.trailing_metadata =
 | 
	
		
			
				|  |  | +    // TODO ops[*nops].data.recv_status_on_client.trailing_metadata =
 | 
	
		
			
				|  |  |      ops[*nops].data.recv_status_on_client.status = &status_code_;
 | 
	
		
			
				|  |  |      ops[*nops].data.recv_status_on_client.status_details = &status_details_;
 | 
	
		
			
				|  |  |      ops[*nops].data.recv_status_on_client.status_details_capacity = &status_details_capacity_;
 | 
	
	
		
			
				|  | @@ -144,11 +148,32 @@ void CallOpBuffer::FillOps(grpc_op *ops, size_t *nops) {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void CallOpBuffer::FinalizeResult(void *tag, bool *status) {
 | 
	
		
			
				|  |  | -  // Release send buffers
 | 
	
		
			
				|  |  | -  if (write_buffer_) {
 | 
	
		
			
				|  |  | -    grpc_byte_buffer_destroy(write_buffer_);
 | 
	
		
			
				|  |  | -    write_buffer_ = nullptr;
 | 
	
		
			
				|  |  | +void CallOpBuffer::FinalizeResult(void **tag, bool *status) {
 | 
	
		
			
				|  |  | +  // Release send buffers.
 | 
	
		
			
				|  |  | +  if (send_message_buf_) {
 | 
	
		
			
				|  |  | +    grpc_byte_buffer_destroy(send_message_buf_);
 | 
	
		
			
				|  |  | +    send_message_buf_ = nullptr;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  if (initial_metadata_) {
 | 
	
		
			
				|  |  | +    gpr_free(initial_metadata_);
 | 
	
		
			
				|  |  | +    initial_metadata_ = nullptr;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // Set user-facing tag.
 | 
	
		
			
				|  |  | +  *tag = return_tag_;
 | 
	
		
			
				|  |  | +  // Parse received message if any.
 | 
	
		
			
				|  |  | +  if (recv_message_ && recv_message_buf_) {
 | 
	
		
			
				|  |  | +    *status = DeserializeProto(recv_message_buf_, recv_message_);
 | 
	
		
			
				|  |  | +    grpc_byte_buffer_destroy(recv_message_buf_);
 | 
	
		
			
				|  |  | +    recv_message_buf_ = nullptr;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // Parse received status.
 | 
	
		
			
				|  |  | +  if (recv_status_) {
 | 
	
		
			
				|  |  | +    if (status_details_) {
 | 
	
		
			
				|  |  | +      *recv_status_ = Status(static_cast<StatusCode>(status_code_),
 | 
	
		
			
				|  |  | +                             grpc::string(status_details_, status_details_capacity_));
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      *recv_status_ = Status(static_cast<StatusCode>(status_code_));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |