Browse Source

some more debugging

Simon Van Mierlo 8 years ago
parent
commit
e4eb5e4564

BIN
bootstrap/minimal.m.gz


+ 1 - 0
interface/HUTN/hutn_compiler/compiler.py

@@ -129,6 +129,7 @@ def do_compile(inputfile, grammarfile, visitors=[], include_paths = []):
 
     result["tree"].fix_tracability(inputfile)
 
+    print 'yentl told me to print'
     for visitor in visitors:
         visitor.visit(result["tree"])
 

+ 6 - 0
kernel/mvk_server/classes/executor.xml

@@ -52,6 +52,12 @@
                             <parameter expr="reply"/>
                         </raise>
                     </transition>
+                    <transition event="get_mvk" target=".">
+                        <parameter name="source"/>
+                        <raise event="get_mvk_reply" scope="narrow" target="source">
+                            <parameter expr="self.mvk"/>
+                        </raise>
+                    </transition>
                 </state>
             </state>
 

+ 37 - 1
kernel/mvk_server/classes/mvkcontroller.xml

@@ -45,7 +45,7 @@
                     <parameter expr="'Executor'"/>
                 </raise>
             </onentry>
-            <transition event="instance_created" target="../read_root">
+            <transition event="instance_created" target="../get_mvk">
                 <parameter name="instancename"/>
                 <raise scope="cd" event="start_instance">
                     <parameter expr="instancename"/>
@@ -53,6 +53,21 @@
             </transition>
         </state>
 
+        <state id="get_mvk">
+            <onentry>
+                <raise event="get_mvk" scope="narrow" target="'executor'">
+                    <parameter expr="'parent'"/>
+                </raise>
+            </onentry>
+
+            <transition event="get_mvk_reply" target="../read_root">
+                <parameter name="mvk"/>
+                <script>
+                    self.mvk = mvk
+                </script>
+            </transition>
+        </state>
+
         <state id="read_root">
             <onentry>
                 <raise event="raw_exec" scope="narrow" target="'executor'">
@@ -132,6 +147,26 @@
                             <parameter expr="args"/>
                         </raise>
                     </transition>
+                    
+                    <transition cond="self.input_queue[0][1] == 'pause'" target="../wait">
+                        <script>
+                            source, op, args, username = self.input_queue.pop(0)
+                        </script>
+                        <raise event="pause" scope="narrow" target="self.user_statecharts[username]">
+                            <parameter expr="source"/>
+                            <parameter expr="args"/>
+                        </raise>
+                    </transition>
+                    
+                    <transition cond="self.input_queue[0][1] == 'resume'" target="../wait">
+                        <script>
+                            source, op, args, username = self.input_queue.pop(0)
+                        </script>
+                        <raise event="resume" scope="narrow" target="self.user_statecharts[username]">
+                            <parameter expr="source"/>
+                            <parameter expr="args"/>
+                        </raise>
+                    </transition>
                 </state>
             </state>
 
@@ -180,6 +215,7 @@
                             <parameter expr="'users'"/>
                             <parameter expr="'UserStatechart'"/>
                             <parameter expr="self.add_users[0]"/>
+                            <parameter expr="self.mvk"/>
                         </raise>
                     </transition>
                     <transition cond="self.delete_users" target=".">

+ 48 - 27
kernel/mvk_server/classes/user_statechart.xml

@@ -4,9 +4,11 @@
     </relationships>
     <constructor>
         <parameter name="username"/>
