74
74
self._stopped = threading.Event()
75
75
self.root_client_path = root_client_path
77
def serve(self, thread_name_suffix=''):
78
78
self._should_terminate = False
79
79
# for hooks we are letting code know that a server has started (and
116
116
if e.args[0] != errno.EBADF:
117
117
trace.warning("listening socket error: %s", e)
119
self.serve_conn(conn)
119
self.serve_conn(conn, thread_name_suffix)
120
120
except KeyboardInterrupt:
121
121
# dont log when CTRL-C'd.
139
139
"""Return the url of the server"""
140
140
return "bzr://%s:%d/" % self._sockname
142
def serve_conn(self, conn):
142
def serve_conn(self, conn, thread_name_suffix):
143
143
# For WIN32, where the timeout value from the listening socket
144
144
# propogates to the newly accepted socket.
145
145
conn.setblocking(True)
146
146
conn.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
147
147
handler = SmartServerSocketStreamMedium(
148
148
conn, self.backing_transport, self.root_client_path)
149
connection_thread = threading.Thread(None, handler.serve, name='smart-server-child')
149
thread_name = 'smart-server-child' + thread_name_suffix
150
connection_thread = threading.Thread(
151
None, handler.serve, name=thread_name)
150
152
connection_thread.setDaemon(True)
151
153
connection_thread.start()
153
def start_background_thread(self):
155
def start_background_thread(self, thread_name_suffix=''):
154
156
self._started.clear()
155
157
self._server_thread = threading.Thread(None,
158
self.serve, args=(thread_name_suffix,),
157
159
name='server-' + self.get_url())
158
160
self._server_thread.setDaemon(True)
159
161
self._server_thread.start()
213
215
This server is backed by the process's cwd.
218
def __init__(self, thread_name_suffix=''):
217
219
SmartTCPServer.__init__(self, None)
218
220
self.client_path_extra = None
221
self.thread_name_suffix = thread_name_suffix
220
223
def get_backing_transport(self, backing_transport_server):
221
224
"""Get a backing transport from a server we are decorating."""
246
249
self.backing_transport = transport.get_transport(
247
250
self.chroot_server.get_url())
248
251
self.root_client_path = self.client_path_extra = client_path_extra
249
self.start_background_thread()
252
self.start_background_thread(self.thread_name_suffix)
251
254
def tearDown(self):
252
255
self.stop_background_thread()