aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/surface/call.c
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2015-10-09 17:40:19 -0700
committerGravatar Craig Tiller <ctiller@google.com>2015-10-09 18:12:09 -0700
commit63bda56884f1dece057f84dc6f94f9c2a5ce1605 (patch)
treeb23ede176c1951a1e33f575e770daf2626668e0d /src/core/surface/call.c
parent4d1fc5526160470b7d50a78062b80c0f5f4229e4 (diff)
Make metadata unref atomic
We used to need to lock the metadata context to unref an mdelem. This change makes it possible to lock only when the mdelem refcount would reach zero.
Diffstat (limited to 'src/core/surface/call.c')
-rw-r--r--src/core/surface/call.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/src/core/surface/call.c b/src/core/surface/call.c
index d15a3bcbad..9bf0451442 100644
--- a/src/core/surface/call.c
+++ b/src/core/surface/call.c
@@ -1484,7 +1484,6 @@ static void recv_metadata(grpc_exec_ctx *exec_ctx, grpc_call *call,
grpc_metadata_array *dest;
grpc_metadata *mdusr;
int is_trailing;
- grpc_mdctx *mdctx = call->metadata_context;
is_trailing = call->read_state >= READ_STATE_GOT_INITIAL_METADATA;
for (l = md->list.head; l != NULL; l = l->next) {
@@ -1532,14 +1531,12 @@ static void recv_metadata(grpc_exec_ctx *exec_ctx, grpc_call *call,
call->read_state = READ_STATE_GOT_INITIAL_METADATA;
}
- grpc_mdctx_lock(mdctx);
for (l = md->list.head; l; l = l->next) {
- if (l->md) GRPC_MDCTX_LOCKED_MDELEM_UNREF(mdctx, l->md);
+ if (l->md) GRPC_MDELEM_UNREF(l->md);
}
for (l = md->garbage.head; l; l = l->next) {
- GRPC_MDCTX_LOCKED_MDELEM_UNREF(mdctx, l->md);
+ GRPC_MDELEM_UNREF(l->md);
}
- grpc_mdctx_unlock(mdctx);
}
grpc_call_stack *grpc_call_get_call_stack(grpc_call *call) {