|
|
|
@ -111,6 +111,15 @@ static void interned_slice_unref(grpc_exec_ctx *exec_ctx, void *p) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void interned_slice_sub_ref(void *p) { |
|
|
|
|
interned_slice_ref(((char *)p) - offsetof(interned_slice_refcount, sub)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void interned_slice_sub_unref(grpc_exec_ctx *exec_ctx, void *p) { |
|
|
|
|
interned_slice_unref(exec_ctx, |
|
|
|
|
((char *)p) - offsetof(interned_slice_refcount, sub)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static uint32_t interned_slice_hash(grpc_slice slice) { |
|
|
|
|
interned_slice_refcount *s = (interned_slice_refcount *)slice.refcount; |
|
|
|
|
if (slice.data.refcounted.bytes == (uint8_t *)(s + 1) && |
|
|
|
@ -135,6 +144,9 @@ static int interned_slice_eq(grpc_slice a, grpc_slice b) { |
|
|
|
|
static const grpc_slice_refcount_vtable interned_slice_vtable = { |
|
|
|
|
interned_slice_ref, interned_slice_unref, interned_slice_eq, |
|
|
|
|
interned_slice_hash}; |
|
|
|
|
static const grpc_slice_refcount_vtable interned_slice_sub_vtable = { |
|
|
|
|
interned_slice_sub_ref, interned_slice_sub_unref, |
|
|
|
|
grpc_slice_default_eq_impl, grpc_slice_default_hash_impl}; |
|
|
|
|
|
|
|
|
|
static void grow_shard(slice_shard *shard) { |
|
|
|
|
size_t capacity = shard->capacity * 2; |
|
|
|
|