From 69c4dda533ea244316dc21ce0d46947336cab475 Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Wed, 21 Jan 2015 12:16:52 +0000 Subject: distbuild: Allow closing a ListenServer This means the socket can be reused again in the same process. --- distbuild/socketsrc.py | 3 +++ distbuild/sockserv.py | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/distbuild/socketsrc.py b/distbuild/socketsrc.py index 15283140..21c99b42 100644 --- a/distbuild/socketsrc.py +++ b/distbuild/socketsrc.py @@ -94,6 +94,9 @@ class ListeningSocketEventSource(EventSource): def stop_accepting(self): self._accepting = False + def close(self): + self.sock.close() + class SocketReadable(object): diff --git a/distbuild/sockserv.py b/distbuild/sockserv.py index 156394e2..964352e7 100644 --- a/distbuild/sockserv.py +++ b/distbuild/sockserv.py @@ -22,6 +22,10 @@ from sm import StateMachine from socketsrc import NewConnection, SocketError, ListeningSocketEventSource +class _Close(object): + pass + + class ListenServer(StateMachine): '''Listen for new connections on a port, send events for them.''' @@ -46,9 +50,12 @@ class ListenServer(StateMachine): # state, source, event_class, new_state, callback ('listening', src, NewConnection, 'listening', self.new_conn), ('listening', src, SocketError, None, self.report_error), + ('listening', self, _Close, None, self._really_close), ] self.add_transitions(spec) + self._src = src + def new_conn(self, event_source, event): logging.debug( 'ListenServer: Creating new %s using %s and %s' % @@ -61,3 +68,9 @@ class ListenServer(StateMachine): def report_error(self, event_source, event): logging.error(str(event)) + def close(self): + self.mainloop.remove_event_source(self._src) + self.mainloop.queue_event(self, _Close()) + + def _really_close(self, event_source, event): + self._src.close() -- cgit v1.2.1