|
|
@@ -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;
|
|
|
}
|