From: Ondřej Surý Date: Tue, 12 Nov 2019 11:15:10 +0000 (+0100) Subject: Remove the assertions from subthreads and use global errcnt to record errors X-Git-Tag: v9.15.6~11^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aca0f887502fde99e24751f2523723292fd9cec2;p=thirdparty%2Fbind9.git Remove the assertions from subthreads and use global errcnt to record errors --- diff --git a/lib/isc/tests/timer_test.c b/lib/isc/tests/timer_test.c index 9210075e5f4..613e9c60c06 100644 --- a/lib/isc/tests/timer_test.c +++ b/lib/isc/tests/timer_test.c @@ -53,6 +53,7 @@ static isc_time_t lasttime; static int seconds; static int nanoseconds; static atomic_int_fast32_t eventcnt; +static atomic_uint_fast32_t errcnt; static int nevents; static int @@ -65,6 +66,8 @@ _setup(void **state) { result = isc_test_begin(NULL, true, 2); assert_int_equal(result, ISC_R_SUCCESS); + atomic_init(&errcnt, ISC_R_SUCCESS); + return (0); } @@ -140,11 +143,41 @@ setup_test(isc_timertype_t timertype, isc_time_t *expires, UNLOCK(&mx); + assert_int_equal(atomic_load(&errcnt), ISC_R_SUCCESS); + isc_task_detach(&task); isc_mutex_destroy(&mx); (void) isc_condition_destroy(&cv); } +static void +set_global_error(isc_result_t result) { + (void)atomic_compare_exchange_strong(&errcnt, + &(uint_fast32_t){ ISC_R_SUCCESS }, + result); +} + +static void +subthread_assert_true(bool expected) { + if (!expected) { + set_global_error(ISC_R_UNEXPECTED); + } +} + +static void +subthread_assert_int_equal(int observed, int expected) { + if (observed != expected) { + set_global_error(ISC_R_UNEXPECTED); + } +} + +static void +subthread_assert_result_equal(isc_result_t result, isc_result_t expected) { + if (result != expected) { + set_global_error(result); + } +} + static void ticktock(isc_task_t *task, isc_event_t *event) { isc_result_t result; @@ -172,31 +205,33 @@ ticktock(isc_task_t *task, isc_event_t *event) { } result = isc_time_now(&now); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); isc_interval_set(&interval, seconds, nanoseconds); isc_mutex_lock(&lasttime_mx); result = isc_time_add(&lasttime, &interval, &base); isc_mutex_unlock(&lasttime_mx); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); isc_interval_set(&interval, FUDGE_SECONDS, FUDGE_NANOSECONDS); result = isc_time_add(&base, &interval, &ulim); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); result = isc_time_subtract(&base, &interval, &llim); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); + + subthread_assert_true(isc_time_compare(&llim, &now) <= 0); + subthread_assert_true(isc_time_compare(&ulim, &now) >= 0); - assert_true(isc_time_compare(&llim, &now) <= 0); - assert_true(isc_time_compare(&ulim, &now) >= 0); isc_interval_set(&interval, 0, 0); isc_mutex_lock(&lasttime_mx); - isc_time_add(&now, &interval, &lasttime); + result = isc_time_add(&now, &interval, &lasttime); isc_mutex_unlock(&lasttime_mx); + subthread_assert_result_equal(result, ISC_R_SUCCESS); if (atomic_load(&eventcnt) == nevents) { result = isc_time_now(&endtime); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); isc_timer_detach(&timer); isc_task_shutdown(task); } @@ -264,29 +299,30 @@ test_idle(isc_task_t *task, isc_event_t *event) { } result = isc_time_now(&now); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); isc_interval_set(&interval, seconds, nanoseconds); isc_mutex_lock(&lasttime_mx); result = isc_time_add(&lasttime, &interval, &base); isc_mutex_unlock(&lasttime_mx); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); isc_interval_set(&interval, FUDGE_SECONDS, FUDGE_NANOSECONDS); result = isc_time_add(&base, &interval, &ulim); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); result = isc_time_subtract(&base, &interval, &llim); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); + + subthread_assert_true(isc_time_compare(&llim, &now) <= 0); + subthread_assert_true(isc_time_compare(&ulim, &now) >= 0); - assert_true(isc_time_compare(&llim, &now) <= 0); - assert_true(isc_time_compare(&ulim, &now) >= 0); isc_interval_set(&interval, 0, 0); isc_mutex_lock(&lasttime_mx); isc_time_add(&now, &interval, &lasttime); isc_mutex_unlock(&lasttime_mx); - assert_int_equal(event->ev_type, ISC_TIMEREVENT_IDLE); + subthread_assert_int_equal(event->ev_type, ISC_TIMEREVENT_IDLE); isc_timer_detach(&timer); isc_task_shutdown(task); @@ -337,46 +373,46 @@ test_reset(isc_task_t *task, isc_event_t *event) { */ result = isc_time_now(&now); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); isc_interval_set(&interval, seconds, nanoseconds); isc_mutex_lock(&lasttime_mx); result = isc_time_add(&lasttime, &interval, &base); isc_mutex_unlock(&lasttime_mx); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); isc_interval_set(&interval, FUDGE_SECONDS, FUDGE_NANOSECONDS); result = isc_time_add(&base, &interval, &ulim); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); result = isc_time_subtract(&base, &interval, &llim); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); - assert_true(isc_time_compare(&llim, &now) <= 0); - assert_true(isc_time_compare(&ulim, &now) >= 0); - isc_interval_set(&interval, 0, 0); - isc_mutex_lock(&lasttime_mx); + subthread_assert_true(isc_time_compare(&llim, &now) <= 0); + subthread_assert_true(isc_time_compare(&ulim, &now) >= 0); + + isc_interval_set(&interval, 0, 0); isc_mutex_lock(&lasttime_mx); isc_time_add(&now, &interval, &lasttime); isc_mutex_unlock(&lasttime_mx); int _eventcnt = atomic_load(&eventcnt); if (_eventcnt < 3) { - assert_int_equal(event->ev_type, ISC_TIMEREVENT_TICK); + subthread_assert_int_equal(event->ev_type, ISC_TIMEREVENT_TICK); if (_eventcnt == 2) { isc_interval_set(&interval, seconds, nanoseconds); result = isc_time_nowplusinterval(&expires, &interval); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); isc_interval_set(&interval, 0, 0); result = isc_timer_reset(timer, isc_timertype_once, &expires, &interval, false); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); } } else { - assert_int_equal(event->ev_type, ISC_TIMEREVENT_LIFE); + subthread_assert_int_equal(event->ev_type, ISC_TIMEREVENT_LIFE); isc_timer_detach(&timer); isc_task_shutdown(task); @@ -453,7 +489,7 @@ tick_event(isc_task_t *task, isc_event_t *event) { isc_interval_set(&interval, seconds, 0); result = isc_timer_reset(tickertimer, isc_timertype_ticker, &expires, &interval, true); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); isc_task_shutdown(task); } @@ -476,7 +512,7 @@ once_event(isc_task_t *task, isc_event_t *event) { startflag = 1; result = isc_condition_broadcast(&cv); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); UNLOCK(&mx); isc_event_free(&event); @@ -501,7 +537,7 @@ shutdown_purge(isc_task_t *task, isc_event_t *event) { shutdownflag = 1; result = isc_condition_signal(&cv); - assert_int_equal(result, ISC_R_SUCCESS); + subthread_assert_result_equal(result, ISC_R_SUCCESS); UNLOCK(&mx); isc_event_free(&event); @@ -574,6 +610,8 @@ purge(void **state) { UNLOCK(&mx); + assert_int_equal(atomic_load(&errcnt), ISC_R_SUCCESS); + assert_int_equal(atomic_load(&eventcnt), 1); isc_timer_detach(&tickertimer);