From dfbb1c080aa22e1f39cd934e1dc731ee4c74100b Mon Sep 17 00:00:00 2001 From: Craig Tiller <ctiller@google.com> Date: Mon, 2 May 2016 20:48:46 -0700 Subject: [PATCH] Almost working...... --- src/core/lib/iomgr/async_execution_lock.c | 12 ++++++++++-- test/core/iomgr/async_execution_lock_test.c | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/core/lib/iomgr/async_execution_lock.c b/src/core/lib/iomgr/async_execution_lock.c index 71608b2bfe..00cd27504b 100644 --- a/src/core/lib/iomgr/async_execution_lock.c +++ b/src/core/lib/iomgr/async_execution_lock.c @@ -67,23 +67,30 @@ static void finish(grpc_exec_ctx *exec_ctx, grpc_aelock *lock) { NO_CONSUMER)) { return; } + // TODO(ctiller): consider sleeping + continue; } else { + // skip the tombstone: we'll re-add it later lock->tail = next; tail = next; next = (grpc_aelock_qnode *)gpr_atm_acq_load(&tail->next); } } if (next != NULL) { + // found a node lock->tail = next; tail->action(exec_ctx, tail->arg); gpr_free(tail); } else { + // nothing there: might be in an incosistant state grpc_aelock_qnode *head = (grpc_aelock_qnode *)gpr_atm_acq_load(&lock->head); if (head != tail) { + // non-empty list: spin for a bit // TODO(ctiller): consider sleeping? continue; } + // must have swallowed tombstone above: re-add it gpr_atm_no_barrier_store(&lock->tombstone.next, 0); while (!gpr_atm_rel_cas(&lock->head, (gpr_atm)head, (gpr_atm)&lock->tombstone)) { @@ -117,7 +124,7 @@ retry_top: } else { n->arg = arg; } - gpr_atm_no_barrier_store(&n->next, 0); + gpr_atm_rel_store(&n->next, 0); while (!gpr_atm_rel_cas(&lock->head, head, (gpr_atm)n)) { retry_queue_load: head = gpr_atm_acq_load(&lock->head); @@ -132,5 +139,6 @@ retry_top: return; // early out } } - gpr_atm_rel_store(&((grpc_aelock_qnode *)head)->next, (gpr_atm)n); + GPR_ASSERT(gpr_atm_rel_cas(&((grpc_aelock_qnode *)head)->next, 0, (gpr_atm)n)); +// gpr_atm_rel_store(&((grpc_aelock_qnode *)head)->next, (gpr_atm)n); } diff --git a/test/core/iomgr/async_execution_lock_test.c b/test/core/iomgr/async_execution_lock_test.c index d7f1823412..8c9665a458 100644 --- a/test/core/iomgr/async_execution_lock_test.c +++ b/test/core/iomgr/async_execution_lock_test.c @@ -87,7 +87,7 @@ static void execute_many_loop(void *a) { grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; size_t n = 1; for (size_t i = 0; i < 10; i++) { - for (size_t j = 0; j < 1000; j++) { + for (size_t j = 0; j < 10000; j++) { ex_args c = {&args->ctr, n++}; grpc_aelock_execute(&exec_ctx, args->lock, check_one, &c, sizeof(c)); grpc_exec_ctx_flush(&exec_ctx); -- GitLab