diff options
Diffstat (limited to 'src/uscxml/interpreter')
-rw-r--r-- | src/uscxml/interpreter/BasicContentExecutor.cpp | 8 | ||||
-rw-r--r-- | src/uscxml/interpreter/BasicEventQueue.cpp | 11 | ||||
-rw-r--r-- | src/uscxml/interpreter/BasicEventQueue.h | 4 | ||||
-rw-r--r-- | src/uscxml/interpreter/EventQueue.cpp | 3 | ||||
-rw-r--r-- | src/uscxml/interpreter/EventQueue.h | 1 | ||||
-rw-r--r-- | src/uscxml/interpreter/EventQueueImpl.h | 1 | ||||
-rw-r--r-- | src/uscxml/interpreter/FastMicroStep.cpp | 4 | ||||
-rw-r--r-- | src/uscxml/interpreter/InterpreterImpl.h | 7 |
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(); } |