[colobot] 218/377: CBotClass::Lock() refactoring
Didier Raboud
odyx at moszumanska.debian.org
Wed Mar 30 13:34:18 UTC 2016
This is an automated email from the git hooks/post-receive script.
odyx pushed a commit to branch debian/master
in repository colobot.
commit 48ab72d0566660816b1038ad59d11a369a7ffc16
Author: krzys-h <krzys_h at interia.pl>
Date: Thu Dec 31 16:11:19 2015 +0100
CBotClass::Lock() refactoring
---
src/CBot/CBotClass.cpp | 70 +++++++++++++++-----------------------------------
src/CBot/CBotClass.h | 35 +++++++++++++------------
2 files changed, 39 insertions(+), 66 deletions(-)
diff --git a/src/CBot/CBotClass.cpp b/src/CBot/CBotClass.cpp
index b0afb72..b0b8888 100644
--- a/src/CBot/CBotClass.cpp
+++ b/src/CBot/CBotClass.cpp
@@ -27,6 +27,8 @@
#include "CBot/CBotInstr/CBotListArray.h"
#include "CBot/CBotInstr/CBotEmpty.h"
+#include "CBot/CBotVar/CBotVar.h"
+
#include "CBot/CBotExternalCall.h"
#include "CBot/CBotStack.h"
#include "CBot/CBotCStack.h"
@@ -34,7 +36,7 @@
#include "CBot/CBotFileUtils.h"
#include "CBot/CBotCallMethode.h"
-#include "CBot/CBotVar/CBotVar.h"
+#include <algorithm>
namespace CBot
{
@@ -55,14 +57,10 @@ CBotClass::CBotClass(const std::string& name,
m_rMaj = nullptr;
m_IsDef = true;
m_bIntrinsic= bIntrinsic;
- m_cptLock = 0;
- m_cptOne = 0;
m_nbVar = m_pParent == nullptr ? 0 : m_pParent->m_nbVar;
- for ( int j= 0; j< 5 ; j++ )
- {
- m_ProgInLock[j] = nullptr;
- }
+ m_lockCurrentCount = 0;
+ m_lockProg.clear();
// is located alone in the list
@@ -126,38 +124,26 @@ void CBotClass::Purge()
}
////////////////////////////////////////////////////////////////////////////////
-bool CBotClass::Lock(CBotProgram* p)
+bool CBotClass::Lock(CBotProgram* prog)
{
- int i = m_cptLock++;
-
- if ( i == 0 )
+ if (m_lockProg.size() == 0)
{
- m_cptOne = 1;
- m_ProgInLock[0] = p;
+ m_lockCurrentCount = 1;
+ m_lockProg.push_back(prog);
return true;
}
- if ( p == m_ProgInLock[0] )
+ if (prog == m_lockProg[0])
{
- m_cptOne++;
- m_cptLock--; // has already been counted
+ m_lockCurrentCount++;
return true;
}
- for ( int j = 1 ; j <= i ; j++)
+ if (std::find(m_lockProg.begin(), m_lockProg.end(), prog) != m_lockProg.end())
{
- if ( p == m_ProgInLock[j] )
- {
- m_cptLock--;
- return false; // already pending
- }
+ return false; // already pending
}
- if ( i < 5 ) // max 5 in query
- {
- m_ProgInLock[i] = p; // located in a queue
- }
- else
- m_cptLock--;
+ m_lockProg.push_back(prog);
return false;
}
@@ -165,38 +151,24 @@ bool CBotClass::Lock(CBotProgram* p)
////////////////////////////////////////////////////////////////////////////////
void CBotClass::Unlock()
{
- if ( --m_cptOne > 0 ) return ;
+ if (--m_lockCurrentCount > 0) return; // if called Lock() multiple times, wait for all to unlock
- int i = --m_cptLock;
- if ( i<0 )
- {
- m_cptLock = 0;
- return;
- }
-
- for ( int j= 0; j< i ; j++ )
- {
- m_ProgInLock[j] = m_ProgInLock[j+1];
- }
- m_ProgInLock[i] = nullptr;
+ m_lockProg.pop_front();
}
////////////////////////////////////////////////////////////////////////////////
-void CBotClass::FreeLock(CBotProgram* p)
+void CBotClass::FreeLock(CBotProgram* prog)
{
CBotClass* pClass = m_ExClass;
- while ( pClass != nullptr )
+ while (pClass != nullptr)
{
- if ( p == pClass->m_ProgInLock[0] )
+ if (pClass->m_lockProg.size() > 0 && prog == pClass->m_lockProg[0])
{
- pClass->m_cptLock -= pClass->m_cptOne;
- pClass->m_cptOne = 0;
+ pClass->m_lockCurrentCount = 0;
}
- for ( int j = 1; j < 5 ; j++ )
- if ( p == pClass->m_ProgInLock[j] )
- pClass->m_cptLock--;
+ pClass->m_lockProg.erase(std::remove(pClass->m_lockProg.begin(), pClass->m_lockProg.end(), prog));
pClass = pClass->m_ExNext;
}
diff --git a/src/CBot/CBotClass.h b/src/CBot/CBotClass.h
index a688a86..2589cf7 100644
--- a/src/CBot/CBotClass.h
+++ b/src/CBot/CBotClass.h
@@ -24,6 +24,7 @@
#include "CBot/CBotVar/CBotVar.h"
#include <string>
+#include <deque>
namespace CBot
{
@@ -333,23 +334,24 @@ public:
*/
static bool RestoreStaticState(FILE* pf);
- /*!
- * \brief Lock
- * \param p
- * \return
+ /**
+ * \brief Request a lock on this class (for "synchronized" keyword)
+ * \param prog Program that requests the lock
+ * \return true if lock was acquired, false if the lock is already taken
*/
- bool Lock(CBotProgram* p);
+ bool Lock(CBotProgram* prog);
- /*!
- * \brief Unlock
+ /**
+ * \brief Release the lock acquired in Lock()
+ * If you call Lock() multiple times for the same program, you have to call Unlock() multiple times too
*/
void Unlock();
- /*!
- * \brief FreeLock
- * \param p
+ /**
+ * \brief Release all locks in all classes held by this program
+ * \param prog Program to release the locks from
*/
- static void FreeLock(CBotProgram* p);
+ static void FreeLock(CBotProgram* prog);
/*!
* \brief CheckCall Test if a procedure name is already defined somewhere.
@@ -383,12 +385,11 @@ private:
CBotFunction* m_pMethod;
void (*m_rMaj) ( CBotVar* pThis, void* pUser );
friend class CBotVarClass;
- //! For Lock / UnLock.
- int m_cptLock;
- //! Lock for reentrancy.
- int m_cptOne;
- //! Processes waiting for sync.
- CBotProgram* m_ProgInLock[5];
+
+ //! How many times the program currently holding the lock called Lock()
+ int m_lockCurrentCount;
+ //! Programs waiting for lock
+ std::deque<CBotProgram*> m_lockProg;
};
} // namespace CBot
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git
More information about the Pkg-games-commits
mailing list