summaryrefslogtreecommitdiffstats
path: root/src/uscxml/interpreter
diff options
context:
space:
mode:
Diffstat (limited to 'src/uscxml/interpreter')
-rw-r--r--src/uscxml/interpreter/BasicContentExecutor.cpp8
-rw-r--r--src/uscxml/interpreter/BasicEventQueue.cpp11
-rw-r--r--src/uscxml/interpreter/BasicEventQueue.h4
-rw-r--r--src/uscxml/interpreter/EventQueue.cpp3
-rw-r--r--src/uscxml/interpreter/EventQueue.h1
-rw-r--r--src/uscxml/interpreter/EventQueueImpl.h1
-rw-r--r--src/uscxml/interpreter/FastMicroStep.cpp4
-rw-r--r--src/uscxml/interpreter/InterpreterImpl.h7
8 files changed, 31 insertions, 8 deletions
diff --git a/src/uscxml/interpreter/BasicContentExecutor.cpp b/src/uscxml/interpreter/BasicContentExecutor.cpp
index 366c4bd..58d3eae 100644
--- a/src/uscxml/interpreter/BasicContentExecutor.cpp
+++ b/src/uscxml/interpreter/BasicContentExecutor.cpp
@@ -404,7 +404,7 @@ void BasicContentExecutor::invoke(XERCESC_NS::DOMElement* element) {
}
}
- // we need the invokeid to uninvoke - TODO: This is leaking!
+ // we need the invokeid to uninvoke
char* invokeId = (char*)malloc(invokeEvent.invokeid.size() + 1);
memcpy(invokeId, invokeEvent.invokeid.c_str(), invokeEvent.invokeid.size());
invokeId[invokeEvent.invokeid.size()] = 0;
@@ -469,7 +469,6 @@ void BasicContentExecutor::invoke(XERCESC_NS::DOMElement* element) {
}
void BasicContentExecutor::uninvoke(XERCESC_NS::DOMElement* invoke) {
- // TODO: DANGER This is the real danger here
char* invokeId = (char*)invoke->getUserData(X("invokeid"));
assert(invokeId != NULL);
@@ -557,13 +556,16 @@ void BasicContentExecutor::processParams(std::multimap<std::string, Data>& param
Data BasicContentExecutor::elementAsData(XERCESC_NS::DOMElement* element) {
if (HAS_ATTR(element, "expr")) {
// return _callbacks->evalAsData(ATTR(element, "expr"));
- if (LOCALNAME(element) == "content") {
+#if 0
+ if (LOCALNAME(element) == "content") {
// test 528
return _callbacks->evalAsData(ATTR(element, "expr"));
} else {
// test 326
return Data(ATTR(element, "expr"), Data::INTERPRETED);
}
+#endif
+ return _callbacks->evalAsData(ATTR(element, "expr"));
}
if (HAS_ATTR(element, "src")) {
diff --git a/src/uscxml/interpreter/BasicEventQueue.cpp b/src/uscxml/interpreter/BasicEventQueue.cpp
index d484ada..7505f46 100644
--- a/src/uscxml/interpreter/BasicEventQueue.cpp
+++ b/src/uscxml/interpreter/BasicEventQueue.cpp
@@ -74,6 +74,11 @@ void BasicEventQueue::enqueue(const Event& event) {
_cond.notify_all();
}
+void BasicEventQueue::reset() {
+ std::lock_guard<std::recursive_mutex> lock(_mutex);
+ _queue.clear();
+}
+
static void dummyCallback(evutil_socket_t fd, short what, void *arg) {
timeval tv;
tv.tv_sec = 365 * 24 * 3600;
@@ -206,4 +211,10 @@ void BasicDelayedEventQueue::stop() {
}
}
+void BasicDelayedEventQueue::reset() {
+ std::lock_guard<std::recursive_mutex> lock(_mutex);
+ cancelAllDelayed();
+ _queue.clear();
+}
+
} \ No newline at end of file
diff --git a/src/uscxml/interpreter/BasicEventQueue.h b/src/uscxml/interpreter/BasicEventQueue.h
index a6374d8..1542e30 100644
--- a/src/uscxml/interpreter/BasicEventQueue.h
+++ b/src/uscxml/interpreter/BasicEventQueue.h
@@ -43,7 +43,8 @@ public:
virtual ~BasicEventQueue();
virtual Event dequeue(size_t blockMs);
virtual void enqueue(const Event& event);
-
+ virtual void reset();
+
protected:
std::list<Event> _queue;
std::recursive_mutex _mutex;
@@ -67,6 +68,7 @@ public:
virtual void enqueue(const Event& event) {
return BasicEventQueue::enqueue(event);
}
+ virtual void reset();
protected:
struct callbackData {
diff --git a/src/uscxml/interpreter/EventQueue.cpp b/src/uscxml/interpreter/EventQueue.cpp
index c460e02..7ff0bfb 100644
--- a/src/uscxml/interpreter/EventQueue.cpp
+++ b/src/uscxml/interpreter/EventQueue.cpp
@@ -38,6 +38,9 @@ Event EventQueue::dequeue(size_t blockMs) {
void EventQueue::enqueue(const Event& event) {
return _impl->enqueue(event);
}
+void EventQueue::reset() {
+ return _impl->reset();
+}
PIMPL_OPERATORS_INHERIT_IMPL(DelayedEventQueue, EventQueue)
diff --git a/src/uscxml/interpreter/EventQueue.h b/src/uscxml/interpreter/EventQueue.h
index 1e8b018..37b90be 100644
--- a/src/uscxml/interpreter/EventQueue.h
+++ b/src/uscxml/interpreter/EventQueue.h
@@ -38,6 +38,7 @@ public:
virtual Event dequeue(size_t blockMs);
virtual void enqueue(const Event& event);
+ virtual void reset();
protected:
std::shared_ptr<EventQueueImpl> _impl;
diff --git a/src/uscxml/interpreter/EventQueueImpl.h b/src/uscxml/interpreter/EventQueueImpl.h
index 1ccd3f1..befd684 100644
--- a/src/uscxml/interpreter/EventQueueImpl.h
+++ b/src/uscxml/interpreter/EventQueueImpl.h
@@ -42,6 +42,7 @@ class USCXML_API EventQueueImpl {
public:
virtual Event dequeue(size_t blockMs) = 0;
virtual void enqueue(const Event& event) = 0;
+ virtual void reset() = 0;
};
/**
diff --git a/src/uscxml/interpreter/FastMicroStep.cpp b/src/uscxml/interpreter/FastMicroStep.cpp
index 927fbbc..ea43c5d 100644
--- a/src/uscxml/interpreter/FastMicroStep.cpp
+++ b/src/uscxml/interpreter/FastMicroStep.cpp
@@ -234,8 +234,8 @@ void FastMicroStep::init(XERCESC_NS::DOMElement* scxml) {
std::list<DOMElement*> dataModels = DOMUtils::filterChildElements(_xmlPrefix.str() + "datamodel", _states[0]->element, true);
dataModels.erase(std::remove_if(dataModels.begin(),
dataModels.end(),
- [](DOMElement* elem) {
- return isInEmbeddedDocument(elem);
+ [this](DOMElement* elem) {
+ return !areFromSameMachine(elem, _scxml);
}),
dataModels.end());
diff --git a/src/uscxml/interpreter/InterpreterImpl.h b/src/uscxml/interpreter/InterpreterImpl.h
index e693bbf..be33306 100644
--- a/src/uscxml/interpreter/InterpreterImpl.h
+++ b/src/uscxml/interpreter/InterpreterImpl.h
@@ -76,11 +76,14 @@ public:
}
virtual void reset() {///< Reset state machine
- _microStepper.reset();
+ if (_microStepper)
+ _microStepper.reset();
+
_isInitialized = false;
_state = USCXML_INSTANTIATED;
// _dataModel.reset();
-// _eventQueue.reset();
+ if (_delayQueue)
+ _delayQueue.reset();
// _contentExecutor.reset();
}