|  | @@ -26,6 +26,7 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include <string.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#include "src/core/lib/gprpp/ref_counted.h"
 | 
	
		
			
				|  |  |  #include "src/core/lib/iomgr/exec_ctx.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  char* grpc_slice_to_c_string(grpc_slice slice) {
 | 
	
	
		
			
				|  | @@ -213,21 +214,35 @@ grpc_slice grpc_slice_from_copied_string(const char* source) {
 | 
	
		
			
				|  |  |    return grpc_slice_from_copied_buffer(source, strlen(source));
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -typedef struct {
 | 
	
		
			
				|  |  | +namespace {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +struct MallocRefCount {
 | 
	
		
			
				|  |  | +  MallocRefCount(const grpc_slice_refcount_vtable* vtable) {
 | 
	
		
			
				|  |  | +    base.vtable = vtable;
 | 
	
		
			
				|  |  | +    base.sub_refcount = &base;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  void Ref() { refs.Ref(); }
 | 
	
		
			
				|  |  | +  void Unref() {
 | 
	
		
			
				|  |  | +    if (refs.Unref()) {
 | 
	
		
			
				|  |  | +      gpr_free(this);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    grpc_slice_refcount base;
 | 
	
		
			
				|  |  | -  gpr_refcount refs;
 | 
	
		
			
				|  |  | -} malloc_refcount;
 | 
	
		
			
				|  |  | +  grpc_core::RefCount refs;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}  // namespace
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void malloc_ref(void* p) {
 | 
	
		
			
				|  |  | -  malloc_refcount* r = static_cast<malloc_refcount*>(p);
 | 
	
		
			
				|  |  | -  gpr_ref(&r->refs);
 | 
	
		
			
				|  |  | +  MallocRefCount* r = static_cast<MallocRefCount*>(p);
 | 
	
		
			
				|  |  | +  r->Ref();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void malloc_unref(void* p) {
 | 
	
		
			
				|  |  | -  malloc_refcount* r = static_cast<malloc_refcount*>(p);
 | 
	
		
			
				|  |  | -  if (gpr_unref(&r->refs)) {
 | 
	
		
			
				|  |  | -    gpr_free(r);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +  MallocRefCount* r = static_cast<MallocRefCount*>(p);
 | 
	
		
			
				|  |  | +  r->Unref();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static const grpc_slice_refcount_vtable malloc_vtable = {
 | 
	
	
		
			
				|  | @@ -246,15 +261,10 @@ grpc_slice grpc_slice_malloc_large(size_t length) {
 | 
	
		
			
				|  |  |       refcount is a malloc_refcount
 | 
	
		
			
				|  |  |       bytes is an array of bytes of the requested length
 | 
	
		
			
				|  |  |       Both parts are placed in the same allocation returned from gpr_malloc */
 | 
	
		
			
				|  |  | -  malloc_refcount* rc = static_cast<malloc_refcount*>(
 | 
	
		
			
				|  |  | -      gpr_malloc(sizeof(malloc_refcount) + length));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /* Initial refcount on rc is 1 - and it's up to the caller to release
 | 
	
		
			
				|  |  | -     this reference. */
 | 
	
		
			
				|  |  | -  gpr_ref_init(&rc->refs, 1);
 | 
	
		
			
				|  |  | +  void* data =
 | 
	
		
			
				|  |  | +      static_cast<MallocRefCount*>(gpr_malloc(sizeof(MallocRefCount) + length));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  rc->base.vtable = &malloc_vtable;
 | 
	
		
			
				|  |  | -  rc->base.sub_refcount = &rc->base;
 | 
	
		
			
				|  |  | +  auto* rc = new (data) MallocRefCount(&malloc_vtable);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* Build up the slice to be returned. */
 | 
	
		
			
				|  |  |    /* The slices refcount points back to the allocated block. */
 |