#include "squid.h"
#include "base/RunnersRegistry.h"
+#include "base/TextException.h"
#include <set>
/// a collection of unique runners, in no particular order
/// creates the registered runners container if needed
/// \return either registered runners (if they should exist) or nil (otherwise)
-static Runners *
+static inline Runners *
FindRunners()
{
if (!TheRunners && !RunnersGone)
// else ignore; IndependentRunner
}
+static inline void
+RegisterRunner_(RegisteredRunner *rr)
+{
+ Runners *runners = FindRunners();
+ Must(runners);
+ runners->insert(rr);
+}
+
bool
RegisterRunner(RegisteredRunner *rr)
{
- if (Runners *runners = FindRunners()) {
- runners->insert(rr);
+ Must(!dynamic_cast<IndependentRunner*>(rr));
+
+ if (FindRunners()) {
+ RegisterRunner_(rr);
return true;
}
// else it is too late, finishShutdown() has been called
}
+void
+IndependentRunner::registerRunner()
+{
+ if (FindRunners())
+ RegisterRunner_(this);
+ // else do nothing past finishShutdown
+}
+
bool
UseThisStatic(const void *)
{
virtual ~IndependentRunner() { unregisterRunner(); }
protected:
- void registerRunner() {RegisterRunner(this);}
+ void registerRunner();
void unregisterRunner(); ///< unregisters self; safe to call multiple times
};