From: Scott Cantor Date: Sat, 11 Jun 2011 03:44:12 +0000 (+0000) Subject: Make init/term reentrant. X-Git-Tag: 1.0.0~10 X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-sp-resolver.git;a=commitdiff_plain;h=244dfcf85bb266a84a08f4dedfd9fd2362d1235a Make init/term reentrant. --- diff --git a/.cproject b/.cproject index 202fbdd..3638957 100644 --- a/.cproject +++ b/.cproject @@ -18,14 +18,14 @@ - + - + - - - @@ -47,410 +47,6 @@ - - - - make - - all - true - true - false - - - make - - am--refresh - true - true - false - - - make - - check - true - true - false - - - make - - clean - true - true - false - - - make - - clean-libtool - true - true - false - - - make - - config.h - true - true - false - - - make - - ctags - true - true - false - - - make - - ctags-recursive - true - true - false - - - make - - dist - true - true - false - - - make - - dist-all - true - true - false - - - make - - dist-bzip2 - true - true - false - - - make - - dist-gzip - true - true - false - - - make - - dist-shar - true - true - false - - - make - - dist-tarZ - true - true - false - - - make - - dist-zip - true - true - false - - - make - - distcheck - true - true - false - - - make - - distclean - true - true - false - - - make - - distclean-hdr - true - true - false - - - make - - distclean-libtool - true - true - false - - - make - - distclean-tags - true - true - false - - - make - - distcleancheck - true - true - false - - - make - - distdir - true - true - false - - - make - - distuninstallcheck - true - true - false - - - make - - dvi - true - true - false - - - make - - html - true - true - false - - - make - - info - true - true - false - - - make - - install - true - true - false - - - make - - install-data - true - true - false - - - make - - install-dvi - true - true - false - - - make - - install-exec - true - true - false - - - make - - install-html - true - true - false - - - make - - install-info - true - true - false - - - make - - install-man - true - true - false - - - make - - install-pdf - true - true - false - - - make - - install-ps - true - true - false - - - make - - install-strip - true - true - false - - - make - - installcheck - true - true - false - - - make - - installdirs - true - true - false - - - make - - maintainer-clean - true - true - false - - - make - - Makefile - true - true - false - - - make - - mostlyclean - true - true - false - - - make - - mostlyclean-libtool - true - true - false - - - make - - pdf - true - true - false - - - make - - Portfile - true - true - false - - - make - - ps - true - true - false - - - make - - resolver.spec - true - true - false - - - make - - stamp-h1 - true - true - false - - - make - - tags - true - true - false - - - make - - tags-recursive - true - true - false - - - make - - uninstall - true - true - false - - - @@ -1032,6 +628,442 @@ + + + + make + + all + true + true + false + + + make + + am--refresh + true + true + false + + + make + + check + true + true + false + + + make + + clean + true + true + false + + + make + + clean-libtool + true + true + false + + + make + + config.h + true + true + false + + + make + + ctags + true + true + false + + + make + + ctags-recursive + true + true + false + + + make + + dist + true + true + false + + + make + + dist-all + true + true + false + + + make + + dist-bzip2 + true + true + false + + + make + + dist-gzip + true + true + false + + + make + + dist-lzma + true + true + false + + + make + + dist-shar + true + true + false + + + make + + dist-tarZ + true + true + false + + + make + + dist-xz + true + true + false + + + make + + dist-zip + true + true + false + + + make + + distcheck + true + true + false + + + make + + distclean + true + true + false + + + make + + distclean-hdr + true + true + false + + + make + + distclean-libtool + true + true + false + + + make + + distclean-tags + true + true + false + + + make + + distcleancheck + true + true + false + + + make + + distdir + true + true + false + + + make + + distuninstallcheck + true + true + false + + + make + + dvi + true + true + false + + + make + + html + true + true + false + + + make + + info + true + true + false + + + make + + install + true + true + false + + + make + + install-data + true + true + false + + + make + + install-dvi + true + true + false + + + make + + install-exec + true + true + false + + + make + + install-html + true + true + false + + + make + + install-info + true + true + false + + + make + + install-man + true + true + false + + + make + + install-pdf + true + true + false + + + make + + install-ps + true + true + false + + + make + + install-strip + true + true + false + + + make + + installcheck + true + true + false + + + make + + installdirs + true + true + false + + + make + + maintainer-clean + true + true + false + + + make + + Makefile + true + true + false + + + make + + mostlyclean + true + true + false + + + make + + mostlyclean-libtool + true + true + false + + + make + + pdf + true + true + false + + + make + + Portfile + true + true + false + + + make + + ps + true + true + false + + + make + + resolver.spec + true + true + false + + + make + + src/shibresolver/config_pub.h + true + true + false + + + make + + src/shibresolver/stamp-h2 + true + true + false + + + make + + stamp-h1 + true + true + false + + + make + + tags + true + true + false + + + make + + tags-recursive + true + true + false + + + make + + uninstall + true + true + false + + + diff --git a/src/shibresolver/resolver.cpp b/src/shibresolver/resolver.cpp index c23dc63..5b2e70d 100644 --- a/src/shibresolver/resolver.cpp +++ b/src/shibresolver/resolver.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -109,6 +110,9 @@ namespace shibresolver { }; static RemotedResolver g_Remoted; + + static int g_initCount = 0; + static auto_ptr g_lock(Mutex::create()); }; ShibbolethResolver* ShibbolethResolver::create() @@ -587,6 +591,18 @@ const RoleDescriptor* RemotedResolver::lookup( bool ShibbolethResolver::init(unsigned long features, const char* config, bool rethrow) { + Lock initLock(g_lock.get()); + + if (g_initCount == INT_MAX) { + Category::getInstance(SHIBRESOLVER_LOGCAT".Config").crit("library initialized too many times"); + return false; + } + + if (g_initCount >= 1) { + ++g_initCount; + return true; + } + if (features & SPConfig::OutOfProcess) { #ifndef SHIBSP_LITE features = features | SPConfig::AttributeResolution | SPConfig::Metadata | SPConfig::Trust | SPConfig::Credentials; @@ -602,16 +618,22 @@ bool ShibbolethResolver::init(unsigned long features, const char* config, bool r return false; if (!SPConfig::getConfig().instantiate(config, rethrow)) return false; + + ++g_initCount; return true; } -/** - * Shuts down runtime. - * - * Each process using the library SHOULD call this function exactly once before terminating itself. - */ void ShibbolethResolver::term() { + Lock initLock(g_lock.get()); + if (g_initCount == 0) { + Category::getInstance(SHIBRESOLVER_LOGCAT".Config").crit("term without corresponding init"); + return; + } + else if (--g_initCount > 0) { + return; + } + SPConfig::getConfig().term(); }