summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--maximus/common/interfaces/Maximus.h12
-rw-r--r--maximus/common/types/networkclock_types.h2
-rw-r--r--maximus/coreengine/inc/CoreEngine.h2
-rw-r--r--maximus/coreengine/src/CoreEngine.cpp8
-rw-r--r--maximus/coreengine/src/Maximus.cpp68
-rw-r--r--maximus/coreengine/src/MaximusTest.cpp4
-rw-r--r--maximus/networkclock/inc/NetworkClockProcessor.h3
-rw-r--r--maximus/networkclock/src/NetworkClockEvtList.cpp22
-rw-r--r--maximus/networkclock/src/NetworkClockEvtListTest.cpp27
-rw-r--r--maximus/networkclock/src/NetworkClockProcessor.cpp30
-rw-r--r--maximus/utils/src/Logger.cpp2
11 files changed, 130 insertions, 50 deletions
diff --git a/maximus/common/interfaces/Maximus.h b/maximus/common/interfaces/Maximus.h
index c0516f0932..77459ab7cd 100644
--- a/maximus/common/interfaces/Maximus.h
+++ b/maximus/common/interfaces/Maximus.h
@@ -130,6 +130,7 @@ private:
CoreEngine * mpCoreEngine;
std::ofstream mMaximusLogFile;
Network_Clock_Tick mMaxTickValue;
+ Network_Clock_Tick mWaitTickValue;
// private methods
//
@@ -175,6 +176,17 @@ private:
*/
bool setMaxTickValue ( const Network_Clock_Tick max_tick_value );
+/**
+ * @return Network_Clock_Tick
+ */
+ Network_Clock_Tick getWaitTickValue ( ) const;
+
+ /**
+ * @return bool
+ * @param wait_tick_value
+ */
+ bool setWaitTickValue ( const Network_Clock_Tick wait_tick_value );
+
public:
// public methods
diff --git a/maximus/common/types/networkclock_types.h b/maximus/common/types/networkclock_types.h
index f28300caf9..4529bb0e41 100644
--- a/maximus/common/types/networkclock_types.h
+++ b/maximus/common/types/networkclock_types.h
@@ -67,6 +67,6 @@ typedef uint16_t Network_Clock_Id;
// Network_Clock_Header.tick_high
// Network_Clock_Header.tick_low
//
-typedef double Network_Clock_Tick;
+typedef unsigned long long Network_Clock_Tick;
#endif // NETWORKCLOCK_TYPES_H
diff --git a/maximus/coreengine/inc/CoreEngine.h b/maximus/coreengine/inc/CoreEngine.h
index 884c00a675..a914c21d26 100644
--- a/maximus/coreengine/inc/CoreEngine.h
+++ b/maximus/coreengine/inc/CoreEngine.h
@@ -94,7 +94,7 @@ public:
const std::string station_log,
const std::string debugger );
- bool process ( );
+ bool process ( const Network_Clock_Tick max_tick_value = 0 );
// public attribute accessor methods
//
diff --git a/maximus/coreengine/src/CoreEngine.cpp b/maximus/coreengine/src/CoreEngine.cpp
index dc5ff4e703..e725e51e33 100644
--- a/maximus/coreengine/src/CoreEngine.cpp
+++ b/maximus/coreengine/src/CoreEngine.cpp
@@ -149,15 +149,17 @@ bool CoreEngine::init ( const std::string station_executable,
}
-bool CoreEngine::process ( )
+bool CoreEngine::process ( const Network_Clock_Tick max_tick_value )
{
logFunction();
bool bProcess = false;
try
{
- bProcess = getNetworkClockProcessor()->processNextEvt();
- bProcess &= getSciServer()->process();
+ if(getNetworkClockProcessor()->processNextEvt(max_tick_value))
+ {
+ bProcess = getSciServer()->process();
+ }
}
catch ( Error &e )
{
diff --git a/maximus/coreengine/src/Maximus.cpp b/maximus/coreengine/src/Maximus.cpp
index 579b20070f..044b2cc882 100644
--- a/maximus/coreengine/src/Maximus.cpp
+++ b/maximus/coreengine/src/Maximus.cpp
@@ -47,6 +47,7 @@ The original location of this file is /home/buret/eclipse/maximus/coreengine/src
#include <fstream> // for 'ofstream'
#include <getopt.h> // for 'getopt_long()'
#include <signal.h> // for 'signal()' and 'SIGINT'
+#include <algorithm> // for 'min()'
using namespace std;
// For unitary tests
@@ -67,7 +68,8 @@ Maximus * pMaximus;
Maximus::Maximus ( ):
mpCoreEngine(NULL),
mMaximusLogFile(0),
-mMaxTickValue(0)
+mMaxTickValue(0),
+mWaitTickValue(0)
{
logFunction();
@@ -162,7 +164,7 @@ void Maximus::init ( int argc, char * argv[] )
while (EOF != optionChar)
{
- optionChar = getopt_long(argc, argv, "e:s:m:l:t:d", longOptions, &optionIndex);
+ optionChar = getopt_long(argc, argv, "e:s:m:l:t:d:", longOptions, &optionIndex);
switch (optionChar)
{
@@ -244,17 +246,22 @@ void Maximus::process ( )
try
{
+ Network_Clock_Tick tickValue = 0; // tick value until which to process
+
if (0 == getMaxTickValue())
{
- getCoreEngine()->process();
+ tickValue = getWaitTickValue();
}
- else
+ else if (0 != getWaitTickValue())
{
- if (getNetworkClockProcessor()->getCurrentTickValue() < getMaxTickValue())
- {
- getCoreEngine()->process();
- }
- else
+ tickValue = min(getMaxTickValue(), getWaitTickValue());
+ }
+
+ getCoreEngine()->process(tickValue);
+
+ if (0 != getMaxTickValue())
+ {
+ if (getMaxTickValue() <= getNetworkClockProcessor()->getCurrentTickValue())
{
stop();
}
@@ -265,7 +272,6 @@ void Maximus::process ( )
e.display();
stop();
}
-
}
@@ -332,10 +338,12 @@ void Maximus::wait ( const tick_t value )
try
{
- while(getNetworkClockProcessor()->getCurrentTickValue() > value)
+ setWaitTickValue(getNetworkClockProcessor()->getCurrentTickValue() + value);
+ while (getWaitTickValue() > getNetworkClockProcessor()->getCurrentTickValue())
{
process();
}
+ setWaitTickValue(0);
}
catch ( Error &e )
{
@@ -493,6 +501,32 @@ SciServer * Maximus::getSciServer ( )
}
+Network_Clock_Tick Maximus::getMaxTickValue ( ) const
+{
+ return mMaxTickValue;
+}
+
+
+bool Maximus::setMaxTickValue ( const Network_Clock_Tick max_tick_value )
+{
+ mMaxTickValue = max_tick_value;
+ return true;
+}
+
+
+Network_Clock_Tick Maximus::getWaitTickValue ( ) const
+{
+ return mWaitTickValue;
+}
+
+
+bool Maximus::setWaitTickValue ( const Network_Clock_Tick wait_tick_value )
+{
+ mWaitTickValue = wait_tick_value;
+ return true;
+}
+
+
// public methods
//
@@ -541,15 +575,3 @@ void Maximus::stop ( )
}
}
-Network_Clock_Tick Maximus::getMaxTickValue ( ) const
-{
- return mMaxTickValue;
-}
-
-
-bool Maximus::setMaxTickValue ( const Network_Clock_Tick max_tick_value )
-{
- mMaxTickValue = max_tick_value;
- return true;
-}
-
diff --git a/maximus/coreengine/src/MaximusTest.cpp b/maximus/coreengine/src/MaximusTest.cpp
index dddc64a8c7..cb64809bb2 100644
--- a/maximus/coreengine/src/MaximusTest.cpp
+++ b/maximus/coreengine/src/MaximusTest.cpp
@@ -110,7 +110,9 @@ void MaximusTest::wait_test (void)
if (NULL != mpMaximus)
{
- mpMaximus->wait(0);
+ Sta sta = mpMaximus->create_sta();
+ mpMaximus->wait(10);
+ mpMaximus->process();
mpMaximus->wait();
}
else
diff --git a/maximus/networkclock/inc/NetworkClockProcessor.h b/maximus/networkclock/inc/NetworkClockProcessor.h
index da16895205..df066c9804 100644
--- a/maximus/networkclock/inc/NetworkClockProcessor.h
+++ b/maximus/networkclock/inc/NetworkClockProcessor.h
@@ -32,6 +32,7 @@ The original location of this file is /home/buret/eclipse/maximus/networkclock/i
#define NETWORKCLOCKPROCESSOR_H
#include "INetworkClock.h"
+
#include "networkclock_types.h"
class NetworkClockEvtList;
@@ -121,7 +122,7 @@ public:
/**
* @return bool
*/
- bool processNextEvt ( );
+ bool processNextEvt ( const Network_Clock_Tick max_tick_value = 0 );
/**
* @return bool
diff --git a/maximus/networkclock/src/NetworkClockEvtList.cpp b/maximus/networkclock/src/NetworkClockEvtList.cpp
index 79eea70a9d..6fc369d6ef 100644
--- a/maximus/networkclock/src/NetworkClockEvtList.cpp
+++ b/maximus/networkclock/src/NetworkClockEvtList.cpp
@@ -94,7 +94,6 @@ bool NetworkClockEvtList::insertElement ( const Network_Clock_Tick tick_value, c
// 2. Insert the event at the required tick
//
mListOfEvts.insert(EvtsList::value_type(tick_value, evt_to_insert)); // return EvtsList::iterator
-
displayListOfEvts (tick_value);
bInsert = true;
@@ -157,24 +156,31 @@ bool NetworkClockEvtList::addElement ( const NetworkClockEvt & evt_to_add )
bool NetworkClockEvtList::getNextElement ( Network_Clock_Tick & tick_value, NetworkClockEvt & next_evt_to_process )
{
logFunction();
- static Network_Clock_Tick currentTickValue = -1;
+ static Network_Clock_Tick currentTickValue = -1LL;
static EvtsList::const_iterator evtIterator;
static pair<EvtsList::const_iterator, EvtsList::const_iterator> evtsToProcess;
-
bool bGet = false;
if (!mListOfEvts.empty())
{
- if (-1 == currentTickValue)
+ if ((Network_Clock_Tick)-1LL == currentTickValue)
{
- /* Finds the first element whose key greater than k. */
- evtIterator = mListOfEvts.upper_bound (tick_value);
+ if (0 != mListOfEvts.count(tick_value))
+ {
+ /* Finds an element whose key is tick_value. */
+ evtIterator = mListOfEvts.find (tick_value);
+ }
+ else
+ {
+ /* Finds the first element whose key strictly greater than tick_value. */
+ evtIterator = mListOfEvts.upper_bound (tick_value);
+ }
// update local current tick value
currentTickValue = evtIterator->first;
}
- /* Finds a range containing all elements whose key is k. */
+ /* Finds a range containing all elements whose key is currentTickValue. */
evtsToProcess = mListOfEvts.equal_range(currentTickValue);
if (evtIterator != evtsToProcess.second)
@@ -194,7 +200,7 @@ bool NetworkClockEvtList::getNextElement ( Network_Clock_Tick & tick_value, Netw
mListOfEvts.erase(currentTickValue);
// reset local current tick value
- currentTickValue = -1;
+ currentTickValue = -1LL;
}
}
diff --git a/maximus/networkclock/src/NetworkClockEvtListTest.cpp b/maximus/networkclock/src/NetworkClockEvtListTest.cpp
index 950b013000..2f7561506d 100644
--- a/maximus/networkclock/src/NetworkClockEvtListTest.cpp
+++ b/maximus/networkclock/src/NetworkClockEvtListTest.cpp
@@ -167,6 +167,31 @@ void NetworkClockEvtListTest::getNextElementTest (void)
NetworkClockEvt evt (0, NETWORK_CLOCK_TYPE_STATION, 0);
CPPUNIT_ASSERT_MESSAGE ( "getNextElement failed",
- mpNetworkClockEvtList->getNextElement (tickValue, evt) );
+ (mpNetworkClockEvtList->getNextElement (tickValue, evt))
+ && (evt1 == evt) );
+
+ CPPUNIT_ASSERT_MESSAGE ( "getNextElement failed",
+ !mpNetworkClockEvtList->getNextElement (tickValue, evt) );
+
+ CPPUNIT_ASSERT_MESSAGE ( "getNextElement failed",
+ (mpNetworkClockEvtList->getNextElement (tickValue, evt))
+ && (evt4 == evt) );
+
+ CPPUNIT_ASSERT_MESSAGE ( "getNextElement failed",
+ !mpNetworkClockEvtList->getNextElement (tickValue, evt) );
+
+ CPPUNIT_ASSERT_MESSAGE ( "getNextElement failed",
+ (mpNetworkClockEvtList->getNextElement (tickValue, evt))
+ && (evt2 == evt) );
+
+ CPPUNIT_ASSERT_MESSAGE ( "getNextElement failed",
+ !mpNetworkClockEvtList->getNextElement (tickValue, evt) );
+
+ CPPUNIT_ASSERT_MESSAGE ( "getNextElement failed",
+ (mpNetworkClockEvtList->getNextElement (tickValue, evt))
+ && (evt3 == evt) );
+
+ CPPUNIT_ASSERT_MESSAGE ( "getNextElement failed",
+ !mpNetworkClockEvtList->getNextElement (tickValue, evt) );
}
diff --git a/maximus/networkclock/src/NetworkClockProcessor.cpp b/maximus/networkclock/src/NetworkClockProcessor.cpp
index e08c3977d6..1b7d035008 100644
--- a/maximus/networkclock/src/NetworkClockProcessor.cpp
+++ b/maximus/networkclock/src/NetworkClockProcessor.cpp
@@ -65,7 +65,7 @@ memberFunction arrayProcess[NETWORK_CLOCK_TYPE_NB] = { &NetworkClockProcessor::
NetworkClockProcessor::NetworkClockProcessor ( ):
-mCurrentTickValue(-1),
+mCurrentTickValue(0),
mpNetworkClockEvtList(NULL),
mpSciServer(NULL),
mpSystemManager(NULL),
@@ -82,7 +82,7 @@ NetworkClockProcessor::NetworkClockProcessor ( SciServer * p_sci_server,
SystemManager * p_system_manager,
FunctionCallManager * p_function_call_manager,
PhyProcessor * p_phy_processor ):
-mCurrentTickValue(-1),
+mCurrentTickValue(0),
mpNetworkClockEvtList(NULL)
{
logFunction();
@@ -215,14 +215,14 @@ bool NetworkClockProcessor::removeEvt ( const Network_Clock_Tick tick_value, con
}
-bool NetworkClockProcessor::processNextEvt ( )
+bool NetworkClockProcessor::processNextEvt ( const Network_Clock_Tick max_tick_value )
{
- bool bProcess = false;
+ logFunction();
+ bool bProcess = true;
/* If all stations are IDLE,
- * get and process events at the current tick in the NetworkClockEvtList,
- * else return false.
- * If there is no more event to process at the current tick, return false. */
+ * get and process events at the current tick in the NetworkClockEvtList.
+ * If max tick value is reached, return false. */
if ( (NULL != mpNetworkClockEvtList) && (NULL != mpSystemManager) )
{
@@ -239,9 +239,19 @@ bool NetworkClockProcessor::processNextEvt ( )
//
if (bGetNext)
{
- bProcess = setCurrentTickValue(currentTickValue);
- clog << logger(LOG_INFO) << "processing event at tick " << dec << getCurrentTickValue() << "..." << endl;
- bProcess &= callMemberFunction (*this, arrayProcess[evtToProcess.getNetworkClockType()]) (evtToProcess);
+ if ( (0 == max_tick_value) || (max_tick_value > currentTickValue) )
+ {
+ bProcess = setCurrentTickValue(currentTickValue);
+ clog << logger(LOG_INFO) << "processing event at tick " << dec << getCurrentTickValue() << "..." << endl;
+ bProcess &= callMemberFunction (*this, arrayProcess[evtToProcess.getNetworkClockType()]) (evtToProcess);
+ }
+ else
+ {
+ setCurrentTickValue(max_tick_value);
+ clog << logger(LOG_INFO) << "tick " << dec << getCurrentTickValue() << " is reached" << endl;
+ bGetNext = false;
+ bProcess = false;
+ }
}
}
}
diff --git a/maximus/utils/src/Logger.cpp b/maximus/utils/src/Logger.cpp
index 751cbce6ed..e445673a05 100644
--- a/maximus/utils/src/Logger.cpp
+++ b/maximus/utils/src/Logger.cpp
@@ -58,7 +58,7 @@ ostream & operator<< ( ostream & os, const Logger & logger )
if (logger.getMsgLevel() >= logger.getLogLevel())
{
- os << "Maximus(" << logger.getCurrentTickValue() << "): ";
+ os << "Maximus(" << dec << logger.getCurrentTickValue() << "): ";
if (LOG_WARNING ==logger.getMsgLevel())
{
os << "WARNING ";