2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-30 14:07:59 +00:00

Merge branch '3534-fix-error-reporting-for-posix-threads-functions' into 'main'

Fix error reporting for POSIX Threads functions

See merge request isc-projects/bind9!6756
This commit is contained in:
Michał Kępień
2022-09-09 18:28:07 +00:00
5 changed files with 68 additions and 64 deletions

View File

@@ -63,31 +63,31 @@ typedef pthread_cond_t isc_condition_t;
#define isc__condition_init(cond) \ #define isc__condition_init(cond) \
{ \ { \
int _ret = pthread_cond_init(cond, NULL); \ int _ret = pthread_cond_init(cond, NULL); \
ERRNO_CHECK(pthread_cond_init, _ret); \ PTHREADS_RUNTIME_CHECK(pthread_cond_init, _ret); \
} }
#define isc__condition_wait(cp, mp) \ #define isc__condition_wait(cp, mp) \
{ \ { \
int _ret = pthread_cond_wait(cp, mp); \ int _ret = pthread_cond_wait(cp, mp); \
ERRNO_CHECK(pthread_cond_wait, _ret); \ PTHREADS_RUNTIME_CHECK(pthread_cond_wait, _ret); \
} }
#define isc__condition_signal(cp) \ #define isc__condition_signal(cp) \
{ \ { \
int _ret = pthread_cond_signal(cp); \ int _ret = pthread_cond_signal(cp); \
ERRNO_CHECK(pthread_cond_signal, _ret); \ PTHREADS_RUNTIME_CHECK(pthread_cond_signal, _ret); \
} }
#define isc__condition_broadcast(cp) \ #define isc__condition_broadcast(cp) \
{ \ { \
int _ret = pthread_cond_broadcast(cp); \ int _ret = pthread_cond_broadcast(cp); \
ERRNO_CHECK(pthread_cond_broadcast, _ret); \ PTHREADS_RUNTIME_CHECK(pthread_cond_broadcast, _ret); \
} }
#define isc__condition_destroy(cp) \ #define isc__condition_destroy(cp) \
{ \ { \
int _ret = pthread_cond_destroy(cp); \ int _ret = pthread_cond_destroy(cp); \
ERRNO_CHECK(pthread_cond_destroy, _ret); \ PTHREADS_RUNTIME_CHECK(pthread_cond_destroy, _ret); \
} }
isc_result_t isc_result_t

View File

@@ -60,19 +60,19 @@ extern pthread_mutexattr_t isc__mutex_init_attr;
#define isc__mutex_init(mp) \ #define isc__mutex_init(mp) \
{ \ { \
int _ret = pthread_mutex_init(mp, &isc__mutex_init_attr); \ int _ret = pthread_mutex_init(mp, &isc__mutex_init_attr); \
ERRNO_CHECK(pthread_mutex_init, _ret); \ PTHREADS_RUNTIME_CHECK(pthread_mutex_init, _ret); \
} }
#define isc__mutex_lock(mp) \ #define isc__mutex_lock(mp) \
{ \ { \
int _ret = pthread_mutex_lock(mp); \ int _ret = pthread_mutex_lock(mp); \
ERRNO_CHECK(pthread_mutex_lock, _ret); \ PTHREADS_RUNTIME_CHECK(pthread_mutex_lock, _ret); \
} }
#define isc__mutex_unlock(mp) \ #define isc__mutex_unlock(mp) \
{ \ { \
int _ret = pthread_mutex_unlock(mp); \ int _ret = pthread_mutex_unlock(mp); \
ERRNO_CHECK(pthread_mutex_unlock, _ret); \ PTHREADS_RUNTIME_CHECK(pthread_mutex_unlock, _ret); \
} }
#define isc__mutex_trylock(mp) \ #define isc__mutex_trylock(mp) \
@@ -81,7 +81,7 @@ extern pthread_mutexattr_t isc__mutex_init_attr;
#define isc__mutex_destroy(mp) \ #define isc__mutex_destroy(mp) \
{ \ { \
int _ret = pthread_mutex_destroy(mp); \ int _ret = pthread_mutex_destroy(mp); \
ERRNO_CHECK(pthread_mutex_destroy, _ret); \ PTHREADS_RUNTIME_CHECK(pthread_mutex_destroy, _ret); \
} }
ISC_LANG_ENDDECLS ISC_LANG_ENDDECLS

View File