+        <parameter name="mvk" />
         <body>
             <![CDATA[
             self.username = username
+            self.mvk = mvk
 
             self.output_queue = []
             self.source_execution = None
@@ -29,36 +31,55 @@
         </state>
 
         <parallel id="running">
-            <state id="execution" initial="init">
-                <state id="init">
-                    <onentry>
-                        <raise event="execute" scope="narrow" target="'parent/executor'">
-                            <parameter expr="self.returnpath"/>
-                            <parameter expr="self.username"/>
-                            <parameter expr="'execute_rule'"/>
-                            <parameter expr="[]"/>
-                            <parameter expr="self.request_id"/>
+            <state id="execution" initial="executing">
+                <state id="executing" initial="executing">
+                    <state id="executing">
+                        <onentry>
+                            <raise event="execute" scope="narrow" target="'parent/executor'">
+                                <parameter expr="self.returnpath"/>
+                                <parameter expr="self.username"/>
+                                <parameter expr="'execute_rule'"/>
+                                <parameter expr="[]"/>
+                                <parameter expr="self.request_id"/>
+                            </raise>
+                            <script>
+                                self.outstanding_execution = self.request_id
+                                self.request_id += 1
+                            </script>
+                        </onentry>
+                        <transition event="executed" cond="success and self.outstanding_execution == request_id" target=".">
+                            <parameter name="returnvalue"/>
+                            <parameter name="success"/>
+                            <parameter name="request_id"/>
+                        </transition>
+                        <transition event="executed" cond="not success and self.outstanding_execution == request_id" target="../timeout">
+                            <parameter name="returnvalue"/>
+                            <parameter name="success"/>
+                            <parameter name="request_id"/>
+                        </transition>
+                    </state>
+
+                    <state id="timeout">
+                        <transition after="1.0" target="../executing"/>
+                        <transition event="set_input_done" target="../executing"/>
+                    </state>
+                    
+                    <transition target="../paused" event="pause">
+                        <parameter name="source"/>
+                        <parameter name="args"/>
+                        <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
+                            <parameter expr="json.dumps({'user': self.username, 'state': 'paused', 'info': self.mvk.debug_info})"/>
                         </raise>
-                        <script>
-                            self.outstanding_execution = self.request_id
-                            self.request_id += 1
-                        </script>
-                    </onentry>
-                    <transition event="executed" cond="success and self.outstanding_execution == request_id" target=".">
-                        <parameter name="returnvalue"/>
-                        <parameter name="success"/>
-                        <parameter name="request_id"/>
-                    </transition>
-                    <transition event="executed" cond="not success and self.outstanding_execution == request_id" target="../timeout">
-                        <parameter name="returnvalue"/>
-                        <parameter name="success"/>
-                        <parameter name="request_id"/>
                     </transition>
                 </state>
-
-                <state id="timeout">
-                    <transition after="1.0" target="../init"/>
-                    <transition event="set_input_done" target="../init"/>
+                <state id="paused">
+                    <transition target="../executing" event="resume">
+                        <parameter name="source"/>
+                        <parameter name="args"/>
+                        <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
+                            <parameter expr="json.dumps({'user': self.username, 'state': 'running'})"/>
+                        </raise>
+                    </transition>
                 </state>
             </state>
 

+ 142 - 60
kernel/mvk_server/server.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Thu Feb  9 14:45:08 2017
+Date:   Thu Feb 09 16:22:18 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
@@ -66,55 +66,60 @@ class MvKController(RuntimeClassBase):
         self.states["/init_executor"] = State(2, self)
         self.states["/init_executor"].setEnter(self._init_executor_enter)
         
+        # state /get_mvk
+        self.states["/get_mvk"] = State(3, self)
+        self.states["/get_mvk"].setEnter(self._get_mvk_enter)
+        
         # state /read_root
-        self.states["/read_root"] = State(3, self)
+        self.states["/read_root"] = State(4, self)
         self.states["/read_root"].setEnter(self._read_root_enter)
         
         # state /running
-        self.states["/running"] = ParallelState(4, self)
+        self.states["/running"] = ParallelState(5, self)
         
         # state /running/wait_for_requests
-        self.states["/running/wait_for_requests"] = State(5, self)
+        self.states["/running/wait_for_requests"] = State(6, self)
         
         # state /running/wait_for_requests/wait
-        self.states["/running/wait_for_requests/wait"] = State(6, self)
+        self.states["/running/wait_for_requests/wait"] = State(7, self)
         
         # state /running/push
-        self.states["/running/push"] = State(7, self)
+        self.states["/running/push"] = State(8, self)
         
         # state /running/push/wait
-        self.states["/running/push/wait"] = State(8, self)
+        self.states["/running/push/wait"] = State(9, self)
         
         # state /running/push/process
-        self.states["/running/push/process"] = State(9, self)
+        self.states["/running/push/process"] = State(10, self)
         
         # state /running/find_users
-        self.states["/running/find_users"] = State(10, self)
+        self.states["/running/find_users"] = State(11, self)
         
         # state /running/find_users/get_all_links
-        self.states["/running/find_users/get_all_links"] = State(11, self)
+        self.states["/running/find_users/get_all_links"] = State(12, self)
         self.states["/running/find_users/get_all_links"].setEnter(self._running_find_users_get_all_links_enter)
         
         # state /running/find_users/retrieve_users
-        self.states["/running/find_users/retrieve_users"] = State(12, self)
+        self.states["/running/find_users/retrieve_users"] = State(13, self)
         
         # state /running/find_users/got_usernames
-        self.states["/running/find_users/got_usernames"] = State(13, self)
+        self.states["/running/find_users/got_usernames"] = State(14, self)
         
         # state /running/find_users/process_users
-        self.states["/running/find_users/process_users"] = State(14, self)
+        self.states["/running/find_users/process_users"] = State(15, self)
         
         # state /running/find_users/creating_user
-        self.states["/running/find_users/creating_user"] = State(15, self)
+        self.states["/running/find_users/creating_user"] = State(16, self)
         
         # state /running/find_users/wait
-        self.states["/running/find_users/wait"] = State(16, self)
+        self.states["/running/find_users/wait"] = State(17, self)
         self.states["/running/find_users/wait"].setEnter(self._running_find_users_wait_enter)
         self.states["/running/find_users/wait"].setExit(self._running_find_users_wait_exit)
         
         # add children
         self.states[""].addChild(self.states["/init_server"])
         self.states[""].addChild(self.states["/init_executor"])
+        self.states[""].addChild(self.states["/get_mvk"])
         self.states[""].addChild(self.states["/read_root"])
         self.states[""].addChild(self.states["/running"])
         self.states["/running"].addChild(self.states["/running/wait_for_requests"])
@@ -142,11 +147,17 @@ class MvKController(RuntimeClassBase):
         self.states["/init_server"].addTransition(_init_server_0)
         
         # transition /init_executor
-        _init_executor_0 = Transition(self, self.states["/init_executor"], [self.states["/read_root"]])
+        _init_executor_0 = Transition(self, self.states["/init_executor"], [self.states["/get_mvk"]])
         _init_executor_0.setAction(self._init_executor_0_exec)
         _init_executor_0.setTrigger(Event("instance_created", None))
         self.states["/init_executor"].addTransition(_init_executor_0)
         
+        # transition /get_mvk
+        _get_mvk_0 = Transition(self, self.states["/get_mvk"], [self.states["/read_root"]])
+        _get_mvk_0.setAction(self._get_mvk_0_exec)
+        _get_mvk_0.setTrigger(Event("get_mvk_reply", None))
+        self.states["/get_mvk"].addTransition(_get_mvk_0)
+        
         # transition /read_root
         _read_root_0 = Transition(self, self.states["/read_root"], [self.states["/running"]])
         _read_root_0.setAction(self._read_root_0_exec)
@@ -181,6 +192,16 @@ class MvKController(RuntimeClassBase):
         _running_push_process_1.setTrigger(None)
         _running_push_process_1.setGuard(self._running_push_process_1_guard)
         self.states["/running/push/process"].addTransition(_running_push_process_1)
+        _running_push_process_2 = Transition(self, self.states["/running/push/process"], [self.states["/running/push/wait"]])
+        _running_push_process_2.setAction(self._running_push_process_2_exec)
+        _running_push_process_2.setTrigger(None)
+        _running_push_process_2.setGuard(self._running_push_process_2_guard)
+        self.states["/running/push/process"].addTransition(_running_push_process_2)
+        _running_push_process_3 = Transition(self, self.states["/running/push/process"], [self.states["/running/push/wait"]])
+        _running_push_process_3.setAction(self._running_push_process_3_exec)
+        _running_push_process_3.setTrigger(None)
+        _running_push_process_3.setGuard(self._running_push_process_3_guard)
+        self.states["/running/push/process"].addTransition(_running_push_process_3)
         
         # transition /running/find_users/get_all_links
         _running_find_users_get_all_links_0 = Transition(self, self.states["/running/find_users/get_all_links"], [self.states["/running/find_users/retrieve_users"]])
@@ -241,6 +262,9 @@ class MvKController(RuntimeClassBase):
     def _init_executor_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'executor', 'Executor']))
     
