diff options
author | Sam Thursfield <sam.thursfield@codethink.co.uk> | 2015-01-21 12:16:52 +0000 |
---|---|---|
committer | Sam Thursfield <sam.thursfield@codethink.co.uk> | 2015-01-21 12:57:43 +0000 |
commit | 69c4dda533ea244316dc21ce0d46947336cab475 (patch) | |
tree | 821e803b7766a868bd93251818941f3b8c51bb7e | |
parent | 3e710475a46195947153b9d430989ad37529d026 (diff) | |
download | morph-69c4dda533ea244316dc21ce0d46947336cab475.tar.gz |
distbuild: Allow closing a ListenServer
This means the socket can be reused again in the same process.
-rw-r--r-- | distbuild/socketsrc.py | 3 | ||||
-rw-r--r-- | distbuild/sockserv.py | 13 |
2 files changed, 16 insertions, 0 deletions
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() |