From e01a34489eda63263ef89c45fde3f4165c262a81 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Wed, 30 Mar 2022 13:07:00 -0700 Subject: [PATCH] fixup! fixup! fixup! WIP: Add loopmgr that replaces isc_app, and parts of isc_nm related to the uv_loops --- lib/isc/include/isc/loop.h | 11 ++++++----- lib/isc/loop.c | 13 +++++-------- lib/isc/tests/loop_test.c | 35 ++++++++++++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/lib/isc/include/isc/loop.h b/lib/isc/include/isc/loop.h index 56c03a6d63..69efcfa7dc 100644 --- a/lib/isc/include/isc/loop.h +++ b/lib/isc/include/isc/loop.h @@ -87,15 +87,16 @@ isc_loopmgr_run(isc_loopmgr_t *loopmgr); *\li 'loopmgr' is a valid loop manager. */ void -isc_loop_runjob(isc_loop_t *loop, isc_job_cb cb, void *cbarg); +isc_loopmgr_runjob(isc_loopmgr_t *loopmgr, isc_job_cb cb, void *cbarg); /*%< - * Schedule a single job to run in 'loop' in the next iteration - * of uv_run(): 'cb' will be called with argument 'cbarg'. + * Schedule a single job in the currently running loop. On the next + * iteration of uv_run(), 'cb' will be called with argument 'cbarg'. + * (Note that this can only be called once per iteration; if a job was + * already scheduled it will be replaced with this one.) * * Requires: *\li 'loop' is a valid loop. - *\li 'loop' is the currently running loop, or the loop manager - * associated with 'loop' is paused or has not yet been started. + *\li We are in a running loop. */ void diff --git a/lib/isc/loop.c b/lib/isc/loop.c index b9c53338e0..a10044d700 100644 --- a/lib/isc/loop.c +++ b/lib/isc/loop.c @@ -396,18 +396,15 @@ isc_loopmgr_teardown(isc_loopmgr_t *loopmgr, isc_job_cb cb, void *cbarg) { } void -isc_loop_runjob(isc_loop_t *loop, isc_job_cb cb, void *cbarg) { - isc_loopmgr_t *loopmgr = NULL; +isc_loopmgr_runjob(isc_loopmgr_t *loopmgr, isc_job_cb cb, void *cbarg) { + isc_loop_t *loop = NULL; isc_job_t *job = NULL; int r; - REQUIRE(VALID_LOOP(loop)); + REQUIRE(VALID_LOOPMGR(loopmgr)); + REQUIRE(isc__loopmgr_tid_v != ISC_LOOPMGR_TID_UNKNOWN); - loopmgr = loop->loopmgr; - - REQUIRE(loop->tid == isc__loopmgr_tid_v || - !atomic_load(&loopmgr->running) || - atomic_load(&loopmgr->paused)); + loop = &loopmgr->loops[isc__loopmgr_tid_v]; job = isc_mem_get(loop->mctx, sizeof(*job)); *job = (isc_job_t){ diff --git a/lib/isc/tests/loop_test.c b/lib/isc/tests/loop_test.c index d8d2afec79..6f7c06b771 100644 --- a/lib/isc/tests/loop_test.c +++ b/lib/isc/tests/loop_test.c @@ -99,8 +99,9 @@ static void isc_loopmgr_test(void **state) { isc_loopmgr_t *loopmgr = *state; - isc_loopmgr_setup(loopmgr, count, loopmgr); + atomic_store(&scheduled, 0); + isc_loopmgr_setup(loopmgr, count, loopmgr); isc_loop_setup(DEFAULT_LOOP(loopmgr), shutdown_loopmgr, loopmgr); isc_loopmgr_run(loopmgr); @@ -108,6 +109,35 @@ isc_loopmgr_test(void **state) { assert_int_equal(atomic_load(&scheduled), loopmgr->nloops); } +static void +count2(void *arg) { + isc_loopmgr_t *loopmgr = (isc_loopmgr_t *)arg; + + atomic_fetch_add(&scheduled, 1); + if (isc_loopmgr_tid() == 0) { + isc_loopmgr_runjob(loopmgr, shutdown_loopmgr, loopmgr); + } +} + +static void +runjob(void *arg) { + isc_loopmgr_t *loopmgr = (isc_loopmgr_t *)arg; + isc_loopmgr_runjob(loopmgr, count2, loopmgr); +} + +static void +isc_loopmgr_runjob_test(void **state) { + isc_loopmgr_t *loopmgr = *state; + + atomic_store(&scheduled, 0); + + isc_loopmgr_setup(loopmgr, runjob, loopmgr); + + isc_loopmgr_run(loopmgr); + + assert_int_equal(atomic_load(&scheduled), loopmgr->nloops); +} + static void pause_loopmgr(void *arg) { isc_loopmgr_t *loopmgr = (isc_loopmgr_t *)arg; @@ -177,6 +207,9 @@ main(void) { cmocka_unit_test_setup_teardown(isc_loopmgr_pause_test, setup_loopmgr, teardown_loopmgr), + cmocka_unit_test_setup_teardown(isc_loopmgr_runjob_test, + setup_loopmgr, + teardown_loopmgr), cmocka_unit_test_setup_teardown(isc_loopmgr_sigint_test, setup_loopmgr, teardown_loopmgr),