summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Radomski <github@mintwerk.de>2016-12-06 21:59:37 (GMT)
committerStefan Radomski <github@mintwerk.de>2016-12-06 21:59:37 (GMT)
commitfc10986cdd35a7a5ce483682ca43f3c496e907c1 (patch)
treed3d2277f4033eabf3228c624bf006bb51d447a52
parent53197953ce382a536bfef870efc4c3f1ccf0f180 (diff)
downloaduscxml-fc10986cdd35a7a5ce483682ca43f3c496e907c1.zip
uscxml-fc10986cdd35a7a5ce483682ca43f3c496e907c1.tar.gz
uscxml-fc10986cdd35a7a5ce483682ca43f3c496e907c1.tar.bz2
Use existing ActionLanguage to create new instances in invoked interpreters
-rw-r--r--src/uscxml/Interpreter.h2
-rw-r--r--src/uscxml/interpreter/BasicContentExecutor.cpp4
-rw-r--r--src/uscxml/interpreter/BasicContentExecutor.h2
-rw-r--r--src/uscxml/interpreter/BasicEventQueue.cpp10
-rw-r--r--src/uscxml/interpreter/BasicEventQueue.h7
-rw-r--r--src/uscxml/interpreter/ContentExecutor.cpp4
-rw-r--r--src/uscxml/interpreter/ContentExecutor.h3
-rw-r--r--src/uscxml/interpreter/ContentExecutorImpl.h2
-rw-r--r--src/uscxml/interpreter/EventQueue.cpp10
-rw-r--r--src/uscxml/interpreter/EventQueue.h4
-rw-r--r--src/uscxml/interpreter/EventQueueImpl.h2
-rw-r--r--src/uscxml/interpreter/FastMicroStep.cpp6
-rw-r--r--src/uscxml/interpreter/FastMicroStep.h1
-rw-r--r--src/uscxml/interpreter/MicroStep.cpp5
-rw-r--r--src/uscxml/interpreter/MicroStep.h1
-rw-r--r--src/uscxml/interpreter/MicroStepImpl.h3
-rw-r--r--src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp18
-rw-r--r--test/CMakeLists.txt3
-rw-r--r--test/src/test-state-pass.cpp2
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<ContentExecutorImpl> BasicContentExecutor::create(ContentExecutorCallbacks* callbacks) {
+ return std::shared_ptr<ContentExecutorImpl>(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<ContentExecutorImpl> 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<EventQueueImpl> BasicEventQueue::create() {
+ return std::shared_ptr<EventQueueImpl>(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<DelayedEventQueueImpl> BasicDelayedEventQueue::create(DelayedEventQueueCallbacks* callbacks) {
+ return std::shared_ptr<DelayedEventQueueImpl>(new BasicDelayedEventQueue(_callbacks));
+}
+
void BasicDelayedEventQueue::timerCallback(evutil_socket_t fd, short what, void *arg) {
struct callbackData *data = (struct callbackData*)arg;
std::lock_guard<std::recursive_mutex> 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<EventQueueImpl> 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<DelayedEventQueueImpl> 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<EventQueueImpl> 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<ContentExecutorImpl> 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<ContentExecutorImpl> getImpl() const;
+
protected:
std::shared_ptr<ContentExecutorImpl> _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<ContentExecutorImpl> 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<EventQueueImpl> 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<DelayedEventQueueImpl> 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<EventQueueImpl> getImplBase();
protected:
std::shared_ptr<EventQueueImpl> _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<DelayedEventQueueImpl> getImplDelayed();
+
protected:
std::shared_ptr<DelayedEventQueueImpl> _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<EventQueueImpl> 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<DelayedEventQueueImpl> 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<MicroStepImpl> FastMicroStep::create(MicroStepCallbacks* callbacks) {
+ return std::shared_ptr<MicroStepImpl>(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<MicroStepImpl> 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<MicroStepImpl> 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<MicroStepImpl> getImpl() const;
protected:
std::shared_ptr<MicroStepImpl> _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<MicroStepImpl> 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<InterpreterMonitor*>::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
+}