diff options
Diffstat (limited to 'test/src/test-extensions.cpp')
-rw-r--r-- | test/src/test-extensions.cpp | 99 |
1 files changed, 16 insertions, 83 deletions
diff --git a/test/src/test-extensions.cpp b/test/src/test-extensions.cpp index e3dfbb6..7686f9f 100644 --- a/test/src/test-extensions.cpp +++ b/test/src/test-extensions.cpp @@ -3,6 +3,7 @@ #include "uscxml/interpreter/InterpreterImpl.h" #include "uscxml/interpreter/BasicEventQueue.h" #include "uscxml/interpreter/BasicDelayedEventQueue.h" +#include "uscxml/PausableDelayedEventQueue.h" #include <event2/util.h> // for evutil_socket_t @@ -10,6 +11,21 @@ #include <mutex> using namespace uscxml; +class MyPausableDelayedEventQueue; + +std::shared_ptr<MyPausableDelayedEventQueue> nestedDelayQueue; + +class MyPausableDelayedEventQueue : public PausableDelayedEventQueue { + MyPausableDelayedEventQueue(DelayedEventQueueCallbacks* callbacks) : PausableDelayedEventQueue(callbacks) { + } + + std::shared_ptr<DelayedEventQueueImpl> create(DelayedEventQueueCallbacks* callbacks) { + // remember as nestedDelayQueue in global scope + nestedDelayQueue = std::shared_ptr<MyPausableDelayedEventQueue>(new MyPausableDelayedEventQueue(callbacks)); + return nestedDelayQueue; + } +}; + // from issue 96: // https://github.com/tklab-tud/uscxml/issues/96 @@ -45,89 +61,6 @@ static const char *customDelayedEQ = " <final id=\"FinalShape1\"/>" "</scxml>"; -class PausableDelayedEventQueue; -std::shared_ptr<PausableDelayedEventQueue> nestedDelayQueue; - -/** - * A DelayedEventQueue that implements pause/resume - */ -class PausableDelayedEventQueue : public BasicDelayedEventQueue { -public: - PausableDelayedEventQueue(DelayedEventQueueCallbacks* callbacks) : BasicDelayedEventQueue(callbacks) { - _pausedAt.tv_sec = 0; - _pausedAt.tv_usec = 0; - } - - std::shared_ptr<DelayedEventQueueImpl> create(DelayedEventQueueCallbacks* callbacks) { - // remember as nestedDelayQueue in global scope - nestedDelayQueue = std::shared_ptr<PausableDelayedEventQueue>(new PausableDelayedEventQueue(callbacks)); - return nestedDelayQueue; - } - - void pause() { - if(_pausedAt.tv_sec != 0 || _pausedAt.tv_usec != 0) { - return; // we are already paused! - } - - evutil_gettimeofday(&_pausedAt, NULL); // remember when we paused - - { - // Verbatim copy of stop() without cancelAllDelayed() - if (_isStarted) { - _isStarted = false; - event_base_loopbreak(_eventLoop); - } - if (_thread) { - _thread->join(); - delete _thread; - _thread = NULL; - } - } - - std::lock_guard<std::recursive_mutex> lock(_mutex); - - // remove all events from libevent without deleting them - for(auto callbackData : _callbackData) { - Event data = callbackData.second.userData; - event_del(callbackData.second.event); - } - } - - void resume() { - if (_pausedAt.tv_sec != 0 || _pausedAt.tv_usec != 0) { - struct timeval now; - struct timeval pausedFor; - - evutil_gettimeofday(&now, NULL); - evutil_timersub(&now, &_pausedAt, &pausedFor); - _pausedAt.tv_sec = 0; - _pausedAt.tv_usec = 0; - - for(auto& callbackData : _callbackData) { - // add the time we were paused to all due times - evutil_timeradd(&callbackData.second.due, &pausedFor, &callbackData.second.due); - - struct timeval remain; - evutil_timersub(&callbackData.second.due, &now, &remain); - -#if 0 - std::cout << "Now : " << now.tv_sec << "." << now.tv_usec << std::endl; - std::cout << "Paused : " << pausedFor.tv_sec << "." << pausedFor.tv_usec << std::endl; - std::cout << "Remaining: " << remain.tv_sec << "." << remain.tv_usec << std::endl; -#endif - assert(remain.tv_usec >= 0 && remain.tv_sec >= 0); - - // reenqueue with libevent - event_add(callbackData.second.event, &remain); - } - } - start(); - } - -protected: - timeval _pausedAt; -}; - bool testPausableEventQueue() { Interpreter interpreter = Interpreter::fromXML(customDelayedEQ, ""); |