diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c index 368838860f5..31ec1b68dae 100644 --- a/src/core/surface/completion_queue.c +++ b/src/core/surface/completion_queue.c @@ -365,27 +365,30 @@ static void cq_alarm_cb(grpc_exec_ctx *exec_ctx, void *arg, int success) { do_nothing_end_completion, NULL, &cq_alarm->completion); } -grpc_cq_alarm *grpc_cq_alarm_create(grpc_exec_ctx *exec_ctx, - grpc_completion_queue *cq, +grpc_cq_alarm *grpc_cq_alarm_create(grpc_completion_queue *cq, gpr_timespec deadline, void *tag) { grpc_cq_alarm *cq_alarm = gpr_malloc(sizeof(grpc_cq_alarm)); + grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; GRPC_CQ_INTERNAL_REF(cq, "cq_alarm"); cq_alarm->cq = cq; cq_alarm->tag = tag; - grpc_alarm_init(exec_ctx, &cq_alarm->alarm, deadline, cq_alarm_cb, cq_alarm, + grpc_alarm_init(&exec_ctx, &cq_alarm->alarm, deadline, cq_alarm_cb, cq_alarm, gpr_now(GPR_CLOCK_MONOTONIC)); grpc_cq_begin_op(cq); + grpc_exec_ctx_finish(&exec_ctx); return cq_alarm; } -void grpc_cq_alarm_cancel(grpc_exec_ctx *exec_ctx, grpc_cq_alarm *cq_alarm) { - grpc_alarm_cancel(exec_ctx, &cq_alarm->alarm); +void grpc_cq_alarm_cancel(grpc_cq_alarm *cq_alarm) { + grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; + grpc_alarm_cancel(&exec_ctx, &cq_alarm->alarm); + grpc_exec_ctx_finish(&exec_ctx); } -void grpc_cq_alarm_destroy(grpc_exec_ctx *exec_ctx, grpc_cq_alarm *cq_alarm) { - grpc_cq_alarm_cancel(exec_ctx, cq_alarm); +void grpc_cq_alarm_destroy(grpc_cq_alarm *cq_alarm) { + grpc_cq_alarm_cancel(cq_alarm); GRPC_CQ_INTERNAL_UNREF(cq_alarm->cq, "cq_alarm"); gpr_free(cq_alarm); } diff --git a/src/core/surface/completion_queue.h b/src/core/surface/completion_queue.h index ab5b87c5c8b..12a7e9a147a 100644 --- a/src/core/surface/completion_queue.h +++ b/src/core/surface/completion_queue.h @@ -99,15 +99,14 @@ int grpc_cq_is_server_cq(grpc_completion_queue *cc); * Once the alarm expires (at \a deadline) or it's cancelled (see ...), an event * with tag \a tag will be added to \a cq. If the alarm expired, the event's * success bit will be true, false otherwise (ie, upon cancellation). */ -grpc_cq_alarm *grpc_cq_alarm_create(grpc_exec_ctx *exec_ctx, - grpc_completion_queue *cq, +grpc_cq_alarm *grpc_cq_alarm_create(grpc_completion_queue *cq, gpr_timespec deadline, void *tag); /** Cancel a completion queue alarm. Calling this function ove an alarm that has * already run has no effect. */ -void grpc_cq_alarm_cancel(grpc_exec_ctx *exec_ctx, grpc_cq_alarm *cq_alarm); +void grpc_cq_alarm_cancel(grpc_cq_alarm *cq_alarm); /** Destroy the given completion queue alarm, cancelling it in the process. */ -void grpc_cq_alarm_destroy(grpc_exec_ctx *exec_ctx, grpc_cq_alarm *cq_alarm); +void grpc_cq_alarm_destroy(grpc_cq_alarm *cq_alarm); #endif /* GRPC_INTERNAL_CORE_SURFACE_COMPLETION_QUEUE_H */ diff --git a/test/core/surface/completion_queue_test.c b/test/core/surface/completion_queue_test.c index 785093c60fc..16bccc36091 100644 --- a/test/core/surface/completion_queue_test.c +++ b/test/core/surface/completion_queue_test.c @@ -104,7 +104,6 @@ static void test_cq_end_op(void) { static void test_cq_alarm(void) { grpc_completion_queue *cc; - grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; LOG_TEST("test_cq_alarm"); cc = grpc_completion_queue_create(NULL); @@ -112,35 +111,32 @@ static void test_cq_alarm(void) { /* regular expiry */ grpc_event ev; void *tag = create_test_tag(); - grpc_cq_alarm *cq_alarm = grpc_cq_alarm_create( - &exec_ctx, cc, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(1), tag); + grpc_cq_alarm *cq_alarm = + grpc_cq_alarm_create(cc, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(1), tag); ev = grpc_completion_queue_next(cc, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(2), NULL); GPR_ASSERT(ev.type == GRPC_OP_COMPLETE); GPR_ASSERT(ev.tag == tag); GPR_ASSERT(ev.success); - grpc_cq_alarm_destroy(&exec_ctx, cq_alarm); + grpc_cq_alarm_destroy(cq_alarm); } { /* cancellation */ grpc_event ev; void *tag = create_test_tag(); - grpc_cq_alarm *cq_alarm = grpc_cq_alarm_create( - &exec_ctx, cc, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(2), tag); + grpc_cq_alarm *cq_alarm = + grpc_cq_alarm_create(cc, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(2), tag); - grpc_cq_alarm_cancel(&exec_ctx, cq_alarm); - GPR_ASSERT(grpc_exec_ctx_flush(&exec_ctx) == 1); + grpc_cq_alarm_cancel(cq_alarm); ev = grpc_completion_queue_next(cc, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(1), NULL); GPR_ASSERT(ev.type == GRPC_OP_COMPLETE); GPR_ASSERT(ev.tag == tag); GPR_ASSERT(ev.success == 0); - grpc_cq_alarm_destroy(&exec_ctx, cq_alarm); + grpc_cq_alarm_destroy(cq_alarm); } - shutdown_and_destroy(cc); - grpc_exec_ctx_finish(&exec_ctx); } static void test_shutdown_then_next_polling(void) {