aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib/slice/slice_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/lib/slice/slice_buffer.c')
-rw-r--r--src/core/lib/slice/slice_buffer.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/core/lib/slice/slice_buffer.c b/src/core/lib/slice/slice_buffer.c
index 010b1e6854..a76b86f1d5 100644
--- a/src/core/lib/slice/slice_buffer.c
+++ b/src/core/lib/slice/slice_buffer.c
@@ -40,6 +40,8 @@
#include <grpc/support/log.h>
#include <grpc/support/useful.h>
+#include "src/core/lib/slice/slice_internal.h"
+
/* grow a buffer; requires GRPC_SLICE_BUFFER_INLINE_ELEMENTS > 1 */
#define GROW(x) (3 * (x) / 2)
@@ -75,13 +77,20 @@ void grpc_slice_buffer_init(grpc_slice_buffer *sb) {
sb->base_slices = sb->slices = sb->inlined;
}
-void grpc_slice_buffer_destroy(grpc_slice_buffer *sb) {
- grpc_slice_buffer_reset_and_unref(sb);
+void grpc_slice_buffer_destroy_internal(grpc_exec_ctx *exec_ctx,
+ grpc_slice_buffer *sb) {
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx, sb);
if (sb->base_slices != sb->inlined) {
gpr_free(sb->base_slices);
}
}
+void grpc_slice_buffer_destroy(grpc_slice_buffer *sb) {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_slice_buffer_destroy_internal(&exec_ctx, sb);
+ grpc_exec_ctx_finish(&exec_ctx);
+}
+
uint8_t *grpc_slice_buffer_tiny_add(grpc_slice_buffer *sb, size_t n) {
grpc_slice *back;
uint8_t *out;
@@ -167,18 +176,23 @@ void grpc_slice_buffer_pop(grpc_slice_buffer *sb) {
}
}
-void grpc_slice_buffer_reset_and_unref(grpc_slice_buffer *sb) {
+void grpc_slice_buffer_reset_and_unref_internal(grpc_exec_ctx *exec_ctx,
+ grpc_slice_buffer *sb) {
size_t i;
- /* TODO (sreek) Ensure that it is okay not to unref slices between
- * sb->base_slices and sb->slices (doing so was giving sigsegv errors) */
for (i = 0; i < sb->count; i++) {
- grpc_slice_unref(sb->slices[i]);
+ grpc_slice_unref_internal(exec_ctx, sb->slices[i]);
}
sb->count = 0;
sb->length = 0;
}
+void grpc_slice_buffer_reset_and_unref(grpc_slice_buffer *sb) {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_slice_buffer_reset_and_unref_internal(&exec_ctx, sb);
+ grpc_exec_ctx_finish(&exec_ctx);
+}
+
void grpc_slice_buffer_swap(grpc_slice_buffer *a, grpc_slice_buffer *b) {
size_t a_offset = (size_t)(a->slices - a->base_slices);
size_t b_offset = (size_t)(b->slices - b->base_slices);