summaryrefslogtreecommitdiffstats
path: root/test/src/test-extensions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/src/test-extensions.cpp')
-rw-r--r--test/src/test-extensions.cpp99
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, "");