From fc10986cdd35a7a5ce483682ca43f3c496e907c1 Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Tue, 6 Dec 2016 22:59:37 +0100 Subject: Use existing ActionLanguage to create new instances in invoked interpreters --- src/uscxml/Interpreter.h | 2 +- src/uscxml/interpreter/BasicContentExecutor.cpp | 4 ++++ src/uscxml/interpreter/BasicContentExecutor.h | 2 ++ src/uscxml/interpreter/BasicEventQueue.cpp | 10 +++++++++- src/uscxml/interpreter/BasicEventQueue.h | 7 +++++++ src/uscxml/interpreter/ContentExecutor.cpp | 4 ++++ src/uscxml/interpreter/ContentExecutor.h | 3 ++- src/uscxml/interpreter/ContentExecutorImpl.h | 2 ++ src/uscxml/interpreter/EventQueue.cpp | 10 ++++++++++ src/uscxml/interpreter/EventQueue.h | 4 +++- src/uscxml/interpreter/EventQueueImpl.h | 2 ++ src/uscxml/interpreter/FastMicroStep.cpp | 6 +++++- src/uscxml/interpreter/FastMicroStep.h | 1 + src/uscxml/interpreter/MicroStep.cpp | 5 ++++- src/uscxml/interpreter/MicroStep.h | 1 + src/uscxml/interpreter/MicroStepImpl.h | 3 ++- src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp | 18 ++++++++++++++++-- test/CMakeLists.txt | 3 +-- test/src/test-state-pass.cpp | 2 +- 19 files changed, 77 insertions(+), 12 deletions(-) diff --git a/src/uscxml/Interpreter.h b/src/uscxml/Interpreter.h index 6c60350..e9e472d 100644 --- a/src/uscxml/Interpreter.h +++ b/src/uscxml/Interpreter.h @@ -52,7 +52,7 @@ class InterpreterIssue; class USCXML_API ActionLanguage { public: MicroStep microStepper; ///< The microstepper instance to use - DataModel dataModel; ///< The datamodel to uses + DataModel dataModel; ///< The datamodel to use ContentExecutor execContent; ///< To process executable content elements EventQueue internalQueue; ///< The queue where internal events will be enqueued EventQueue externalQueue; ///< The queue for external events diff --git a/src/uscxml/interpreter/BasicContentExecutor.cpp b/src/uscxml/interpreter/BasicContentExecutor.cpp index 6b12afd..a2ebc5c 100644 --- a/src/uscxml/interpreter/BasicContentExecutor.cpp +++ b/src/uscxml/interpreter/BasicContentExecutor.cpp @@ -35,6 +35,10 @@ namespace uscxml { using namespace XERCESC_NS; +std::shared_ptr BasicContentExecutor::create(ContentExecutorCallbacks* callbacks) { + return std::shared_ptr(new BasicContentExecutor(callbacks)); +} + void BasicContentExecutor::processRaise(XERCESC_NS::DOMElement* content) { Event raised(ATTR(content, "event")); _callbacks->enqueueInternal(raised); diff --git a/src/uscxml/interpreter/BasicContentExecutor.h b/src/uscxml/interpreter/BasicContentExecutor.h index c3549f6..14f7881 100644 --- a/src/uscxml/interpreter/BasicContentExecutor.h +++ b/src/uscxml/interpreter/BasicContentExecutor.h @@ -35,6 +35,8 @@ public: BasicContentExecutor(ContentExecutorCallbacks* callbacks) : ContentExecutorImpl(callbacks) {} virtual ~BasicContentExecutor() {} + virtual std::shared_ptr create(ContentExecutorCallbacks* callbacks); + void processRaise(XERCESC_NS::DOMElement* content); void processSend(XERCESC_NS::DOMElement* element); void processCancel(XERCESC_NS::DOMElement* content); diff --git a/src/uscxml/interpreter/BasicEventQueue.cpp b/src/uscxml/interpreter/BasicEventQueue.cpp index cc5ff04..78b2321 100644 --- a/src/uscxml/interpreter/BasicEventQueue.cpp +++ b/src/uscxml/interpreter/BasicEventQueue.cpp @@ -65,6 +65,10 @@ void BasicEventQueue::reset() { _queue.clear(); } +std::shared_ptr BasicEventQueue::create() { + return std::shared_ptr(new BasicEventQueue()); +} + static void dummyCallback(evutil_socket_t fd, short what, void *arg) { timeval tv; tv.tv_sec = 365 * 24 * 3600; @@ -102,6 +106,10 @@ BasicDelayedEventQueue::~BasicDelayedEventQueue() { event_base_free(_eventLoop); } +std::shared_ptr BasicDelayedEventQueue::create(DelayedEventQueueCallbacks* callbacks) { + return std::shared_ptr(new BasicDelayedEventQueue(_callbacks)); +} + void BasicDelayedEventQueue::timerCallback(evutil_socket_t fd, short what, void *arg) { struct callbackData *data = (struct callbackData*)arg; std::lock_guard lock(data->eventQueue->_mutex); @@ -203,4 +211,4 @@ void BasicDelayedEventQueue::reset() { _queue.clear(); } -} \ No newline at end of file +} diff --git a/src/uscxml/interpreter/BasicEventQueue.h b/src/uscxml/interpreter/BasicEventQueue.h index 2bc739e..5911336 100644 --- a/src/uscxml/interpreter/BasicEventQueue.h +++ b/src/uscxml/interpreter/BasicEventQueue.h @@ -41,6 +41,7 @@ class USCXML_API BasicEventQueue : public EventQueueImpl { public: BasicEventQueue(); virtual ~BasicEventQueue(); + virtual std::shared_ptr create(); virtual Event dequeue(size_t blockMs); virtual void enqueue(const Event& event); virtual void reset(); @@ -59,6 +60,7 @@ class USCXML_API BasicDelayedEventQueue : public BasicEventQueue, public Delayed public: BasicDelayedEventQueue(DelayedEventQueueCallbacks* callbacks); virtual ~BasicDelayedEventQueue(); + virtual std::shared_ptr create(DelayedEventQueueCallbacks* callbacks); virtual void enqueueDelayed(const Event& event, size_t delayMs, const std::string& eventUUID); virtual void cancelDelayed(const std::string& eventId); virtual void cancelAllDelayed(); @@ -71,6 +73,11 @@ public: virtual void reset(); protected: + virtual std::shared_ptr create() { + ErrorEvent e("Cannot create a DelayedEventQueue without callbacks"); + throw e; + } + struct callbackData { Event userData; std::string eventUUID; diff --git a/src/uscxml/interpreter/ContentExecutor.cpp b/src/uscxml/interpreter/ContentExecutor.cpp index e26d66a..aa623b6 100644 --- a/src/uscxml/interpreter/ContentExecutor.cpp +++ b/src/uscxml/interpreter/ContentExecutor.cpp @@ -43,4 +43,8 @@ void ContentExecutor::raiseDoneEvent(XERCESC_NS::DOMElement* state, XERCESC_NS:: return _impl->raiseDoneEvent(state, doneData); } +std::shared_ptr ContentExecutor::getImpl() const { + return _impl; +} + } diff --git a/src/uscxml/interpreter/ContentExecutor.h b/src/uscxml/interpreter/ContentExecutor.h index be0de78..e17d8dc 100644 --- a/src/uscxml/interpreter/ContentExecutor.h +++ b/src/uscxml/interpreter/ContentExecutor.h @@ -49,7 +49,8 @@ public: virtual void uninvoke(XERCESC_NS::DOMElement* invoke); virtual Data elementAsData(XERCESC_NS::DOMElement* element); virtual void raiseDoneEvent(XERCESC_NS::DOMElement* state, XERCESC_NS::DOMElement* doneData); - + virtual std::shared_ptr getImpl() const; + protected: std::shared_ptr _impl; }; diff --git a/src/uscxml/interpreter/ContentExecutorImpl.h b/src/uscxml/interpreter/ContentExecutorImpl.h index ca565f0..2cf8566 100644 --- a/src/uscxml/interpreter/ContentExecutorImpl.h +++ b/src/uscxml/interpreter/ContentExecutorImpl.h @@ -78,6 +78,8 @@ class USCXML_API ContentExecutorImpl { public: ContentExecutorImpl(ContentExecutorCallbacks* callbacks) : _callbacks(callbacks) {} + virtual std::shared_ptr create(ContentExecutorCallbacks* callbacks) = 0; + virtual void process(XERCESC_NS::DOMElement* block, const X& xmlPrefix) = 0; virtual void invoke(XERCESC_NS::DOMElement* invoke) = 0; diff --git a/src/uscxml/interpreter/EventQueue.cpp b/src/uscxml/interpreter/EventQueue.cpp index dd83f38..ab199b4 100644 --- a/src/uscxml/interpreter/EventQueue.cpp +++ b/src/uscxml/interpreter/EventQueue.cpp @@ -42,6 +42,12 @@ void EventQueue::reset() { return _impl->reset(); } +std::shared_ptr EventQueue::getImplBase() { + return _impl; +} + + + PIMPL_OPERATORS_INHERIT_IMPL(DelayedEventQueue, EventQueue) void DelayedEventQueue::enqueueDelayed(const Event& event, size_t delayMs, const std::string& eventUUID) { @@ -55,5 +61,9 @@ void DelayedEventQueue::cancelAllDelayed() { return _impl->cancelAllDelayed(); } +std::shared_ptr DelayedEventQueue::getImplDelayed() { + return _impl; +} + } diff --git a/src/uscxml/interpreter/EventQueue.h b/src/uscxml/interpreter/EventQueue.h index 79d0c26..7356b23 100644 --- a/src/uscxml/interpreter/EventQueue.h +++ b/src/uscxml/interpreter/EventQueue.h @@ -39,6 +39,7 @@ public: virtual Event dequeue(size_t blockMs); virtual void enqueue(const Event& event); virtual void reset(); + virtual std::shared_ptr getImplBase(); protected: std::shared_ptr _impl; @@ -56,7 +57,8 @@ public: void enqueueDelayed(const Event& event, size_t delayMs, const std::string& eventUUID); void cancelDelayed(const std::string& eventUUID); void cancelAllDelayed(); - + virtual std::shared_ptr getImplDelayed(); + protected: std::shared_ptr _impl; }; diff --git a/src/uscxml/interpreter/EventQueueImpl.h b/src/uscxml/interpreter/EventQueueImpl.h index 1f99226..4420c24 100644 --- a/src/uscxml/interpreter/EventQueueImpl.h +++ b/src/uscxml/interpreter/EventQueueImpl.h @@ -40,6 +40,7 @@ namespace uscxml { */ class USCXML_API EventQueueImpl { public: + virtual std::shared_ptr create() = 0; virtual Event dequeue(size_t blockMs) = 0; virtual void enqueue(const Event& event) = 0; virtual void reset() = 0; @@ -60,6 +61,7 @@ public: */ class USCXML_API DelayedEventQueueImpl : public EventQueueImpl { public: + virtual std::shared_ptr create(DelayedEventQueueCallbacks*) = 0; virtual void enqueueDelayed(const Event& event, size_t delayMs, const std::string& eventUUID) = 0; virtual void cancelDelayed(const std::string& eventId) = 0; virtual void cancelAllDelayed() = 0; diff --git a/src/uscxml/interpreter/FastMicroStep.cpp b/src/uscxml/interpreter/FastMicroStep.cpp index b0fda1f..90b93ee 100644 --- a/src/uscxml/interpreter/FastMicroStep.cpp +++ b/src/uscxml/interpreter/FastMicroStep.cpp @@ -89,6 +89,10 @@ FastMicroStep::~FastMicroStep() { } } +std::shared_ptr FastMicroStep::create(MicroStepCallbacks* callbacks) { + return std::shared_ptr(new FastMicroStep(callbacks)); +} + void FastMicroStep::resortStates(DOMElement* element, const X& xmlPrefix) { /** @@ -1189,4 +1193,4 @@ bool FastMicroStep::hasLegalConfiguration() { } #endif -} \ No newline at end of file +} diff --git a/src/uscxml/interpreter/FastMicroStep.h b/src/uscxml/interpreter/FastMicroStep.h index 1fbc8f4..faf5f45 100644 --- a/src/uscxml/interpreter/FastMicroStep.h +++ b/src/uscxml/interpreter/FastMicroStep.h @@ -43,6 +43,7 @@ class FastMicroStep : public MicroStepImpl { public: FastMicroStep(MicroStepCallbacks* callbacks); virtual ~FastMicroStep(); + virtual std::shared_ptr create(MicroStepCallbacks* callbacks); virtual InterpreterState step(size_t blockMs); virtual void reset(); diff --git a/src/uscxml/interpreter/MicroStep.cpp b/src/uscxml/interpreter/MicroStep.cpp index 2876be5..35e5d94 100644 --- a/src/uscxml/interpreter/MicroStep.cpp +++ b/src/uscxml/interpreter/MicroStep.cpp @@ -44,4 +44,7 @@ void MicroStep::markAsCancelled() { _impl->markAsCancelled(); } -} \ No newline at end of file +std::shared_ptr MicroStep::getImpl() const { + return _impl; +} +} diff --git a/src/uscxml/interpreter/MicroStep.h b/src/uscxml/interpreter/MicroStep.h index a8ea4f0..341be2e 100644 --- a/src/uscxml/interpreter/MicroStep.h +++ b/src/uscxml/interpreter/MicroStep.h @@ -57,6 +57,7 @@ public: virtual void init(XERCESC_NS::DOMElement* scxml); virtual void markAsCancelled(); + std::shared_ptr getImpl() const; protected: std::shared_ptr _impl; }; diff --git a/src/uscxml/interpreter/MicroStepImpl.h b/src/uscxml/interpreter/MicroStepImpl.h index 7d7c9b0..d831fdd 100644 --- a/src/uscxml/interpreter/MicroStepImpl.h +++ b/src/uscxml/interpreter/MicroStepImpl.h @@ -76,7 +76,8 @@ public: }; MicroStepImpl(MicroStepCallbacks* callbacks) : _callbacks(callbacks) {} - + virtual std::shared_ptr create(MicroStepCallbacks* callbacks) = 0; + virtual InterpreterState step(size_t blockMs) = 0; virtual void reset() = 0; ///< Reset state machine virtual bool isInState(const std::string& stateId) = 0; diff --git a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp index 885f70d..26fc024 100644 --- a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp +++ b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp @@ -158,6 +158,17 @@ void USCXMLInvoker::invoke(const std::string& source, const Event& invokeEvent) _invokedInterpreter.getImpl()->_invokeId = invokeEvent.invokeid; _invokedInterpreter.getImpl()->_invokeReq = invokeEvent; + // create new instances from the parent's ActionLanguage +#if 1 + InterpreterImpl* invoked = _invokedInterpreter.getImpl().get(); + invoked->_execContent = _interpreter->_execContent.getImpl()->create(invoked); + invoked->_delayQueue = _interpreter->_delayQueue.getImplDelayed()->create(invoked); + invoked->_internalQueue = _interpreter->_internalQueue.getImplBase()->create(); + invoked->_externalQueue = _interpreter->_externalQueue.getImplBase()->create(); + invoked->_microStepper = _interpreter->_microStepper.getImpl()->create(invoked); + + // TODO: setup invokers dom, check datamodel attribute and create new instance from parent if matching? +#endif // copy monitors // std::set::const_iterator monIter = _interpreter->_monitors.begin(); // while(monIter != _interpreter->_monitors.end()) { @@ -168,7 +179,10 @@ void USCXMLInvoker::invoke(const std::string& source, const Event& invokeEvent) // } - /// test240 assumes that invoke request params will carry over to the datamodel + /** + * test240 assumes that invoke request params will carry over to the datamodel + * This is solved by passing the invoke request above + */ // _invokedInterpreter.getImpl()->setInvokeRequest(req); _isActive = true; @@ -193,4 +207,4 @@ void USCXMLInvoker::ParentQueueImpl::enqueue(const Event& event) { _invoker->eventToSCXML(copy, USCXML_INVOKER_SCXML_TYPE, _invoker->_invokeId); } -} \ No newline at end of file +} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index bac3759..a73a424 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -18,8 +18,7 @@ if (GHDL_BIN) string(REGEX MATCH "^([0-9]+\\.[0-9]+)" GHDL_VERSION ${GHDL_VERSION_OUT}) if (${GHDL_VERSION} VERSION_LESS "0.32") - message(WARNING "GHDL version 0.32 required - ${GHDL_VERSION} found, not building VHDL tests") - message(WARNING "Try https://github.com/tgingold/ghdl/releases/tag/v0.33") + message(STATUS "GHDL version 0.32 required - ${GHDL_VERSION} found, not building VHDL tests") unset(GHDL_BIN) endif () endif () diff --git a/test/src/test-state-pass.cpp b/test/src/test-state-pass.cpp index afda506..163e5b9 100644 --- a/test/src/test-state-pass.cpp +++ b/test/src/test-state-pass.cpp @@ -87,4 +87,4 @@ int main(int argc, char** argv) { } return 0; -} \ No newline at end of file +} -- cgit v0.12