Browse Source

Everything seems to work

Yentl Van Tendeloo 8 years ago
parent
commit
ce17eb603e

+ 1 - 1
kernel/modelverse_kernel/main.py

@@ -58,7 +58,7 @@ class ModelverseKernel(object):
         if self.phase_v == "finish":
             gen = self.helper_init(user_root)
         elif self.inst is None:
-            raise Exception("Instruction pointer could not be found!")
+            raise Exception("Instruction pointer could not be found for user %s!" % username)
         elif isinstance(self.phase_v, string_types):
             if self.phase_v == "init" and self.inst in self.compiled:
                 #print("%-30s(%s)" % ("COMPILED " + str(self.compiled[self.inst]), self.phase_v))

+ 14 - 8
kernel/mvk_server/classes/mvkcontroller.xml

@@ -78,7 +78,6 @@
                         <script>                                
                             # No JSON encoding necessary, as it is not complex
                             try:
-                                print 'from_mvi %s' % data
                                 args = None
                                 if data["op"] == "set_input":
                                     if "value" in data:
@@ -167,18 +166,25 @@
                     <transition event="raw_exec_reply" target="../process_users">
                         <parameter name="data"/>
                         <script>
-                            self.users = [v[0] for v in data if v[0] not in self.user_statecharts]
+                            data = set([v[0] for v in data])
+                            self.add_users = [v for v in data if v not in self.user_statecharts]
+                            self.delete_users = [v for v in self.user_statecharts if v not in data]
                         </script>
                     </transition>
                 </state>
 
                 <state id="process_users">
-                    <transition cond="not self.users" target="../wait"/>
-                    <transition cond="self.users" target="../creating_user">
+                    <transition cond="not self.add_users and not self.delete_users" target="../wait"/>
+                    <transition cond="self.add_users and not self.delete_users" target="../creating_user">
                         <raise event="create_instance" scope="cd">
                             <parameter expr="'users'"/>
                             <parameter expr="'UserStatechart'"/>
-                            <parameter expr="self.users[0]"/>
+                            <parameter expr="self.add_users[0]"/>
+                        </raise>
+                    </transition>
+                    <transition cond="self.delete_users" target=".">
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="self.user_statecharts.pop(self.delete_users.pop(0))"/>
                         </raise>
                     </transition>
                 </state>
@@ -193,10 +199,10 @@
                             <parameter expr="instancename"/>
                         </raise>
                         <script>
-                            self.user_statecharts[self.users[0]] = instancename
+                            self.user_statecharts[self.add_users[0]] = instancename
                             # Repush all this user's messages in the input queue
-                            self.input_queue.extend(self.user_queue.pop(self.users[0], []))
-                            self.users.pop(0)
+                            self.input_queue.extend(self.user_queue.pop(self.add_users[0], []))
+                            self.add_users.pop(0)
                         </script>
                     </transition>
                 </state>

+ 23 - 8
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 12:46:19 2017
+Date:   Thu Feb  9 13:03:43 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
@@ -215,6 +215,11 @@ class MvKController(RuntimeClassBase):
         _running_find_users_process_users_1.setTrigger(None)
         _running_find_users_process_users_1.setGuard(self._running_find_users_process_users_1_guard)
         self.states["/running/find_users/process_users"].addTransition(_running_find_users_process_users_1)
+        _running_find_users_process_users_2 = Transition(self, self.states["/running/find_users/process_users"], [self.states["/running/find_users/process_users"]])
+        _running_find_users_process_users_2.setAction(self._running_find_users_process_users_2_exec)
+        _running_find_users_process_users_2.setTrigger(None)
+        _running_find_users_process_users_2.setGuard(self._running_find_users_process_users_2_guard)
+        self.states["/running/find_users/process_users"].addTransition(_running_find_users_process_users_2)
         
         # transition /running/find_users/creating_user
         _running_find_users_creating_user_0 = Transition(self, self.states["/running/find_users/creating_user"], [self.states["/running/find_users/retrieve_users"]])
@@ -320,25 +325,33 @@ class MvKController(RuntimeClassBase):
     
     def _running_find_users_got_usernames_0_exec(self, parameters):
         data = parameters[0]
-        self.users = [v[0] for v in data if v[0] not in self.user_statecharts]
+        data = set([v[0] for v in data])
+        self.add_users = [v for v in data if v not in self.user_statecharts]
+        self.delete_users = [v for v in self.user_statecharts if v not in data]
     
     def _running_find_users_process_users_0_guard(self, parameters):
-        return not self.users
+        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.users[0]]))
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'users', 'UserStatechart', self.add_users[0]]))
     
     def _running_find_users_process_users_1_guard(self, parameters):
-        return self.users
+        return self.add_users and not self.delete_users
+    
+    def _running_find_users_process_users_2_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, self.user_statecharts.pop(self.delete_users.pop(0))]))
+    
+    def _running_find_users_process_users_2_guard(self, parameters):
+        return self.delete_users
     
     def _running_find_users_creating_user_0_exec(self, parameters):
         instancename = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, instancename, Event("set_returnpath", None, [instancename])]))
-        self.user_statecharts[self.users[0]] = instancename
+        self.user_statecharts[self.add_users[0]] = instancename
         # Repush all this user's messages in the input queue
-        self.input_queue.extend(self.user_queue.pop(self.users[0], []))
-        self.users.pop(0)
+        self.input_queue.extend(self.user_queue.pop(self.add_users[0], []))
+        self.add_users.pop(0)
     
     def initializeStatechart(self):
         # enter default state
@@ -1458,6 +1471,8 @@ class Executor(RuntimeClassBase):
         self.returnpath, username, operation, params, self.request_id = self.request_queue.pop(0)
         reply = None
         commands = []
+        if operation == "set_input":
+            print("Add input " + str(params))
         while 1:
             commands = self.mvk.execute_yields(username, operation, params, reply)
             if commands is None: