summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam.thursfield@codethink.co.uk>2015-01-21 12:16:52 +0000
committerSam Thursfield <sam.thursfield@codethink.co.uk>2015-01-21 12:57:43 +0000
commit69c4dda533ea244316dc21ce0d46947336cab475 (patch)
tree821e803b7766a868bd93251818941f3b8c51bb7e
parent3e710475a46195947153b9d430989ad37529d026 (diff)
downloadmorph-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.py3
-rw-r--r--distbuild/sockserv.py13
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()