소스 검색

some more debugging

Simon Van Mierlo 8 년 전
부모
커밋
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)
     result["tree"].fix_tracability(inputfile)
 
 
+    print 'yentl told me to print'
     for visitor in visitors:
     for visitor in visitors:
         visitor.visit(result["tree"])
         visitor.visit(result["tree"])
 
 

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

@@ -52,6 +52,12 @@
                             <parameter expr="reply"/>
                             <parameter expr="reply"/>
                         </raise>
                         </raise>
                     </transition>
                     </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>
             </state>
             </state>
 
 

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

@@ -45,7 +45,7 @@
                     <parameter expr="'Executor'"/>
                     <parameter expr="'Executor'"/>
                 </raise>
                 </raise>
             </onentry>
             </onentry>
-            <transition event="instance_created" target="../read_root">
+            <transition event="instance_created" target="../get_mvk">
                 <parameter name="instancename"/>
                 <parameter name="instancename"/>
                 <raise scope="cd" event="start_instance">
                 <raise scope="cd" event="start_instance">
                     <parameter expr="instancename"/>
                     <parameter expr="instancename"/>
@@ -53,6 +53,21 @@
             </transition>
             </transition>
         </state>
         </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">
         <state id="read_root">
             <onentry>
             <onentry>
                 <raise event="raw_exec" scope="narrow" target="'executor'">
                 <raise event="raw_exec" scope="narrow" target="'executor'">
@@ -132,6 +147,26 @@
                             <parameter expr="args"/>
                             <parameter expr="args"/>
                         </raise>
                         </raise>
                     </transition>
                     </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>
             </state>
             </state>
 
 
@@ -180,6 +215,7 @@
                             <parameter expr="'users'"/>
                             <parameter expr="'users'"/>
                             <parameter expr="'UserStatechart'"/>
                             <parameter expr="'UserStatechart'"/>
                             <parameter expr="self.add_users[0]"/>
                             <parameter expr="self.add_users[0]"/>
+                            <parameter expr="self.mvk"/>
                         </raise>
                         </raise>
                     </transition>
                     </transition>
                     <transition cond="self.delete_users" target=".">
                     <transition cond="self.delete_users" target=".">

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

@@ -4,9 +4,11 @@
     </relationships>
     </relationships>
     <constructor>
     <constructor>
         <parameter name="username"/>
         <parameter name="username"/>
+        <parameter name="mvk" />
         <body>
         <body>
             <![CDATA[
             <![CDATA[
             self.username = username
             self.username = username
+            self.mvk = mvk
 
 
             self.output_queue = []
             self.output_queue = []
             self.source_execution = None
             self.source_execution = None
@@ -29,36 +31,55 @@
         </state>
         </state>
 
 
         <parallel id="running">
         <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>
                         </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>
                     </transition>
                 </state>
                 </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>
             </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)
 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 author: Yentl Van Tendeloo
 Model name:   MvK Server
 Model name:   MvK Server
@@ -66,55 +66,60 @@ class MvKController(RuntimeClassBase):
         self.states["/init_executor"] = State(2, self)
         self.states["/init_executor"] = State(2, self)
         self.states["/init_executor"].setEnter(self._init_executor_enter)
         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
         # 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)
         self.states["/read_root"].setEnter(self._read_root_enter)
         
         
         # state /running
         # state /running
-        self.states["/running"] = ParallelState(4, self)
+        self.states["/running"] = ParallelState(5, self)
         
         
         # state /running/wait_for_requests
         # 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
         # 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
         # state /running/push
-        self.states["/running/push"] = State(7, self)
+        self.states["/running/push"] = State(8, self)
         
         
         # state /running/push/wait
         # state /running/push/wait
-        self.states["/running/push/wait"] = State(8, self)
+        self.states["/running/push/wait"] = State(9, self)
         
         
         # state /running/push/process
         # state /running/push/process
-        self.states["/running/push/process"] = State(9, self)
+        self.states["/running/push/process"] = State(10, self)
         
         
         # state /running/find_users
         # 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
         # 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)
         self.states["/running/find_users/get_all_links"].setEnter(self._running_find_users_get_all_links_enter)
         
         
         # state /running/find_users/retrieve_users
         # 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
         # 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
         # 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
         # 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
         # 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"].setEnter(self._running_find_users_wait_enter)
         self.states["/running/find_users/wait"].setExit(self._running_find_users_wait_exit)
         self.states["/running/find_users/wait"].setExit(self._running_find_users_wait_exit)
         
         
         # add children
         # add children
         self.states[""].addChild(self.states["/init_server"])
         self.states[""].addChild(self.states["/init_server"])
         self.states[""].addChild(self.states["/init_executor"])
         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["/read_root"])
         self.states[""].addChild(self.states["/running"])
         self.states[""].addChild(self.states["/running"])
         self.states["/running"].addChild(self.states["/running/wait_for_requests"])
         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)
         self.states["/init_server"].addTransition(_init_server_0)
         
         
         # transition /init_executor
         # 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.setAction(self._init_executor_0_exec)
         _init_executor_0.setTrigger(Event("instance_created", None))
         _init_executor_0.setTrigger(Event("instance_created", None))
         self.states["/init_executor"].addTransition(_init_executor_0)
         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
         # transition /read_root
         _read_root_0 = Transition(self, self.states["/read_root"], [self.states["/running"]])
         _read_root_0 = Transition(self, self.states["/read_root"], [self.states["/running"]])
         _read_root_0.setAction(self._read_root_0_exec)
         _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.setTrigger(None)
         _running_push_process_1.setGuard(self._running_push_process_1_guard)
         _running_push_process_1.setGuard(self._running_push_process_1_guard)
         self.states["/running/push/process"].addTransition(_running_push_process_1)
         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
         # 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"]])
         _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):
     def _init_executor_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'executor', 'Executor']))
         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):
     def _read_root_enter(self):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'executor', Event("raw_exec", None, [[['RR', []]], 'parent'])]))
         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]
         instancename = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
         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):
     def _read_root_0_exec(self, parameters):
         data = parameters[0]
         data = parameters[0]
         self.root = data[0][0]
         self.root = data[0][0]
