aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib/slice/slice_buffer.c
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2017-04-20 14:46:37 -0700
committerGravatar Craig Tiller <ctiller@google.com>2017-04-20 14:46:37 -0700
commit0d23d8954f2ee9b809d21ec4e156b2347c8c340c (patch)
treea8b7a86bba8b8362438bc8b55fc655901f6ee515 /src/core/lib/slice/slice_buffer.c
parentf414008fe9eeb08bcf87a827a72318ca58d72519 (diff)
Add flexibility on *which* slice gets reffed
Use it to ensure that sb_move_first acts predictably
Diffstat (limited to 'src/core/lib/slice/slice_buffer.c')
-rw-r--r--src/core/lib/slice/slice_buffer.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/core/lib/slice/slice_buffer.c b/src/core/lib/slice/slice_buffer.c
index 5a4b434d28..e8d41ca0f7 100644
--- a/src/core/lib/slice/slice_buffer.c
+++ b/src/core/lib/slice/slice_buffer.c
@@ -274,12 +274,18 @@ static void slice_buffer_move_first_maybe_ref(grpc_slice_buffer *src, size_t n,
} else if (n == slice_len) {
grpc_slice_buffer_add(dst, slice);
break;
- } else { /* n < slice_len */
+ } else if (incref) { /* n < slice_len */
grpc_slice_buffer_undo_take_first(
- src, grpc_slice_split_tail_maybe_ref(&slice, n, incref));
+ src, grpc_slice_split_tail_maybe_ref(&slice, n, GRPC_SLICE_REF_BOTH));
GPR_ASSERT(GRPC_SLICE_LENGTH(slice) == n);
grpc_slice_buffer_add(dst, slice);
break;
+ } else { /* n < slice_len */
+ grpc_slice_buffer_undo_take_first(
+ src, grpc_slice_split_tail_maybe_ref(&slice, n, GRPC_SLICE_REF_TAIL));
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice) == n);
+ grpc_slice_buffer_add_indexed(dst, slice);
+ break;
}
}
GPR_ASSERT(dst->length == output_len);