runtime/PyroServer.py
branchfix_PLC_runtime_shutdown
changeset 2603 1ffdc62784cf
parent 2492 7dd551ac2fa0
child 2625 e5ce6c4a8672
equal deleted inserted replaced
2602:19dc6b830e7d 2603:1ffdc62784cf
    10 # See COPYING file for copyrights details.
    10 # See COPYING file for copyrights details.
    11 
    11 
    12 from __future__ import absolute_import
    12 from __future__ import absolute_import
    13 from __future__ import print_function
    13 from __future__ import print_function
    14 import sys
    14 import sys
       
    15 import os
    15 
    16 
    16 import Pyro
    17 import Pyro
    17 import Pyro.core as pyro
    18 import Pyro.core as pyro
    18 import runtime
    19 import runtime
    19 from runtime.ServicePublisher import ServicePublisher
    20 from runtime.ServicePublisher import ServicePublisher
    25         self.daemon = None
    26         self.daemon = None
    26         self.servicename = servicename
    27         self.servicename = servicename
    27         self.ip_addr = ip_addr
    28         self.ip_addr = ip_addr
    28         self.port = port
    29         self.port = port
    29         self.servicepublisher = None
    30         self.servicepublisher = None
       
    31         self.piper, self.pipew = None, None
    30 
    32 
    31     def _to_be_published(self):
    33     def _to_be_published(self):
    32         return self.servicename is not None and \
    34         return self.servicename is not None and \
    33                self.ip_addr not in ["", "localhost", "127.0.0.1"]
    35                self.ip_addr not in ["", "localhost", "127.0.0.1"]
    34 
    36 
    58             pyro_obj.delegateTo(runtime.GetPLCObjectSingleton())
    60             pyro_obj.delegateTo(runtime.GetPLCObjectSingleton())
    59 
    61 
    60             self.daemon.connect(pyro_obj, "PLCObject")
    62             self.daemon.connect(pyro_obj, "PLCObject")
    61 
    63 
    62             when_ready()
    64             when_ready()
    63             self.daemon.requestLoop()
    65             self.piper,self.pipew = os.pipe()
    64             self.daemon.sock.close()
    66             self.daemon.requestLoop(others=[self.piper], callback=lambda x:None)
       
    67             self.piper, self.pipew = None, None
       
    68             if hasattr(self,'sock'):
       
    69                 self.daemon.sock.close()
    65         self.Unpublish()
    70         self.Unpublish()
    66 
    71 
    67     def Restart(self):
    72     def Restart(self):
    68         self.daemon.shutdown(True)
    73         self.daemon.shutdown(True)
    69 
    74 
    70     def Quit(self):
    75     def Quit(self):
    71         self.continueloop = False
    76         self.continueloop = False
    72         self.daemon.shutdown(True)
    77         self.daemon.shutdown(True)
       
    78         self.daemon.closedown()
       
    79         if self.pipew is not None:
       
    80             os.write(self.pipew, "goodbye")
    73 
    81 
    74     def Publish(self):
    82     def Publish(self):
    75         self.servicepublisher = ServicePublisher("PYRO")
    83         self.servicepublisher = ServicePublisher("PYRO")
    76         self.servicepublisher.RegisterService(self.servicename,
    84         self.servicepublisher.RegisterService(self.servicename,
    77                                               self.ip_addr, self.port)
    85                                               self.ip_addr, self.port)