X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-sp-resolver.git;a=blobdiff_plain;f=src%2Fshibresolver%2Fresolver.cpp;fp=src%2Fshibresolver%2Fresolver.cpp;h=5b2e70dbb6c6c5911af990d562e6099b0fda5399;hp=c23dc634124ef29b6804b8b6c7c910fe030d21f5;hb=244dfcf85bb266a84a08f4dedfd9fd2362d1235a;hpb=eef809f3461d994b3436044307cd6d408891c329 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(); }