@@ -130,31 +130,31 @@ typedef struct isc_rwlock isc__rwlock_t;
#define isc__rwlock_init(rwl, rq, wq) \ #define isc__rwlock_init(rwl, rq, wq) \
{ \ { \
int _ret = isc___rwlock_init(rwl, rq, wq); \ int _ret = isc___rwlock_init(rwl, rq, wq); \
ERRNO_CHECK(isc___rwlock_init, _ret); \ PTHREADS_RUNTIME_CHECK(isc___rwlock_init, _ret); \
} }
#define isc__rwlock_lock(rwl, type) \ #define isc__rwlock_lock(rwl, type) \
{ \ { \
int _ret = isc___rwlock_lock(rwl, type); \ int _ret = isc___rwlock_lock(rwl, type); \
ERRNO_CHECK(isc___rwlock_lock, _ret); \ PTHREADS_RUNTIME_CHECK(isc___rwlock_lock, _ret); \
} }
#define isc__rwlock_unlock(rwl, type) \ #define isc__rwlock_unlock(rwl, type) \
{ \ { \
int _ret = isc___rwlock_unlock(rwl, type); \ int _ret = isc___rwlock_unlock(rwl, type); \
ERRNO_CHECK(isc___rwlock_unlock, _ret); \ PTHREADS_RUNTIME_CHECK(isc___rwlock_unlock, _ret); \
} }
#define isc__rwlock_downgrade(rwl) \ #define isc__rwlock_downgrade(rwl) \
{ \ { \
int _ret = isc___rwlock_downgrade(rwl); \ int _ret = isc___rwlock_downgrade(rwl); \
ERRNO_CHECK(isc___rwlock_downgrade, _ret); \ PTHREADS_RUNTIME_CHECK(isc___rwlock_downgrade, _ret); \
} }
#define isc__rwlock_destroy(rwl) \ #define isc__rwlock_destroy(rwl) \
{ \ { \
int _ret = isc___rwlock_destroy(rwl); \ int _ret = isc___rwlock_destroy(rwl); \
ERRNO_CHECK(isc___rwlock_destroy, _ret); \ PTHREADS_RUNTIME_CHECK(isc___rwlock_destroy, _ret); \
} }
int int

View File

@@ -334,13 +334,17 @@ mock_assert(const int result, const char *const expression,
#endif /* UNIT_TESTING */ #endif /* UNIT_TESTING */
/*% Runtime check which logs the error string corresponding to errno */ /*%
#define ERRNO_CHECK(func, ret) \ * Runtime check which logs the error value returned by a POSIX Threads
* function and the error string that corresponds to it
*/
#define PTHREADS_RUNTIME_CHECK(func, ret) \
if ((ret) != 0) { \ if ((ret) != 0) { \
char _strerrorbuf[ISC_STRERRORSIZE]; \ char _strerrorbuf[ISC_STRERRORSIZE]; \
strerror_r(errno, _strerrorbuf, sizeof(_strerrorbuf)); \ strerror_r(ret, _strerrorbuf, sizeof(_strerrorbuf)); \
isc_error_fatal(__FILE__, __LINE__, "%s() failed in %s(): %s", \ isc_error_fatal(__FILE__, __LINE__, \
#func, __func__, _strerrorbuf); \ "%s(): %s() failed with error %d (%s)", \
__func__, #func, ret, _strerrorbuf); \
} }
/*% /*%

View File

@@ -58,18 +58,18 @@ isc_thread_create(isc_threadfunc_t func, isc_threadarg_t arg,
#if defined(HAVE_PTHREAD_ATTR_GETSTACKSIZE) && \ #if defined(HAVE_PTHREAD_ATTR_GETSTACKSIZE) && \
defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE)
ret = pthread_attr_getstacksize(&attr, &stacksize); ret = pthread_attr_getstacksize(&attr, &stacksize);
ERRNO_CHECK(pthread_attr_getstacksize, ret); PTHREADS_RUNTIME_CHECK(pthread_attr_getstacksize, ret);
if (stacksize < THREAD_MINSTACKSIZE) { if (stacksize < THREAD_MINSTACKSIZE) {
ret = pthread_attr_setstacksize(&attr, THREAD_MINSTACKSIZE); ret = pthread_attr_setstacksize(&attr, THREAD_MINSTACKSIZE);
ERRNO_CHECK(pthread_attr_setstacksize, ret); PTHREADS_RUNTIME_CHECK(pthread_attr_setstacksize, ret);
} }
#endif /* if defined(HAVE_PTHREAD_ATTR_GETSTACKSIZE) && \ #endif /* if defined(HAVE_PTHREAD_ATTR_GETSTACKSIZE) && \
* defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) */ * defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) */
ret = pthread_create(thread, &attr, isc__trampoline_run, ret = pthread_create(thread, &attr, isc__trampoline_run,
trampoline_arg); trampoline_arg);
ERRNO_CHECK(pthread_create, ret); PTHREADS_RUNTIME_CHECK(pthread_create, ret);
pthread_attr_destroy(&attr); pthread_attr_destroy(&attr);
@@ -80,7 +80,7 @@ void
isc_thread_join(isc_thread_t thread, isc_threadresult_t *result) { isc_thread_join(isc_thread_t thread, isc_threadresult_t *result) {
int ret = pthread_join(thread, result); int ret = pthread_join(thread, result);
ERRNO_CHECK(pthread_join, ret); PTHREADS_RUNTIME_CHECK(pthread_join, ret);
} }
void void