@@ -309,6 +337,20 @@ class MvKController(RuntimeClassBase):
     def _running_push_process_1_guard(self, parameters):
     def _running_push_process_1_guard(self, parameters):
         return self.input_queue[0][1] == 'get_output'
         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):
     def _running_find_users_get_all_links_0_exec(self, parameters):
         data = parameters[0]
         data = parameters[0]
         self.users = data[0][0]
         self.users = data[0][0]
@@ -332,7 +374,7 @@ class MvKController(RuntimeClassBase):
         return not self.add_users and not self.delete_users
         return not self.add_users and not self.delete_users
     
     
     def _running_find_users_process_users_1_exec(self, parameters):
     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):
     def _running_find_users_process_users_1_guard(self, parameters):
         return self.add_users and not self.delete_users
         return self.add_users and not self.delete_users
@@ -1079,7 +1121,7 @@ class HTTPClient(RuntimeClassBase):
         RuntimeClassBase.initializeStatechart(self)
         RuntimeClassBase.initializeStatechart(self)
 
 
 class UserStatechart(RuntimeClassBase):
 class UserStatechart(RuntimeClassBase):
-    def __init__(self, controller, username):
+    def __init__(self, controller, username, mvk):
         RuntimeClassBase.__init__(self, controller)
         RuntimeClassBase.__init__(self, controller)
         
         
         self.semantics.big_step_maximality = StatechartSemantics.TakeMany
         self.semantics.big_step_maximality = StatechartSemantics.TakeMany
@@ -1092,10 +1134,11 @@ class UserStatechart(RuntimeClassBase):
         self.build_statechart_structure()
         self.build_statechart_structure()
         
         
         # call user defined constructor
         # 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.username = username
+        self.mvk = mvk
         
         
         self.output_queue = []
         self.output_queue = []
         self.source_execution = None
         self.source_execution = None
