inotify: close most file descriptors when autostarting
authorBrendan Cully <brendan@kublai.com>
Mon, 01 Dec 2008 13:38:26 -0800
changeset 7451 fca9947652ce
parent 7450 79d1bb737c16
child 7452 89c516430107
inotify: close most file descriptors when autostarting Otherwise, operations that autostart while talking to an SSH repository prevent SSH stderr from closing normally. This causes hangs at the end of hg clone or hg pull -u.
hgext/inotify/server.py
--- a/hgext/inotify/server.py	Mon Dec 01 14:20:20 2008 +0100
+++ b/hgext/inotify/server.py	Mon Dec 01 13:38:26 2008 -0800
@@ -708,6 +708,26 @@
                 timeobj.handle_timeout()
 
 def start(ui, repo):
+    def closefds(ignore):
+        # (from python bug #1177468)
+        # close all inherited file descriptors
+        # Python 2.4.1 and later use /dev/urandom to seed the random module's RNG
+        # a file descriptor is kept internally as os._urandomfd (created on demand
+        # the first time os.urandom() is called), and should not be closed
+        try:
+            os.urandom(4)
+            urandom_fd = getattr(os, '_urandomfd', None)
+        except AttributeError:
+            urandom_fd = None
+        ignore.append(urandom_fd)
+        for fd in range(3, 256):
+            if fd in ignore:
+                continue
+            try:
+                os.close(fd)
+            except OSError:
+                pass
+
     m = Master(ui, repo)
     sys.stdout.flush()
     sys.stderr.flush()
@@ -716,6 +736,7 @@
     if pid:
         return pid
 
+    closefds([m.server.fileno(), m.watcher.fileno()])
     os.setsid()
 
     fd = os.open('/dev/null', os.O_RDONLY)