aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib/transport/metadata_batch.c
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2016-11-22 14:54:10 -0800
committerGravatar Craig Tiller <ctiller@google.com>2016-11-22 14:54:10 -0800
commitb0f3bca0ef9ee8c1ea6bb2bde7281a1df5914216 (patch)
tree6fc1fcbbd883b7fe550d92a8f3c58fc3d80dc29f /src/core/lib/transport/metadata_batch.c
parenta7d37a371a965470c917ccf50eb858f66bcc6eaa (diff)
Everything compiles...
Diffstat (limited to 'src/core/lib/transport/metadata_batch.c')
-rw-r--r--src/core/lib/transport/metadata_batch.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/core/lib/transport/metadata_batch.c b/src/core/lib/transport/metadata_batch.c
index 39e49283bf..2bbd5ba6aa 100644
--- a/src/core/lib/transport/metadata_batch.c
+++ b/src/core/lib/transport/metadata_batch.c
@@ -52,13 +52,16 @@ static void assert_valid_list(grpc_mdelem_list *list) {
GPR_ASSERT(list->tail->next == NULL);
GPR_ASSERT((list->head == list->tail) == (list->head->next == NULL));
+ size_t verified_count = 0;
for (l = list->head; l; l = l->next) {
GPR_ASSERT(!GRPC_MDISNULL(l->md));
GPR_ASSERT((l->prev == NULL) == (l == list->head));
GPR_ASSERT((l->next == NULL) == (l == list->tail));
if (l->next) GPR_ASSERT(l->next->prev == l);
if (l->prev) GPR_ASSERT(l->prev->next == l);
+ verified_count++;
}
+ GPR_ASSERT(list->count == verified_count);
#endif /* NDEBUG */
}
@@ -154,6 +157,7 @@ static void link_head(grpc_mdelem_list *list, grpc_linked_mdelem *storage) {
list->tail = storage;
}
list->head = storage;
+ list->count++;
assert_valid_list(list);
}
@@ -219,6 +223,7 @@ static void unlink_storage(grpc_mdelem_list *list,
} else {
list->tail = storage->prev;
}
+ list->count--;
assert_valid_list(list);
}
@@ -230,6 +235,33 @@ void grpc_metadata_batch_remove(grpc_metadata_batch *batch,
assert_valid_callouts(batch);
}
+void grpc_metadata_batch_set_value(grpc_exec_ctx *exec_ctx,
+ grpc_linked_mdelem *storage,
+ grpc_slice value) {
+ grpc_mdelem old = storage->md;
+ grpc_mdelem new =
+ grpc_mdelem_from_slices(exec_ctx, grpc_slice_ref(GRPC_MDKEY(old)), value);
+ storage->md = new;
+ GRPC_MDELEM_UNREF(exec_ctx, old);
+}
+
+grpc_error *grpc_metadata_batch_substitute(grpc_exec_ctx *exec_ctx,
+ grpc_metadata_batch *batch,
+ grpc_linked_mdelem *storage,
+ grpc_mdelem new) {
+ grpc_error *error = GRPC_ERROR_NONE;
+ grpc_mdelem old = storage->md;
+ if (!grpc_slice_eq(GRPC_MDKEY(new), GRPC_MDKEY(old))) {
+ maybe_unlink_callout(batch, storage);
+ storage->md = new;
+ error = maybe_link_callout(batch, storage);
+ } else {
+ storage->md = new;
+ }
+ GRPC_MDELEM_UNREF(exec_ctx, old);
+ return error;
+}
+
void grpc_metadata_batch_clear(grpc_exec_ctx *exec_ctx,
grpc_metadata_batch *batch) {
grpc_metadata_batch_destroy(exec_ctx, batch);