@@ -1124,35 +1167,41 @@ class UserStatechart(RuntimeClassBase):
         # state /running/execution
         # state /running/execution
         self.states["/running/execution"] = State(3, self)
         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
         # 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
         # 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
         # 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
         # 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
         # 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
         # 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
         # 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"].setEnter(self._running_get_output_waiting_enter)
         self.states["/running/get_output/waiting"].setExit(self._running_get_output_waiting_exit)
         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/set_input"])
         self.states["/running"].addChild(self.states["/running/get_output_queue"])
         self.states["/running"].addChild(self.states["/running/get_output_queue"])
         self.states["/running"].addChild(self.states["/running/get_output"])
         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/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_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/try_execute"])
         self.states["/running/get_output"].addChild(self.states["/running/get_output/waiting"])
         self.states["/running/get_output"].addChild(self.states["/running/get_output/waiting"])
         self.states[""].fixTree()
         self.states[""].fixTree()
         self.states[""].default_state = self.states["/init"]
         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/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_queue"].default_state = self.states["/running/get_output_queue/waiting"]
         self.states["/running/get_output"].default_state = self.states["/running/get_output/try_execute"]
         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))
         _init_0.setTrigger(Event("set_returnpath", None))
         self.states["/init"].addTransition(_init_0)
         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
         # transition /running/set_input/fetch
         _running_set_input_fetch_0 = Transition(self, self.states["/running/set_input/fetch"], [self.states["/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 = Transition(self, self.states["/running/get_output/waiting"], [self.states["/running/get_output/try_execute"]])
         _running_get_output_waiting_0.setTrigger(Event("_1after"))
         _running_get_output_waiting_0.setTrigger(Event("_1after"))
         self.states["/running/get_output/waiting"].addTransition(_running_get_output_waiting_0)
         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.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.outstanding_execution = self.request_id
         self.request_id += 1
         self.request_id += 1
     
     
-    def _running_execution_timeout_enter(self):
+    def _running_execution_executing_timeout_enter(self):
         self.addTimer(0, 1.0)
         self.addTimer(0, 1.0)
     
     
-    def _running_execution_timeout_exit(self):
+    def _running_execution_executing_timeout_exit(self):
         self.removeTimer(0)
         self.removeTimer(0)
     
     
     def _running_get_output_waiting_enter(self):
     def _running_get_output_waiting_enter(self):
@@ -1256,22 +1320,32 @@ class UserStatechart(RuntimeClassBase):
     def _running_get_output_waiting_exit(self):
     def _running_get_output_waiting_exit(self):
         self.removeTimer(1)
         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):
     def _init_0_exec(self, parameters):
         returnpath = parameters[0]
         returnpath = parameters[0]
         self.returnpath = returnpath
         self.returnpath = returnpath
     
     
-    def _running_execution_init_0_guard(self, parameters):
+    def _running_execution_executing_executing_0_guard(self, parameters):
         returnvalue = parameters[0]
         returnvalue = parameters[0]
         success = parameters[1]
         success = parameters[1]
         request_id = parameters[2]
         request_id = parameters[2]
         return success and self.outstanding_execution == request_id
         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]
         returnvalue = parameters[0]
         success = parameters[1]
         success = parameters[1]
         request_id = parameters[2]
         request_id = parameters[2]
         return not success and self.outstanding_execution == request_id
         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):
     def _running_set_input_fetch_0_exec(self, parameters):
         source = parameters[0]
         source = parameters[0]
         args = parameters[1]
         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.setAction(self._init_raw_exec_raw_exec_0_exec)
         _init_raw_exec_raw_exec_0.setTrigger(Event("raw_exec", None))
         _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)
         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
         # transition /init/queue/queue
         _init_queue_queue_0 = Transition(self, self.states["/init/queue/queue"], [self.states["/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]
         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])]))
         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):
     def _init_queue_queue_0_exec(self, parameters):
         returnpath = parameters[0]
         returnpath = parameters[0]
         username = parameters[1]
         username = parameters[1]
@@ -1533,7 +1615,7 @@ class ObjectManager(ObjectManagerBase):
             instance.associations = {}
             instance.associations = {}
             instance.associations["parent"] = Association("MvKController", 1, 1)
             instance.associations["parent"] = Association("MvKController", 1, 1)
         elif class_name == "UserStatechart":
         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 = {}
             instance.associations["parent"] = Association("MvKController", 1, 1)
             instance.associations["parent"] = Association("MvKController", 1, 1)
         elif class_name == "Executor":
         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()
 location = raw_input()
 if location == "":
 if location == "":
     address = "http://127.0.0.1:8001/"
     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("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'")
 local_print("To quit: execute command 'quit'")
 
 
 while 1:
 while 1:
@@ -35,7 +41,5 @@ while 1:
     if action == "quit":
     if action == "quit":
         local_print("Received quit: breaking connection to Modelverse immediately!")
         local_print("Received quit: breaking connection to Modelverse immediately!")
         break
         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()