Mornella/Mornella_Mobile/Module.cpp
#include "Module.h"
Module::Module(void* proc, Configuration *c) : stopModule(0), cycleModule(0), hHandle(NULL), status(MODULE_DISABLED) {
threadProc = proc;
conf = c;
eventHandle = CreateEvent(NULL, FALSE, FALSE, NULL);
}
Module::~Module() {
CloseHandle(eventHandle);
delete conf;
}
BOOL Module::shouldStop() {
return static_cast<BOOL>(stopModule);
}
// Check and reset
BOOL Module::shouldCycle() {
BOOL ret = static_cast<BOOL>(cycleModule);
InterlockedExchange((LPLONG)&cycleModule, 0);
return ret;
}
BOOL Module::run() {
if (hHandle != NULL) {
// One shot module, like device, camera...
CloseHandle(hHandle);
hHandle = NULL;
}
if (threadProc == NULL)
return FALSE;
hHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadProc, (void*) this, 0, &threadID);
if (hHandle == NULL)
return FALSE;
return TRUE;
}
HANDLE Module::getHandle() {
return hHandle;
}
// Concurrent
void Module::requestStop() {
InterlockedExchange((LPLONG)&stopModule, 1);
SetEvent(eventHandle);
}
void Module::setStatus(UINT newStatus) {
InterlockedExchange((LPLONG)&status, newStatus);
}
void Module::stop() {
requestStop();
if (hHandle == NULL)
return;
WaitForSingleObject(hHandle, INFINITE);
CloseHandle(hHandle);
hHandle = NULL;
stopModule = FALSE;
}
void Module::requestCycle() {
InterlockedExchange((LPLONG)&cycleModule, 1);
}
UINT Module::getStatus() {
return status;
}
Configuration* Module::getConf() {
return conf;
}
HANDLE Module::getEvent() {
return eventHandle;
}