+    def _get_mvk_enter(self):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'executor', Event("get_mvk", None, ['parent'])]))
+    
     def _read_root_enter(self):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'executor', Event("raw_exec", None, [[['RR', []]], 'parent'])]))
     
@@ -261,6 +285,10 @@ class MvKController(RuntimeClassBase):
         instancename = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
     
+    def _get_mvk_0_exec(self, parameters):
+        mvk = parameters[0]
+        self.mvk = mvk
+    
     def _read_root_0_exec(self, parameters):
         data = parameters[0]
         self.root = data[0][0]
@@ -309,6 +337,20 @@ class MvKController(RuntimeClassBase):
     def _running_push_process_1_guard(self, parameters):
         return self.input_queue[0][1] == 'get_output'
     
+    def _running_push_process_2_exec(self, parameters):
+        source, op, args, username = self.input_queue.pop(0)
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.user_statecharts[username], Event("pause", None, [source, args])]))
+    
+    def _running_push_process_2_guard(self, parameters):
+        return self.input_queue[0][1] == 'pause'
+    
+    def _running_push_process_3_exec(self, parameters):
+        source, op, args, username = self.input_queue.pop(0)
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.user_statecharts[username], Event("resume", None, [source, args])]))
+    
+    def _running_push_process_3_guard(self, parameters):
+        return self.input_queue[0][1] == 'resume'
+    
     def _running_find_users_get_all_links_0_exec(self, parameters):
         data = parameters[0]
         self.users = data[0][0]
