fixup! fixup! fixup! WIP: Add loopmgr that replaces isc_app, and parts of isc_nm related to the uv_loops

This commit is contained in:
Evan Hunt
2022-03-30 13:07:00 -07:00
parent 7a30654585
commit e01a34489e
3 changed files with 45 additions and 14 deletions

View File

@@ -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

View File

@@ -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){

View File

@@ -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),