From: Evan Hunt Date: Sun, 7 Jul 2013 01:23:41 +0000 (-0700) Subject: [master] prevent exportlib deadlock X-Git-Tag: v9.10.0a1~235 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=eb4458b4784a2206d939f9c4cfed4b37b076b5bc;p=thirdparty%2Fbind9.git [master] prevent exportlib deadlock 3609. [bug] Corrected a possible deadlock in applications using the export version of the isc_app API. [RT #33967] --- diff --git a/CHANGES b/CHANGES index 9fcb86bb582..c7e421adde5 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +3609. [bug] Corrected a possible deadlock in applications using + the export version of the isc_app API. [RT #33967] + 3608. [port] win32: added todos.pl script to ensure all text files the win32 build depends on are converted to DOS newline format. [RT #22067] diff --git a/lib/isc/unix/app.c b/lib/isc/unix/app.c index 81eb29cf89e..2cea67ab5ff 100644 --- a/lib/isc/unix/app.c +++ b/lib/isc/unix/app.c @@ -690,6 +690,11 @@ isc__app_ctxrun(isc_appctx_t *ctx0) { * wait until woken up. */ LOCK(&ctx->readylock); + if (ctx->want_shutdown) { + /* shutdown() won the race. */ + UNLOCK(&ctx->readylock); + break; + } if (!ctx->want_reload) WAIT(&ctx->ready, &ctx->readylock); UNLOCK(&ctx->readylock); @@ -719,7 +724,13 @@ isc__app_ctxrun(isc_appctx_t *ctx0) { * wait until woken up. */ LOCK(&ctx->readylock); - WAIT(&ctx->ready, &ctx->readylock); + if (ctx->want_shutdown) { + /* shutdown() won the race. */ + UNLOCK(&ctx->readylock); + break; + } + if (!ctx->want_reload) + WAIT(&ctx->ready, &ctx->readylock); UNLOCK(&ctx->readylock); } #endif /* HAVE_SIGWAIT */ @@ -802,7 +813,9 @@ isc__app_ctxshutdown(isc_appctx_t *ctx0) { #endif /* HAVE_LINUXTHREADS */ else { /* External, multiple contexts */ + LOCK(&ctx->readylock); ctx->want_shutdown = ISC_TRUE; + UNLOCK(&ctx->readylock); SIGNAL(&ctx->ready); } #endif /* ISC_PLATFORM_USETHREADS */ @@ -878,7 +891,9 @@ isc__app_ctxsuspend(isc_appctx_t *ctx0) { #endif /* HAVE_LINUXTHREADS */ else { /* External, multiple contexts */ + LOCK(&ctx->readylock); ctx->want_reload = ISC_TRUE; + UNLOCK(&ctx->readylock); SIGNAL(&ctx->ready); } #endif /* ISC_PLATFORM_USETHREADS */