#include #include #include "ShutdownRequested.h" static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; static bool inProgress = false; static std::set< PipeConditionVar * > allConditionVars; void requestShutdown() { pthread_mutex_lock(&mutex); if (!inProgress) { inProgress = true; pthread_cond_broadcast(&cond); } pthread_mutex_unlock(&mutex); } bool shutdownInProgress() { return inProgress; } void waitForShutdown() { pthread_mutex_lock(&mutex); if (!inProgress) { pthread_cond_wait(&cond, &mutex); } pthread_mutex_unlock(&mutex); } PipeConditionVar *requestShutdownConditionVar() { pthread_mutex_lock(&mutex); PipeConditionVar *newConditionVar = new PipeConditionVar; if (inProgress) { newConditionVar->set(); } allConditionVars.insert(newConditionVar); pthread_mutex_unlock(&mutex); return newConditionVar; } void releaseShutdownConditionVar(PipeConditionVar *cond) { pthread_mutex_lock(&mutex); allConditionVars.erase(cond); pthread_mutex_unlock(&mutex); delete cond; }