瀏覽代碼

Built in a more decent timeout

Yentl Van Tendeloo 8 年之前
父節點
當前提交
a9ca406a62
共有 5 個文件被更改,包括 84 次插入46 次删除
  1. 1 1
      integration/utils.py
  2. 1 1
      scripts/prompt.py
  3. 1 1
      unit/utils.py
  4. 62 32
      wrappers/http_client.py
  5. 19 11
      wrappers/http_client.xml

+ 1 - 1
integration/utils.py

@@ -77,6 +77,6 @@ def flush_data(address, data):
 
 
 def start_mvc():
 def start_mvc():
     port = getFreePort()
     port = getFreePort()
-    address = "http://127.0.0.1:%s" % port
+    address = "127.0.0.1:%s" % port
     proc = execute("run_local_modelverse", [str(port)], wait=False)
     proc = execute("run_local_modelverse", [str(port)], wait=False)
     return proc, address
     return proc, address

+ 1 - 1
scripts/prompt.py

@@ -31,7 +31,7 @@ local_print("Welcome to the local shell!")
 try:
 try:
     address = sys.argv[1]
     address = sys.argv[1]
 except IndexError:
 except IndexError:
-    address = "http://127.0.0.1:8001"
+    address = "127.0.0.1:8001"
 try:
 try:
     taskname = sys.argv[2]
     taskname = sys.argv[2]
 except IndexError:
 except IndexError:

+ 1 - 1
unit/utils.py

@@ -77,6 +77,6 @@ def flush_data(address, data):
 
 
 def start_mvc():
 def start_mvc():
     port = getFreePort()
     port = getFreePort()
-    address = "http://127.0.0.1:%s" % port
+    address = "127.0.0.1:%s" % port
     proc = execute("run_local_modelverse", [str(port)], wait=False)
     proc = execute("run_local_modelverse", [str(port)], wait=False)
     return proc, address
     return proc, address

+ 62 - 32
wrappers/http_client.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 Aug 24 10:10:13 2017
+Date:   Thu Aug 24 10:20:41 2017
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   HTTP client
 Model name:   HTTP client
@@ -60,49 +60,60 @@ class HTTPClient(RuntimeClassBase):
         self.states["/connecting"].setEnter(self._connecting_enter)
         self.states["/connecting"].setEnter(self._connecting_enter)
         self.states["/connecting"].setExit(self._connecting_exit)
         self.states["/connecting"].setExit(self._connecting_exit)
         
         
+        # state /connecting/connecting
+        self.states["/connecting/connecting"] = State(4, "/connecting/connecting", self)
+        self.states["/connecting/connecting"].setEnter(self._connecting_connecting_enter)
+        
+        # state /connecting/cooldown
+        self.states["/connecting/cooldown"] = State(5, "/connecting/cooldown", self)
+        self.states["/connecting/cooldown"].setEnter(self._connecting_cooldown_enter)
+        self.states["/connecting/cooldown"].setExit(self._connecting_cooldown_exit)
+        
         # state /connected
         # state /connected
-        self.states["/connected"] = ParallelState(4, "/connected", self)
+        self.states["/connected"] = ParallelState(6, "/connected", self)
         
         
         # state /connected/listening
         # state /connected/listening
-        self.states["/connected/listening"] = State(5, "/connected/listening", self)
+        self.states["/connected/listening"] = State(7, "/connected/listening", self)
         
         
         # state /connected/listening/listen
         # state /connected/listening/listen
-        self.states["/connected/listening/listen"] = State(6, "/connected/listening/listen", self)
+        self.states["/connected/listening/listen"] = State(8, "/connected/listening/listen", self)
         self.states["/connected/listening/listen"].setEnter(self._connected_listening_listen_enter)
         self.states["/connected/listening/listen"].setEnter(self._connected_listening_listen_enter)
         
         
         # state /connected/listening/close
         # state /connected/listening/close
-        self.states["/connected/listening/close"] = State(7, "/connected/listening/close", self)
+        self.states["/connected/listening/close"] = State(9, "/connected/listening/close", self)
         
         
         # state /connected/sending
         # state /connected/sending
