aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/flagTracker.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/omBrowser/flagTracker.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/omBrowser/flagTracker.cpp')
-rw-r--r--Src/omBrowser/flagTracker.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/Src/omBrowser/flagTracker.cpp b/Src/omBrowser/flagTracker.cpp
new file mode 100644
index 00000000..2073fd76
--- /dev/null
+++ b/Src/omBrowser/flagTracker.cpp
@@ -0,0 +1,96 @@
+#include "main.h"
+#include "./flagTracker.h"
+
+FlagTracker::FlagTracker()
+ : flags(0), cache(0), updateRef(0), eventHandler(NULL), eventParam(0)
+{
+ InitializeCriticalSection(&lock);
+}
+
+FlagTracker::~FlagTracker()
+{
+ DeleteCriticalSection(&lock);
+}
+
+void FlagTracker::Set(UINT nFlags, UINT nMask)
+{
+ EnterCriticalSection(&lock);
+
+ nFlags &= nMask;
+
+ UINT clearMask = ~(nFlags ^ nMask);
+ flags &= clearMask;
+ cache &= clearMask;
+
+ if (0 != nFlags)
+ {
+ Mark(nFlags);
+ }
+
+ LeaveCriticalSection(&lock);
+}
+
+UINT FlagTracker::Get()
+{
+ return flags;
+}
+
+void FlagTracker::Mark(UINT nFlags)
+{
+ EnterCriticalSection(&lock);
+
+ flags |= nFlags;
+
+ if (0 == updateRef)
+ {
+ if (NULL != eventHandler && 0 != nFlags)
+ {
+ eventHandler(nFlags, this, eventParam);
+ }
+ }
+ else
+ {
+ cache |= nFlags;
+ }
+ LeaveCriticalSection(&lock);
+}
+
+ULONG FlagTracker::BeginUpdate()
+{
+ EnterCriticalSection(&lock);
+ ULONG r = InterlockedIncrement((LONG*)&updateRef);
+ LeaveCriticalSection(&lock);
+ return r;
+}
+
+ULONG FlagTracker::EndUpdate()
+{
+ EnterCriticalSection(&lock);
+
+ ULONG r;
+ if (0 == updateRef)
+ {
+ r = 0;
+ }
+ else
+ {
+ r = InterlockedDecrement((LONG*)&updateRef);
+ if (0 == r && 0 != cache)
+ {
+ Mark(cache);
+ cache = 0;
+ }
+ }
+ LeaveCriticalSection(&lock);
+ return r;
+}
+
+void FlagTracker::SetEventHandler(EventHandler handler, ULONG_PTR user)
+{
+ EnterCriticalSection(&lock);
+
+ eventHandler = handler;
+ eventParam = user;
+
+ LeaveCriticalSection(&lock);
+} \ No newline at end of file