#include "EventsManager.h" #include "Event.h" EventsManager* EventsManager::Instance = NULL; volatile LONG EventsManager::lLock = 0; EventsManager* EventsManager::self() { while (InterlockedExchange((LPLONG)&lLock, 1) != 0) Sleep(1); if (Instance == NULL) Instance = new(std::nothrow) EventsManager(); InterlockedExchange((LPLONG)&lLock, 0); return Instance; } EventsManager::EventsManager() : hMutex(NULL) { hMutex = CreateMutex(NULL, FALSE, NULL); if (hMutex == NULL) throw new exception(); } EventsManager::~EventsManager() { clear(); if (hMutex != NULL) CloseHandle(hMutex); } void EventsManager::clear() { vector::const_iterator iter; lock(); for (iter = eventsList.begin(); iter != eventsList.end(); iter++) { delete *iter; } eventsList.clear(); unlock(); } void EventsManager::lock() { WaitForSingleObject(hMutex, INFINITE); } void EventsManager::unlock() { ReleaseMutex(hMutex); } BOOL EventsManager::add(const wstring& eventName, JSONObject jConf, void* threadProc) { if (eventName.empty() || threadProc == NULL) return FALSE; lock(); Event* mod = new Event(threadProc, new Configuration(jConf)); eventsList.push_back(mod); unlock(); return TRUE; } BOOL EventsManager::startAll() { vector::const_iterator iter; BOOL running = FALSE; lock(); for (iter = eventsList.begin(); iter != eventsList.end(); ++iter) { Event* module = *iter; if (module->isEnabled()) { running = module->run(); if (running == FALSE) break; Sleep(100); } } unlock(); return running; } BOOL EventsManager::stopAll() { vector::const_iterator iter; BOOL running = FALSE; lock(); for (iter = eventsList.begin(); iter != eventsList.end(); ++iter) { Event* module = *iter; module->stop(); } unlock(); return running; } BOOL EventsManager::enable(INT eventIndex) { if (eventIndex < 0 || (INT)eventsList.size() < eventIndex) return FALSE; lock(); Event* module; try { module = eventsList[eventIndex]; } catch (...) { module = NULL; } // Module absent if (module == NULL) { unlock(); return FALSE; } UINT status = module->getStatus(); if (status == EVENT_RUNNING) { unlock(); return TRUE; } if (module->run() == FALSE) { unlock(); return FALSE; } unlock(); return TRUE; } BOOL EventsManager::disable(INT eventIndex) { if (eventIndex < 0 || (INT)eventsList.size() < eventIndex) return FALSE; lock(); Event* module; try { module = eventsList[eventIndex]; } catch (...) { module = NULL; } if (module == NULL) { // WARNING unlock(); return FALSE; } module->stop(); if (module->getStatus() != EVENT_STOPPED) { unlock(); return FALSE; } unlock(); return TRUE; } #ifdef _DEBUG void EventsManager::dumpEvents() { vector::const_iterator iter; lock(); wprintf(L"Dumping Events:\n"); for (iter = eventsList.begin(); iter != eventsList.end(); ++iter) { wprintf(L"%s\n", (*iter)->getName().c_str()); } unlock(); } #endif .