bugfix: racecondition removed

git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1921 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
hellwig
2012-11-12 11:46:26 +00:00
parent 464bc9390b
commit 6f98d64613
2 changed files with 19 additions and 21 deletions

View File

@ -27,6 +27,7 @@ void JobServer::addParam(ExperimentData* exp)
{ {
#ifndef __puma #ifndef __puma
m_undoneJobs.Enqueue(exp); m_undoneJobs.Enqueue(exp);
m_inOutCounter.increment();
#endif #endif
} }
@ -34,24 +35,28 @@ void JobServer::addParam(ExperimentData* exp)
volatile unsigned JobServer::m_DoneCount = 0; volatile unsigned JobServer::m_DoneCount = 0;
#endif #endif
#ifndef __puma
boost::mutex CommThread::m_CommMutex;
#endif
ExperimentData *JobServer::getDone() ExperimentData *JobServer::getDone()
{ {
// FIXME race condition, need to synchronize with
// sendPendingExperimentData() and receiveExperimentResults()
#ifndef __puma #ifndef __puma
boost::unique_lock<boost::mutex> lock(CommThread::m_CommMutex);
if (m_undoneJobs.Size() == 0 if (m_undoneJobs.Size() == 0
&& noMoreExperiments() && noMoreExperiments()
&& m_runningJobs.Size() == 0 && m_runningJobs.Size() == 0
&& m_doneJobs.Size() == 0) { && m_doneJobs.Size() == 0
// FRICKEL workaround && m_inOutCounter.getValue() == 0) {
sleep(1);
ExperimentData *exp = NULL;
if (m_doneJobs.Dequeue_nb(exp)) {
return exp;
}
return 0; return 0;
} }
return m_doneJobs.Dequeue();
ExperimentData *exp = NULL;
exp = m_doneJobs.Dequeue();
m_inOutCounter.decrement();
return exp;
#endif #endif
} }
@ -232,10 +237,6 @@ void CommThread::operator()()
close(m_sock); close(m_sock);
} }
#ifndef __puma
boost::mutex CommThread::m_CommMutex;
#endif // __puma
void CommThread::sendPendingExperimentData(Minion& minion) void CommThread::sendPendingExperimentData(Minion& minion)
{ {
FailControlMessage ctrlmsg; FailControlMessage ctrlmsg;
@ -297,10 +298,6 @@ void CommThread::sendPendingExperimentData(Minion& minion)
void CommThread::receiveExperimentResults(Minion& minion, uint32_t workloadID) void CommThread::receiveExperimentResults(Minion& minion, uint32_t workloadID)
{ {
#ifndef __puma
boost::unique_lock<boost::mutex> lock(m_CommMutex);
#endif
ExperimentData* exp = NULL; // Get exp* from running jobs ExperimentData* exp = NULL; // Get exp* from running jobs
//cout << "<<[Server] Received result for workload id [" << workloadID << "]" << endl; //cout << "<<[Server] Received result for workload id [" << workloadID << "]" << endl;
cout << "<<[" << workloadID << "] " << flush; cout << "<<[" << workloadID << "] " << flush;

View File

@ -55,6 +55,7 @@ private:
boost::thread* m_measureThread; //! the performance measurement thread boost::thread* m_measureThread; //! the performance measurement thread
#endif #endif
#endif #endif
SynchronizedCounter m_inOutCounter;
//! Atomic counter for Workload IDs. //! Atomic counter for Workload IDs.
SynchronizedCounter m_counter; SynchronizedCounter m_counter;
//! Map of running jobs (referenced by Workload ID //! Map of running jobs (referenced by Workload ID
@ -139,9 +140,6 @@ class CommThread {
private: private:
int m_sock; //! Socket descriptor of the connection int m_sock; //! Socket descriptor of the connection
JobServer& m_js; //! Calling jobserver JobServer& m_js; //! Calling jobserver
#ifndef __puma
static boost::mutex m_CommMutex; //! to synchronise the communication
#endif // __puma
// FIXME: Concerns are not really separated yet ;) // FIXME: Concerns are not really separated yet ;)
/** /**
@ -160,6 +158,9 @@ private:
*/ */
void receiveExperimentResults(Minion& minion, uint32_t workloadID); void receiveExperimentResults(Minion& minion, uint32_t workloadID);
public: public:
#ifndef __puma
static boost::mutex m_CommMutex; //! to synchronise the communication
#endif // __puma
CommThread(int sockfd, JobServer& p) CommThread(int sockfd, JobServer& p)
: m_sock(sockfd), m_js(p) { } : m_sock(sockfd), m_js(p) { }
/** /**