-        self.states["/connected/sending"] = State(8, "/connected/sending", self)
+        self.states["/connected/sending"] = State(10, "/connected/sending", self)
         
         
         # state /connected/sending/waiting_for_data
         # state /connected/sending/waiting_for_data
-        self.states["/connected/sending/waiting_for_data"] = State(9, "/connected/sending/waiting_for_data", self)
+        self.states["/connected/sending/waiting_for_data"] = State(11, "/connected/sending/waiting_for_data", self)
         
         
         # state /connected/sending/transferring
         # state /connected/sending/transferring
-        self.states["/connected/sending/transferring"] = State(10, "/connected/sending/transferring", self)
+        self.states["/connected/sending/transferring"] = State(12, "/connected/sending/transferring", self)
         
         
         # state /connected/queueing
         # state /connected/queueing
-        self.states["/connected/queueing"] = State(11, "/connected/queueing", self)
+        self.states["/connected/queueing"] = State(13, "/connected/queueing", self)
         
         
         # state /connected/queueing/queueing
         # state /connected/queueing/queueing
-        self.states["/connected/queueing/queueing"] = State(12, "/connected/queueing/queueing", self)
+        self.states["/connected/queueing/queueing"] = State(14, "/connected/queueing/queueing", self)
         self.states["/connected/queueing/queueing"].setEnter(self._connected_queueing_queueing_enter)
         self.states["/connected/queueing/queueing"].setEnter(self._connected_queueing_queueing_enter)
         
         
         # state /connected/parsing
         # state /connected/parsing
-        self.states["/connected/parsing"] = State(13, "/connected/parsing", self)
+        self.states["/connected/parsing"] = State(15, "/connected/parsing", self)
         
         
         # state /connected/parsing/wait_for_header
         # state /connected/parsing/wait_for_header
-        self.states["/connected/parsing/wait_for_header"] = State(14, "/connected/parsing/wait_for_header", self)
+        self.states["/connected/parsing/wait_for_header"] = State(16, "/connected/parsing/wait_for_header", self)
         
         
         # state /connected/parsing/wait_for_payload
         # state /connected/parsing/wait_for_payload
-        self.states["/connected/parsing/wait_for_payload"] = State(15, "/connected/parsing/wait_for_payload", self)
+        self.states["/connected/parsing/wait_for_payload"] = State(17, "/connected/parsing/wait_for_payload", self)
         
         
         # add children
         # add children
         self.states[""].addChild(self.states["/init"])
         self.states[""].addChild(self.states["/init"])
         self.states[""].addChild(self.states["/waiting"])
         self.states[""].addChild(self.states["/waiting"])
         self.states[""].addChild(self.states["/connecting"])
         self.states[""].addChild(self.states["/connecting"])
         self.states[""].addChild(self.states["/connected"])
         self.states[""].addChild(self.states["/connected"])
+        self.states["/connecting"].addChild(self.states["/connecting/connecting"])
+        self.states["/connecting"].addChild(self.states["/connecting/cooldown"])
         self.states["/connected"].addChild(self.states["/connected/listening"])
         self.states["/connected"].addChild(self.states["/connected/listening"])
         self.states["/connected"].addChild(self.states["/connected/sending"])
         self.states["/connected"].addChild(self.states["/connected/sending"])
         self.states["/connected"].addChild(self.states["/connected/queueing"])
         self.states["/connected"].addChild(self.states["/connected/queueing"])
@@ -116,6 +127,7 @@ class HTTPClient(RuntimeClassBase):
         self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_payload"])
         self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_payload"])
         self.states[""].fixTree()
         self.states[""].fixTree()
         self.states[""].default_state = self.states["/init"]
         self.states[""].default_state = self.states["/init"]
+        self.states["/connecting"].default_state = self.states["/connecting/connecting"]
         self.states["/connected/listening"].default_state = self.states["/connected/listening/listen"]
         self.states["/connected/listening"].default_state = self.states["/connected/listening/listen"]
         self.states["/connected/sending"].default_state = self.states["/connected/sending/waiting_for_data"]
         self.states["/connected/sending"].default_state = self.states["/connected/sending/waiting_for_data"]
         self.states["/connected/queueing"].default_state = self.states["/connected/queueing/queueing"]
         self.states["/connected/queueing"].default_state = self.states["/connected/queueing/queueing"]
