diff --git a/python/helpers/pydev/_pydev_comm/rpc.py b/python/helpers/pydev/_pydev_comm/rpc.py index e79dc26b842e..1d893f782255 100644 --- a/python/helpers/pydev/_pydev_comm/rpc.py +++ b/python/helpers/pydev/_pydev_comm/rpc.py @@ -1,9 +1,9 @@ import socket import threading +from _pydev_comm.server import TSingleThreadedServer from _pydev_comm.transport import TSyncClient, open_transports_as_client, _create_client_server_transports from _shaded_thriftpy.protocol import TBinaryProtocolFactory -from _shaded_thriftpy.server import TThreadedServer from _shaded_thriftpy.thrift import TProcessor @@ -21,15 +21,8 @@ def start_rpc_server(server_transport, server_service, server_handler, proto_fac strict_write=False)): # setup server processor = TProcessor(server_service, server_handler) - - # todo as `server.serve()` is excessive we may want to get rid of `server` as `TThreadedServer` - server = TThreadedServer(processor, server_transport, iprot_factory=proto_factory) - - client = server.trans.accept() - t = threading.Thread(target=server.handle, args=(client,)) - t.setDaemon(True) - t.start() - + server = TSingleThreadedServer(processor, server_transport, daemon=True, iprot_factory=proto_factory) + server.serve() return server @@ -61,11 +54,5 @@ def _rpc_server(server_socket, server_service, client_service, server_handler_fa # setup server processor = TProcessor(server_service, server_handler) - - # todo as `server.serve()` is excessive we may want to get rid of `server` as `TThreadedServer` - server = TThreadedServer(processor, server_transport, iprot_factory=proto_factory) - - client = server.trans.accept() - t = threading.Thread(target=server.handle, args=(client,)) - t.setDaemon(True) - t.start() + server = TSingleThreadedServer(processor, server_transport, daemon=True, iprot_factory=proto_factory) + server.serve() diff --git a/python/helpers/pydev/_pydev_comm/server.py b/python/helpers/pydev/_pydev_comm/server.py new file mode 100644 index 000000000000..98333854d528 --- /dev/null +++ b/python/helpers/pydev/_pydev_comm/server.py @@ -0,0 +1,41 @@ +import threading +import traceback + +from _shaded_thriftpy.server import TServer +from _shaded_thriftpy.transport import TTransportException + + +class TSingleThreadedServer(TServer): + """Server that accepts a single connection and spawns a thread to handle it.""" + + def __init__(self, *args, **kwargs): + self.daemon = kwargs.pop("daemon", False) + TServer.__init__(self, *args, **kwargs) + + def serve(self): + self.trans.listen() + try: + client = self.trans.accept() + t = threading.Thread(target=self.handle, args=(client,)) + t.setDaemon(self.daemon) + t.start() + except KeyboardInterrupt: + raise + except Exception as x: + traceback.print_exc() + + def handle(self, client): + itrans = self.itrans_factory.get_transport(client) + otrans = self.otrans_factory.get_transport(client) + iprot = self.iprot_factory.get_protocol(itrans) + oprot = self.oprot_factory.get_protocol(otrans) + try: + while True: + self.processor.process(iprot, oprot) + except TTransportException: + pass + except Exception as x: + traceback.print_exc() + + itrans.close() + otrans.close()