svghmi/svghmi_server.py
changeset 3647 7c427418396f
parent 3346 3b920d1fe81b
child 3661 62860665fa94
equal deleted inserted replaced
3646:db87744d8900 3647:7c427418396f
     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