@@ -332,7 +374,7 @@ class MvKController(RuntimeClassBase):
         return not self.add_users and not self.delete_users
     
     def _running_find_users_process_users_1_exec(self, parameters):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, 'users', 'UserStatechart', self.add_users[0]]))
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'users', 'UserStatechart', self.add_users[0], self.mvk]))
     
     def _running_find_users_process_users_1_guard(self, parameters):
         return self.add_users and not self.delete_users
@@ -1079,7 +1121,7 @@ class HTTPClient(RuntimeClassBase):
         RuntimeClassBase.initializeStatechart(self)
 
 class UserStatechart(RuntimeClassBase):
-    def __init__(self, controller, username):
+    def __init__(self, controller, username, mvk):
         RuntimeClassBase.__init__(self, controller)
         
         self.semantics.big_step_maximality = StatechartSemantics.TakeMany
@@ -1092,10 +1134,11 @@ class UserStatechart(RuntimeClassBase):
         self.build_statechart_structure()
         
         # call user defined constructor
-        UserStatechart.user_defined_constructor(self, username)
+        UserStatechart.user_defined_constructor(self, username, mvk)
     
-    def user_defined_constructor(self, username):
+    def user_defined_constructor(self, username, mvk):
         self.username = username
+        self.mvk = mvk
         
         self.output_queue = []
         self.source_execution = None
@@ -1124,35 +1167,41 @@ class UserStatechart(RuntimeClassBase):
         # state /running/execution
         self.states["/running/execution"] = State(3, self)
         
-        # state /running/execution/init
-        self.states["/running/execution/init"] = State(4, self)
-        self.states["/running/execution/init"].setEnter(self._running_execution_init_enter)
+        # state /running/execution/executing
+        self.states["/running/execution/executing"] = State(4, self)
+        
+        # state /running/execution/executing/executing
+        self.states["/running/execution/executing/executing"] = State(5, self)
+        self.states["/running/execution/executing/executing"].setEnter(self._running_execution_executing_executing_enter)
         
-        # state /running/execution/timeout
-        self.states["/running/execution/timeout"] = State(5, self)
-        self.states["/running/execution/timeout"].setEnter(self._running_execution_timeout_enter)
-        self.states["/running/execution/timeout"].setExit(self._running_execution_timeout_exit)
+        # state /running/execution/executing/timeout
+        self.states["/running/execution/executing/timeout"] = State(6, self)
+        self.states["/running/execution/executing/timeout"].setEnter(self._running_execution_executing_timeout_enter)
+        self.states["/running/execution/executing/timeout"].setExit(self._running_execution_executing_timeout_exit)
+        
+        # state /running/execution/paused
+        self.states["/running/execution/paused"] = State(7, self)
         
         # state /running/set_input