@@ -134,16 +146,20 @@ class HTTPClient(RuntimeClassBase):
         _waiting_0.setTrigger(Event("connect", "request_in"))
         _waiting_0.setTrigger(Event("connect", "request_in"))
         self.states["/waiting"].addTransition(_waiting_0)
         self.states["/waiting"].addTransition(_waiting_0)
         
         
-        # transition /connecting
-        _connecting_0 = Transition(self, self.states["/connecting"], [self.states["/connected"]])
-        _connecting_0.setAction(self._connecting_0_exec)
-        _connecting_0.setTrigger(Event("connected_socket", "socket_in"))
-        _connecting_0.setGuard(self._connecting_0_guard)
-        self.states["/connecting"].addTransition(_connecting_0)
-        _connecting_1 = Transition(self, self.states["/connecting"], [self.states["/waiting"]])
-        _connecting_1.setAction(self._connecting_1_exec)
-        _connecting_1.setTrigger(Event("_0after"))
-        self.states["/connecting"].addTransition(_connecting_1)
+        # transition /connecting/connecting
+        _connecting_connecting_0 = Transition(self, self.states["/connecting/connecting"], [self.states["/connecting/cooldown"]])
+        _connecting_connecting_0.setTrigger(Event("error_socket", "socket_in"))
+        self.states["/connecting/connecting"].addTransition(_connecting_connecting_0)
+        _connecting_connecting_1 = Transition(self, self.states["/connecting/connecting"], [self.states["/connected"]])
+        _connecting_connecting_1.setAction(self._connecting_connecting_1_exec)
+        _connecting_connecting_1.setTrigger(Event("connected_socket", "socket_in"))
+        _connecting_connecting_1.setGuard(self._connecting_connecting_1_guard)
+        self.states["/connecting/connecting"].addTransition(_connecting_connecting_1)
+        
+        # transition /connecting/cooldown
+        _connecting_cooldown_0 = Transition(self, self.states["/connecting/cooldown"], [self.states["/connecting/connecting"]])
+        _connecting_cooldown_0.setTrigger(Event("_1after"))
+        self.states["/connecting/cooldown"].addTransition(_connecting_cooldown_0)
         
         
         # transition /connected/listening/listen
         # transition /connected/listening/listen
         _connected_listening_listen_0 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/listen"]])
         _connected_listening_listen_0 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/listen"]])
@@ -194,6 +210,18 @@ class HTTPClient(RuntimeClassBase):
         _connected_parsing_wait_for_payload_1.setTrigger(None)
         _connected_parsing_wait_for_payload_1.setTrigger(None)
         _connected_parsing_wait_for_payload_1.setGuard(self._connected_parsing_wait_for_payload_1_guard)
         _connected_parsing_wait_for_payload_1.setGuard(self._connected_parsing_wait_for_payload_1_guard)
         self.states["/connected/parsing/wait_for_payload"].addTransition(_connected_parsing_wait_for_payload_1)
         self.states["/connected/parsing/wait_for_payload"].addTransition(_connected_parsing_wait_for_payload_1)
+        
+        # transition /connecting
+        _connecting_0 = Transition(self, self.states["/connecting"], [self.states["/waiting"]])
+        _connecting_0.setAction(self._connecting_0_exec)
+        _connecting_0.setTrigger(Event("_0after"))
+        self.states["/connecting"].addTransition(_connecting_0)
+    
+    def _connecting_enter(self):
+        self.addTimer(0, self.timeout)
+    
+    def _connecting_exit(self):
+        self.removeTimer(0)
     
     
     def _init_enter(self):
     def _init_enter(self):
         self.ID = str(uuid.uuid4())
         self.ID = str(uuid.uuid4())
@@ -202,12 +230,14 @@ class HTTPClient(RuntimeClassBase):
     def _waiting_enter(self):
     def _waiting_enter(self):
         self.big_step.outputEvent(Event("http_client_initialized", "request_out", []))
         self.big_step.outputEvent(Event("http_client_initialized", "request_out", []))
     
     
