diff options
Diffstat (limited to 'Src/devices/discoveryMonitor.cpp')
-rw-r--r-- | Src/devices/discoveryMonitor.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/Src/devices/discoveryMonitor.cpp b/Src/devices/discoveryMonitor.cpp new file mode 100644 index 00000000..3a42bd08 --- /dev/null +++ b/Src/devices/discoveryMonitor.cpp @@ -0,0 +1,105 @@ +#include "main.h" +#include "./discoveryMonitor.h" + +DiscoveryMonitor::DiscoveryMonitor() +{ + InitializeCriticalSection(&lock); +} + +DiscoveryMonitor::~DiscoveryMonitor() +{ + DeleteCriticalSection(&lock); +} + +void DiscoveryMonitor::Lock() +{ + EnterCriticalSection(&lock); +} + +void DiscoveryMonitor::Unlock() +{ + LeaveCriticalSection(&lock); +} + +BOOL DiscoveryMonitor::Register(ifc_deviceprovider *provider) +{ + Lock(); + + size_t index = activityList.size(); + while(index--) + { + ActiveDiscovery *entry = &activityList[index]; + if ((intptr_t)provider == entry->providerId) + { + entry->ref++; + Unlock(); + return FALSE; + } + } + + ActiveDiscovery record; + record.providerId = (intptr_t)provider; + record.ref = 1; + + activityList.push_back(record); + index = activityList.size(); + + Unlock(); + return (1 == index); +} + +BOOL DiscoveryMonitor::Unregister(ifc_deviceprovider *provider) +{ + Lock(); + + size_t index = activityList.size(); + while(index--) + { + ActiveDiscovery *entry = &activityList[index]; + if ((intptr_t)provider == entry->providerId) + { + if (1 == entry->ref) + { + activityList.erase(activityList.begin() + index); + index = activityList.size(); + Unlock(); + return (0 == index); + } + + entry->ref--; + break; + } + } + + Unlock(); + return FALSE; +} + +BOOL DiscoveryMonitor::IsActive() +{ + size_t count; + + Lock(); + + count = activityList.size(); + + Unlock(); + + return (0 != count); +} + +BOOL DiscoveryMonitor::Reset() +{ + size_t count; + + Lock(); + + count = activityList.size(); + activityList.clear(); + + Unlock(); + + return (0 != count); +} + + |