-        self.states["/running/set_input"] = State(6, self)
+        self.states["/running/set_input"] = State(8, self)
         
         # state /running/set_input/fetch
-        self.states["/running/set_input/fetch"] = State(7, self)
+        self.states["/running/set_input/fetch"] = State(9, self)
         
         # state /running/get_output_queue
-        self.states["/running/get_output_queue"] = State(8, self)
+        self.states["/running/get_output_queue"] = State(10, self)
         
         # state /running/get_output_queue/waiting
-        self.states["/running/get_output_queue/waiting"] = State(9, self)
+        self.states["/running/get_output_queue/waiting"] = State(11, self)
         
         # state /running/get_output
-        self.states["/running/get_output"] = State(10, self)
+        self.states["/running/get_output"] = State(12, self)
         
         # state /running/get_output/try_execute
-        self.states["/running/get_output/try_execute"] = State(11, self)
+        self.states["/running/get_output/try_execute"] = State(13, self)
         
         # state /running/get_output/waiting
-        self.states["/running/get_output/waiting"] = State(12, self)
+        self.states["/running/get_output/waiting"] = State(14, self)
         self.states["/running/get_output/waiting"].setEnter(self._running_get_output_waiting_enter)
         self.states["/running/get_output/waiting"].setExit(self._running_get_output_waiting_exit)
         
@@ -1163,15 +1212,18 @@ class UserStatechart(RuntimeClassBase):
         self.states["/running"].addChild(self.states["/running/set_input"])
         self.states["/running"].addChild(self.states["/running/get_output_queue"])
         self.states["/running"].addChild(self.states["/running/get_output"])
-        self.states["/running/execution"].addChild(self.states["/running/execution/init"])
-        self.states["/running/execution"].addChild(self.states["/running/execution/timeout"])
+        self.states["/running/execution"].addChild(self.states["/running/execution/executing"])
+        self.states["/running/execution"].addChild(self.states["/running/execution/paused"])
+        self.states["/running/execution/executing"].addChild(self.states["/running/execution/executing/executing"])
+        self.states["/running/execution/executing"].addChild(self.states["/running/execution/executing/timeout"])
         self.states["/running/set_input"].addChild(self.states["/running/set_input/fetch"])
         self.states["/running/get_output_queue"].addChild(self.states["/running/get_output_queue/waiting"])
         self.states["/running/get_output"].addChild(self.states["/running/get_output/try_execute"])
         self.states["/running/get_output"].addChild(self.states["/running/get_output/waiting"])
         self.states[""].fixTree()
         self.states[""].default_state = self.states["/init"]
-        self.states["/running/execution"].default_state = self.states["/running/execution/init"]
+        self.states["/running/execution"].default_state = self.states["/running/execution/executing"]
+        self.states["/running/execution/executing"].default_state = self.states["/running/execution/executing/executing"]
         self.states["/running/set_input"].default_state = self.states["/running/set_input/fetch"]
         self.states["/running/get_output_queue"].default_state = self.states["/running/get_output_queue/waiting"]
         self.states["/running/get_output"].default_state = self.states["/running/get_output/try_execute"]
@@ -1182,23 +1234,29 @@ class UserStatechart(RuntimeClassBase):
         _init_0.setTrigger(Event("set_returnpath", None))
         self.states["/init"].addTransition(_init_0)
         