-    def _connecting_enter(self):
-        self.addTimer(0, self.timeout)
+    def _connecting_connecting_enter(self):
         self.big_step.outputEvent(Event("connect_socket", "socket_out", [self.socket, self.address]))
         self.big_step.outputEvent(Event("connect_socket", "socket_out", [self.socket, self.address]))
     
     
-    def _connecting_exit(self):
-        self.removeTimer(0)
+    def _connecting_cooldown_enter(self):
+        self.addTimer(1, 0.1)
+    
+    def _connecting_cooldown_exit(self):
+        self.removeTimer(1)
     
     
     def _connected_listening_listen_enter(self):
     def _connected_listening_listen_enter(self):
         self.big_step.outputEvent(Event("recv_socket", "socket_out", [self.socket]))
         self.big_step.outputEvent(Event("recv_socket", "socket_out", [self.socket]))
@@ -215,6 +245,9 @@ class HTTPClient(RuntimeClassBase):
     def _connected_queueing_queueing_enter(self):
     def _connected_queueing_queueing_enter(self):
         pass
         pass
     
     
+    def _connecting_0_exec(self, parameters):
+        self.big_step.outputEvent(Event("http_client_timeout", "request_out", []))
+    
     def _init_0_exec(self, parameters):
     def _init_0_exec(self, parameters):
         socket = parameters[0]
         socket = parameters[0]
         ID = parameters[1]
         ID = parameters[1]
@@ -232,17 +265,14 @@ class HTTPClient(RuntimeClassBase):
         self.timeout = timeout
         self.timeout = timeout
         print("Connecting")
         print("Connecting")
     
     
-    def _connecting_0_exec(self, parameters):
+    def _connecting_connecting_1_exec(self, parameters):
         socket = parameters[0]
         socket = parameters[0]
         self.big_step.outputEvent(Event("http_client_ready", "request_out", []))
         self.big_step.outputEvent(Event("http_client_ready", "request_out", []))
     
     
-    def _connecting_0_guard(self, parameters):
+    def _connecting_connecting_1_guard(self, parameters):
         socket = parameters[0]
         socket = parameters[0]
         return self.socket == socket
         return self.socket == socket
     
     
-    def _connecting_1_exec(self, parameters):
-        self.big_step.outputEvent(Event("http_client_timeout", "request_out", []))
-    
     def _connected_listening_listen_0_exec(self, parameters):
     def _connected_listening_listen_0_exec(self, parameters):
         socket = parameters[0]
         socket = parameters[0]
         data = parameters[1]
         data = parameters[1]

+ 19 - 11
wrappers/http_client.xml

@@ -62,18 +62,26 @@
                 </transition>
                 </transition>
             </state>
             </state>
 
 
-            <state id="connecting">
-                <onentry>
-                    <raise scope="output" event="connect_socket" port="socket_out">
-                        <parameter expr="self.socket"/>
-                        <parameter expr="self.address"/>
-                    </raise>
-                </onentry>
+            <state id="connecting" initial="connecting">
+                <state id="connecting">
+                    <onentry>
+                        <raise scope="output" event="connect_socket" port="socket_out">
+                            <parameter expr="self.socket"/>
+                            <parameter expr="self.address"/>
+                        </raise>
+                    </onentry>
 
 
-                <transition port="socket_in" event="connected_socket" cond="self.socket == socket" target="../connected">
-                    <parameter name="socket"/>
-                    <raise scope="output" port="request_out" event="http_client_ready"/>
-                </transition>
+                    <transition port="socket_in" event="error_socket" target="../cooldown"/>
+
+                    <transition port="socket_in" event="connected_socket" cond="self.socket == socket" target="../../connected">
+                        <parameter name="socket"/>
+                        <raise scope="output" port="request_out" event="http_client_ready"/>
+                    </transition>
+                </state>
+
+                <state id="cooldown">
+                    <transition after="0.1" target="../connecting"/>
+                </state>
 
 
                 <transition after="self.timeout" target="../waiting">
                 <transition after="self.timeout" target="../waiting">
                     <raise scope="output" port="request_out" event="http_client_timeout"/>
                     <raise scope="output" port="request_out" event="http_client_timeout"/>