equal
deleted
inserted
replaced
6 # See COPYING file for copyrights details. |
6 # See COPYING file for copyrights details. |
7 |
7 |
8 from __future__ import absolute_import |
8 from __future__ import absolute_import |
9 import errno |
9 import errno |
10 from threading import RLock, Timer |
10 from threading import RLock, Timer |
|
11 import os, time |
11 |
12 |
12 try: |
13 try: |
13 from runtime.spawn_subprocess import Popen |
14 from runtime.spawn_subprocess import Popen |
14 except ImportError: |
15 except ImportError: |
15 from subprocess import Popen |
16 from subprocess import Popen |
20 from twisted.web.static import File |
21 from twisted.web.static import File |
21 |
22 |
22 from autobahn.twisted.websocket import WebSocketServerFactory, WebSocketServerProtocol |
23 from autobahn.twisted.websocket import WebSocketServerFactory, WebSocketServerProtocol |
23 from autobahn.websocket.protocol import WebSocketProtocol |
24 from autobahn.websocket.protocol import WebSocketProtocol |
24 from autobahn.twisted.resource import WebSocketResource |
25 from autobahn.twisted.resource import WebSocketResource |
|
26 |
|
27 from runtime.loglevels import LogLevelsDict |
|
28 from runtime import GetPLCObjectSingleton |
25 |
29 |
26 max_svghmi_sessions = None |
30 max_svghmi_sessions = None |
27 svghmi_watchdog = None |
31 svghmi_watchdog = None |
28 |
32 |
29 |
33 |
297 request.setHeader(b"Cache-Control", b"no-cache, no-store") |
301 request.setHeader(b"Cache-Control", b"no-cache, no-store") |
298 return File.render_GET(self, request) |
302 return File.render_GET(self, request) |
299 render_HEAD = render_GET |
303 render_HEAD = render_GET |
300 |
304 |
301 |
305 |
|
306 def waitpid_timeout(proc, helpstr="", timeout = 3): |
|
307 if proc is None: |
|
308 return |
|
309 def waitpid_timeout_loop(pid=proc.pid, timeout = timeout): |
|
310 try: |
|
311 while os.waitpid(pid,os.WNOHANG) == (0,0): |
|
312 time.sleep(1) |
|
313 timeout = timeout - 1 |
|
314 if not timeout: |
|
315 GetPLCObjectSingleton().LogMessage( |
|
316 LogLevelsDict["WARNING"], |
|
317 "Timeout waiting for {} PID: {}".format(helpstr, str(pid))) |
|
318 break |
|
319 except OSError: |
|
320 # workaround exception "OSError: [Errno 10] No child processes" |
|
321 pass |
|
322 Thread(target=waitpid_timeout_loop, name="Zombie hunter").start() |
|
323 |