-        # transition /running/execution/init
-        _running_execution_init_0 = Transition(self, self.states["/running/execution/init"], [self.states["/running/execution/init"]])
-        _running_execution_init_0.setTrigger(Event("executed", None))
-        _running_execution_init_0.setGuard(self._running_execution_init_0_guard)
-        self.states["/running/execution/init"].addTransition(_running_execution_init_0)
-        _running_execution_init_1 = Transition(self, self.states["/running/execution/init"], [self.states["/running/execution/timeout"]])
-        _running_execution_init_1.setTrigger(Event("executed", None))
-        _running_execution_init_1.setGuard(self._running_execution_init_1_guard)
-        self.states["/running/execution/init"].addTransition(_running_execution_init_1)
-        
-        # transition /running/execution/timeout
-        _running_execution_timeout_0 = Transition(self, self.states["/running/execution/timeout"], [self.states["/running/execution/init"]])
-        _running_execution_timeout_0.setTrigger(Event("_0after"))
-        self.states["/running/execution/timeout"].addTransition(_running_execution_timeout_0)
-        _running_execution_timeout_1 = Transition(self, self.states["/running/execution/timeout"], [self.states["/running/execution/init"]])
-        _running_execution_timeout_1.setTrigger(Event("set_input_done", None))
-        self.states["/running/execution/timeout"].addTransition(_running_execution_timeout_1)
+        # transition /running/execution/executing/executing
+        _running_execution_executing_executing_0 = Transition(self, self.states["/running/execution/executing/executing"], [self.states["/running/execution/executing/executing"]])
+        _running_execution_executing_executing_0.setTrigger(Event("executed", None))
+        _running_execution_executing_executing_0.setGuard(self._running_execution_executing_executing_0_guard)
+        self.states["/running/execution/executing/executing"].addTransition(_running_execution_executing_executing_0)
+        _running_execution_executing_executing_1 = Transition(self, self.states["/running/execution/executing/executing"], [self.states["/running/execution/executing/timeout"]])
+        _running_execution_executing_executing_1.setTrigger(Event("executed", None))
+        _running_execution_executing_executing_1.setGuard(self._running_execution_executing_executing_1_guard)
+        self.states["/running/execution/executing/executing"].addTransition(_running_execution_executing_executing_1)
+        
+        # transition /running/execution/executing/timeout
+        _running_execution_executing_timeout_0 = Transition(self, self.states["/running/execution/executing/timeout"], [self.states["/running/execution/executing/executing"]])
+        _running_execution_executing_timeout_0.setTrigger(Event("_0after"))
+        self.states["/running/execution/executing/timeout"].addTransition(_running_execution_executing_timeout_0)
+        _running_execution_executing_timeout_1 = Transition(self, self.states["/running/execution/executing/timeout"], [self.states["/running/execution/executing/executing"]])
+        _running_execution_executing_timeout_1.setTrigger(Event("set_input_done", None))
+        self.states["/running/execution/executing/timeout"].addTransition(_running_execution_executing_timeout_1)
+        
+        # transition /running/execution/paused
+        _running_execution_paused_0 = Transition(self, self.states["/running/execution/paused"], [self.states["/running/execution/executing"]])
+        _running_execution_paused_0.setAction(self._running_execution_paused_0_exec)
+        _running_execution_paused_0.setTrigger(Event("resume", None))
+        self.states["/running/execution/paused"].addTransition(_running_execution_paused_0)
         
         # transition /running/set_input/fetch
         _running_set_input_fetch_0 = Transition(self, self.states["/running/set_input/fetch"], [self.states["/running/set_input/fetch"]])
@@ -1238,16 +1296,22 @@ class UserStatechart(RuntimeClassBase):
         _running_get_output_waiting_0 = Transition(self, self.states["/running/get_output/waiting"], [self.states["/running/get_output/try_execute"]])
         _running_get_output_waiting_0.setTrigger(Event("_1after"))
         self.states["/running/get_output/waiting"].addTransition(_running_get_output_waiting_0)
+        
+        # transition /running/execution/executing
+        _running_execution_executing_0 = Transition(self, self.states["/running/execution/executing"], [self.states["/running/execution/paused"]])
+        _running_execution_executing_0.setAction(self._running_execution_executing_0_exec)
+        _running_execution_executing_0.setTrigger(Event("pause", None))
+        self.states["/running/execution/executing"].addTransition(_running_execution_executing_0)
     
-    def _running_execution_init_enter(self):
+    def _running_execution_executing_executing_enter(self):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/executor', Event("execute", None, [self.returnpath, self.username, 'execute_rule', [], self.request_id])]))
         self.outstanding_execution = self.request_id
         self.request_id += 1
     
-    def _running_execution_timeout_enter(self):
+    def _running_execution_executing_timeout_enter(self):
         self.addTimer(0, 1.0)
     
-    def _running_execution_timeout_exit(self):
+    def _running_execution_executing_timeout_exit(self):
         self.removeTimer(0)
     
     def _running_get_output_waiting_enter(self):
@@ -1256,22 +1320,32 @@ class UserStatechart(RuntimeClassBase):
     def _running_get_output_waiting_exit(self):
         self.removeTimer(1)
     
