From: Ondřej Surý Date: Thu, 18 Jul 2019 15:24:05 +0000 (+0200) Subject: Make isc_thread_create() assert internally on failure X-Git-Tag: v9.15.3~17^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d6a60f2905e861f44533c2fb93463934b9310ac9;p=thirdparty%2Fbind9.git Make isc_thread_create() assert internally on failure Previously isc_thread_create() would return ISC_R_UNEXPECTED on a failure to create new thread. All such occurences were caught and wrapped into assert function at higher level. The function was simplified to assert directly in the isc_thread_create() function and all caller level assertions were removed. --- diff --git a/bin/tests/optional/rwlock_test.c b/bin/tests/optional/rwlock_test.c index 96ae7b9d3f2..d7a87ac92a2 100644 --- a/bin/tests/optional/rwlock_test.c +++ b/bin/tests/optional/rwlock_test.c @@ -109,14 +109,11 @@ main(int argc, char *argv[]) { snprintf(name, sizeof(name), "%02u", i); dupname = strdup(name); RUNTIME_CHECK(dupname != NULL); - if (i != 0 && i % 3 == 0) - RUNTIME_CHECK(isc_thread_create(run1, dupname, - &workers[i]) == - ISC_R_SUCCESS); - else - RUNTIME_CHECK(isc_thread_create(run2, dupname, - &workers[i]) == - ISC_R_SUCCESS); + if (i != 0 && i % 3 == 0) { + isc_thread_create(run1, dupname, &workers[i]); + } else { + isc_thread_create(run2, dupname, &workers[i]); + } } for (i = 0; i < nworkers; i++) diff --git a/lib/dns/tests/name_test.c b/lib/dns/tests/name_test.c index b3dcf81176f..4e51b9300fc 100644 --- a/lib/dns/tests/name_test.c +++ b/lib/dns/tests/name_test.c @@ -743,8 +743,7 @@ benchmark_test(void **state) { nthreads = ISC_MIN(isc_os_ncpus(), 32); nthreads = ISC_MAX(nthreads, 1); for (i = 0; i < nthreads; i++) { - result = isc_thread_create(fromwire_thread, NULL, &threads[i]); - assert_int_equal(result, ISC_R_SUCCESS); + isc_thread_create(fromwire_thread, NULL, &threads[i]); } for (i = 0; i < nthreads; i++) { diff --git a/lib/dns/tests/rbt_test.c b/lib/dns/tests/rbt_test.c index 478ef686733..34119f4dd03 100644 --- a/lib/dns/tests/rbt_test.c +++ b/lib/dns/tests/rbt_test.c @@ -1295,8 +1295,7 @@ benchmark(void **state) { nthreads = ISC_MIN(isc_os_ncpus(), 32); nthreads = ISC_MAX(nthreads, 1); for (i = 0; i < nthreads; i++) { - result = isc_thread_create(find_thread, mytree, &threads[i]); - assert_int_equal(result, ISC_R_SUCCESS); + isc_thread_create(find_thread, mytree, &threads[i]); } for (i = 0; i < nthreads; i++) { diff --git a/lib/isc/pthreads/include/isc/thread.h b/lib/isc/pthreads/include/isc/thread.h index 6d969500285..a3a6106753f 100644 --- a/lib/isc/pthreads/include/isc/thread.h +++ b/lib/isc/pthreads/include/isc/thread.h @@ -32,7 +32,7 @@ typedef void * isc_threadarg_t; typedef isc_threadresult_t (*isc_threadfunc_t)(isc_threadarg_t); typedef pthread_key_t isc_thread_key_t; -isc_result_t +void isc_thread_create(isc_threadfunc_t, isc_threadarg_t, isc_thread_t *); void diff --git a/lib/isc/pthreads/thread.c b/lib/isc/pthreads/thread.c index 9c01e7db2af..6e4ebc4c0a0 100644 --- a/lib/isc/pthreads/thread.c +++ b/lib/isc/pthreads/thread.c @@ -34,7 +34,16 @@ #define THREAD_MINSTACKSIZE (1024U * 1024) #endif -isc_result_t +#define _FATAL(r, f) \ + { \ + char strbuf[ISC_STRERRORSIZE]; \ + strerror_r(r, strbuf, sizeof(strbuf)); \ + isc_error_fatal(__FILE__, __LINE__, \ + f # " failed: %s", \ + strbuf); \ + } + +void isc_thread_create(isc_threadfunc_t func, isc_threadarg_t arg, isc_thread_t *thread) { @@ -50,23 +59,26 @@ isc_thread_create(isc_threadfunc_t func, isc_threadarg_t arg, #if defined(HAVE_PTHREAD_ATTR_GETSTACKSIZE) && \ defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) ret = pthread_attr_getstacksize(&attr, &stacksize); - if (ret != 0) - return (ISC_R_UNEXPECTED); + if (ret != 0) { + _FATAL(ret, "pthread_attr_getstacksize"); + } if (stacksize < THREAD_MINSTACKSIZE) { ret = pthread_attr_setstacksize(&attr, THREAD_MINSTACKSIZE); - if (ret != 0) - return (ISC_R_UNEXPECTED); + if (ret != 0) { + _FATAL(ret, pthread_attr_setstacksize); + } } #endif ret = pthread_create(thread, &attr, func, arg); - if (ret != 0) - return (ISC_R_UNEXPECTED); + if (ret != 0) { + _FATAL(ret,"pthread_create"); + } pthread_attr_destroy(&attr); - return (ISC_R_SUCCESS); + return; } #ifdef __NetBSD__ diff --git a/lib/isc/task.c b/lib/isc/task.c index 651b0934aa2..6199dc64fcd 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -1384,9 +1384,8 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers, manager->queues[i].manager = manager; manager->queues[i].threadid = i; - RUNTIME_CHECK(isc_thread_create(run, &manager->queues[i], - &manager->queues[i].thread) - == ISC_R_SUCCESS); + isc_thread_create(run, &manager->queues[i], + &manager->queues[i].thread); char name[21]; snprintf(name, sizeof(name), "isc-worker%04u", i); isc_thread_setname(manager->queues[i].thread, name); diff --git a/lib/isc/tests/mem_test.c b/lib/isc/tests/mem_test.c index 293ba3fcd3a..735d4116f0b 100644 --- a/lib/isc/tests/mem_test.c +++ b/lib/isc/tests/mem_test.c @@ -463,8 +463,7 @@ isc_mem_benchmark(void **state) { assert_int_equal(result, ISC_R_SUCCESS); for (int i = 0; i < nthreads; i++) { - result = isc_thread_create(mem_thread, &size, &threads[i]); - assert_int_equal(result, ISC_R_SUCCESS); + isc_thread_create(mem_thread, &size, &threads[i]); size = size / 2; } for (int i = 0; i < nthreads; i++) { @@ -527,8 +526,7 @@ isc_mempool_benchmark(void **state) { assert_int_equal(result, ISC_R_SUCCESS); for (int i = 0; i < nthreads; i++) { - result = isc_thread_create(mempool_thread, mp, &threads[i]); - assert_int_equal(result, ISC_R_SUCCESS); + isc_thread_create(mempool_thread, mp, &threads[i]); size = size / 2; } for (int i = 0; i < nthreads; i++) { diff --git a/lib/isc/timer.c b/lib/isc/timer.c index 1c3ef3d0e37..276c2f5566f 100644 --- a/lib/isc/timer.c +++ b/lib/isc/timer.c @@ -697,17 +697,7 @@ isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) { isc_mutex_init(&manager->lock); isc_mem_attach(mctx, &manager->mctx); isc_condition_init(&manager->wakeup); - if (isc_thread_create(run, manager, &manager->thread) != - ISC_R_SUCCESS) { - isc_mem_detach(&manager->mctx); - (void)isc_condition_destroy(&manager->wakeup); - isc_mutex_destroy(&manager->lock); - isc_heap_destroy(&manager->heap); - isc_mem_put(mctx, manager, sizeof(*manager)); - UNEXPECTED_ERROR(__FILE__, __LINE__, "%s", - "isc_thread_create() failed"); - return (ISC_R_UNEXPECTED); - } + isc_thread_create(run, manager, &manager->thread); isc_thread_setname(manager->thread, "isc-timer"); *managerp = (isc_timermgr_t *)manager; diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index b303134efc1..f9ed0cc9860 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -3810,10 +3810,9 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, manager->threads[i].manager = manager; manager->threads[i].threadid = i; setup_thread(&manager->threads[i]); - RUNTIME_CHECK(isc_thread_create(netthread, - &manager->threads[i], - &manager->threads[i].thread) - == ISC_R_SUCCESS); + isc_thread_create(netthread, + &manager->threads[i], + &manager->threads[i].thread); char tname[1024]; sprintf(tname, "isc-socket-%d", i); isc_thread_setname(manager->threads[i].thread, tname); diff --git a/lib/isc/win32/include/isc/thread.h b/lib/isc/win32/include/isc/thread.h index 25b83af0738..5642b974fb8 100644 --- a/lib/isc/win32/include/isc/thread.h +++ b/lib/isc/win32/include/isc/thread.h @@ -67,7 +67,7 @@ typedef DWORD isc_thread_key_t; ISC_LANG_BEGINDECLS -isc_result_t +void isc_thread_create(isc_threadfunc_t, isc_threadarg_t, isc_thread_t *); isc_result_t diff --git a/lib/isc/win32/thread.c b/lib/isc/win32/thread.c index 16ce5c5c6f6..9d421b21489 100644 --- a/lib/isc/win32/thread.c +++ b/lib/isc/win32/thread.c @@ -11,10 +11,11 @@ #include +#include #include #include -isc_result_t +void isc_thread_create(isc_threadfunc_t start, isc_threadarg_t arg, isc_thread_t *threadp) { @@ -23,13 +24,16 @@ isc_thread_create(isc_threadfunc_t start, isc_threadarg_t arg, thread = (isc_thread_t)_beginthreadex(NULL, 0, start, arg, 0, &id); if (thread == NULL) { - /* XXX */ - return (ISC_R_UNEXPECTED); + char strbuf[ISC_STRERRORSIZE]; + /* FIXME */ + strerror_r(GetLastError(), strbuf, sizeof(strbuf)); + isc_error_fatal(__FILE__, __LINE__, "_beginthreadex failed: %s", + strbuf); } *threadp = thread; - return (ISC_R_SUCCESS); + return; } isc_result_t