zeroconf: notify the Zeroconf threads when hg exits stable
authorNicolas Dumazet <nicdumz.commits@gmail.com>
Sat, 30 Apr 2011 19:36:59 +0200
branchstable
changeset 14104 23fc62e0a960
parent 14051 2b1226693c70
child 14109 3cb1e95676ad
zeroconf: notify the Zeroconf threads when hg exits Zeroconf launches two threads in the background, and they wait on Condition objects to exit. We need to call Zeroconf.close() to release those conditions so that threads can gracefully exit. This means that an interrupt on the hg process will now gracefully propagate to the Zeroconf children, fixing that bug which did not allow us to kill an `hg serve` process.
hgext/zeroconf/__init__.py
--- a/hgext/zeroconf/__init__.py	Fri Apr 29 22:21:13 2011 +0300
+++ b/hgext/zeroconf/__init__.py	Sat Apr 30 19:36:59 2011 +0200
@@ -27,7 +27,7 @@
 import socket, time, os
 
 import Zeroconf
-from mercurial import ui, hg, encoding, util
+from mercurial import ui, hg, encoding, util, dispatch
 from mercurial import extensions
 from mercurial.hgweb import hgweb_mod
 from mercurial.hgweb import hgwebdir_mod
@@ -166,6 +166,18 @@
             return name.encode(encoding.encoding)
     return orig(source)
 
+def cleanupafterdispatch(orig, ui, options, cmd, cmdfunc):
+    try:
+        return orig(ui, options, cmd, cmdfunc)
+    finally:
+        # we need to call close() on the server to notify() the various
+        # threading Conditions and allow the background threads to exit
+        global server
+        if server:
+            server.close()
+
+extensions.wrapfunction(dispatch, '_runcommand', cleanupafterdispatch)
+
 extensions.wrapfunction(ui.ui, 'config', config)
 extensions.wrapfunction(ui.ui, 'configitems', configitems)
 extensions.wrapfunction(hg, 'defaultdest', defaultdest)