+    def _running_execution_executing_0_exec(self, parameters):
+        source = parameters[0]
+        args = parameters[1]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/to_mvi/' + source, Event("HTTP_input", None, [json.dumps({'user': self.username, 'state': 'paused', 'info': self.mvk.debug_info})])]))
+    
     def _init_0_exec(self, parameters):
         returnpath = parameters[0]
         self.returnpath = returnpath
     
-    def _running_execution_init_0_guard(self, parameters):
+    def _running_execution_executing_executing_0_guard(self, parameters):
         returnvalue = parameters[0]
         success = parameters[1]
         request_id = parameters[2]
         return success and self.outstanding_execution == request_id
     
-    def _running_execution_init_1_guard(self, parameters):
+    def _running_execution_executing_executing_1_guard(self, parameters):
         returnvalue = parameters[0]
         success = parameters[1]
         request_id = parameters[2]
         return not success and self.outstanding_execution == request_id
     
+    def _running_execution_paused_0_exec(self, parameters):
+        source = parameters[0]
+        args = parameters[1]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/to_mvi/' + source, Event("HTTP_input", None, [json.dumps({'user': self.username, 'state': 'running'})])]))
+    
     def _running_set_input_fetch_0_exec(self, parameters):
         source = parameters[0]
         args = parameters[1]
@@ -1438,6 +1512,10 @@ class Executor(RuntimeClassBase):
         _init_raw_exec_raw_exec_0.setAction(self._init_raw_exec_raw_exec_0_exec)
         _init_raw_exec_raw_exec_0.setTrigger(Event("raw_exec", None))
         self.states["/init/raw_exec/raw_exec"].addTransition(_init_raw_exec_raw_exec_0)
+        _init_raw_exec_raw_exec_1 = Transition(self, self.states["/init/raw_exec/raw_exec"], [self.states["/init/raw_exec/raw_exec"]])
+        _init_raw_exec_raw_exec_1.setAction(self._init_raw_exec_raw_exec_1_exec)
+        _init_raw_exec_raw_exec_1.setTrigger(Event("get_mvk", None))
+        self.states["/init/raw_exec/raw_exec"].addTransition(_init_raw_exec_raw_exec_1)
         
         # transition /init/queue/queue
         _init_queue_queue_0 = Transition(self, self.states["/init/queue/queue"], [self.states["/init/queue/queue"]])
@@ -1482,6 +1560,10 @@ class Executor(RuntimeClassBase):
         reply = [self.mvs_operations[command[0]](*command[1]) for command in operations]
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, source, Event("raw_exec_reply", None, [reply])]))
     
+    def _init_raw_exec_raw_exec_1_exec(self, parameters):
+        source = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, source, Event("get_mvk_reply", None, [self.mvk])]))
+    
     def _init_queue_queue_0_exec(self, parameters):
         returnpath = parameters[0]
         username = parameters[1]
@@ -1533,7 +1615,7 @@ class ObjectManager(ObjectManagerBase):
             instance.associations = {}
             instance.associations["parent"] = Association("MvKController", 1, 1)
         elif class_name == "UserStatechart":
-            instance = UserStatechart(self.controller, construct_params[0])
+            instance = UserStatechart(self.controller, construct_params[0], construct_params[1])
             instance.associations = {}
             instance.associations["parent"] = Association("MvKController", 1, 1)
         elif class_name == "Executor":

+ 8 - 4
scripts/debug_prompt.py

@@ -24,9 +24,15 @@ local_print("Please specify Modelverse location (default: 127.0.0.1:8001)")
 location = raw_input()
 if location == "":
     address = "http://127.0.0.1:8001/"
+    
+local_print("Please specify user name (default: test)")
+
+username = raw_input()
+if location == "":
+    username = "test"
 
 local_print("Switching context to Modelverse: all data is piped.")
-local_print("Available commands: 'attach_debugger', 'detach_debugger', 'pause', 'resume'")
+local_print("Available commands: 'pause', 'resume'")
 local_print("To quit: execute command 'quit'")
 
 while 1:
@@ -35,7 +41,5 @@ while 1:
     if action == "quit":
         local_print("Received quit: breaking connection to Modelverse immediately!")
         break
-    else:
-        username = inp[1]
 
-    urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": action, "username": username}))).read()
+    print urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": action, "username": username}))).read()