Переглянути джерело

add ability to lock mutltiple Criticals in one operation

Kolja Strohm 6 годин тому
батько
коміт
57f825eb92
3 змінених файлів з 44 додано та 10 видалено
  1. 36 4
      Critical.cpp
  2. 4 2
      Critical.h
  3. 4 4
      JsonEditor.cpp

+ 36 - 4
Critical.cpp

@@ -153,13 +153,45 @@ int Synchronizer::getNumberOfWaitingThreads() const
     return numWaiting;
 }
 
-Framework::CriticalLock::CriticalLock(Critical* critical)
+Framework::CriticalLock::CriticalLock(
+    std::initializer_list<Critical*> criticals)
 {
-    this->critical = critical;
-    critical->lock();
+    this->criticals = new Critical*[criticals.size()];
+    int i = 0;
+    for (Critical* c : criticals)
+    {
+        this->criticals[i] = c;
+        i++;
+    }
+    size = (int)criticals.size();
+    if (size > 0)
+    {
+        this->criticals[0]->lock();
+        int index = 1;
+        while (index < size)
+        {
+            if (!this->criticals[index]->tryLock())
+            {
+                for (int i = 0; i < index; i++)
+                {
+                    this->criticals[i]->unlock();
+                }
+                this->criticals[index]->lock();
+                this->criticals[index]->unlock();
+                this->criticals[0]->lock();
+                index = 1;
+            }
+            else
+                index++;
+        }
+    }
 }
 
 Framework::CriticalLock::~CriticalLock()
 {
-    critical->unlock();
+    for (int i = 0; i < size; i++)
+    {
+        criticals[i]->unlock();
+    }
+    delete[] criticals;
 }

+ 4 - 2
Critical.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include <condition_variable>
+#include <initializer_list>
 
 #include "OperatingSystem.h"
 
@@ -37,10 +38,11 @@ namespace Framework
     class CriticalLock
     {
     private:
-        Critical* critical;
+        Critical** criticals;
+        int size;
 
     public:
-        DLLEXPORT CriticalLock(Critical* critical);
+        DLLEXPORT CriticalLock(std::initializer_list<Critical*> criticals);
         DLLEXPORT ~CriticalLock();
     };
 

+ 4 - 4
JsonEditor.cpp

@@ -1718,7 +1718,7 @@ JsonEditor::~JsonEditor()
 
 void Framework::JSON::JsonEditor::doMouseEvent(MouseEvent& me, bool userRet)
 {
-    LOCK(&cs);
+    LOCK({&cs});
     rend |= cursorPos.x != me.mx || cursorPos.y != me.my;
     cursorPos.x = me.mx;
     cursorPos.y = me.my;
@@ -2113,7 +2113,7 @@ void Framework::JSON::JsonEditor::setValidator(
 
 void Framework::JSON::JsonEditor::doKeyboardEvent(KeyboardEvent& te)
 {
-    LOCK(&cs);
+    LOCK({&cs});
     if (!textCursor.line)
     {
         return;
@@ -2659,7 +2659,7 @@ void Framework::JSON::JsonEditor::doKeyboardEvent(KeyboardEvent& te)
 
 bool Framework::JSON::JsonEditor::tick(double tickVal)
 {
-    LOCK(&cs);
+    LOCK({&cs});
     time += tickVal;
     timeSicePress += tickVal;
     if (time > 1.0)
@@ -2676,7 +2676,7 @@ bool Framework::JSON::JsonEditor::tick(double tickVal)
 
 void Framework::JSON::JsonEditor::render(Image& rObj)
 {
-    LOCK(&cs);
+    LOCK({&cs});
     renderings++;
     renderedLines = 0;
     errorDescription->removeStyle(TextField::Style::Visible);