commit-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[hurd] 87/98: trans/fakeroot: shutdown the translator if the last client


From: Samuel Thibault
Subject: [hurd] 87/98: trans/fakeroot: shutdown the translator if the last client is gone
Date: Tue, 14 Jan 2014 02:00:05 +0000

This is an automated email from the git hooks/post-receive script.

sthibault pushed a commit to branch upstream
in repository hurd.

commit 2d27ccbc105e84c27547a003aec624a3cc3bbd66
Author: Justus Winter <address@hidden>
Date:   Wed Dec 18 17:25:02 2013 +0100

    trans/fakeroot: shutdown the translator if the last client is gone
    
    Previously, fakeroot would not exit if a process outlived the original
    process started by settrans.  This caused bugs like this:
    
    % fakeroot-hurd /bin/sh -c 'sleep 1&' 2>&1 | tee
    <hangs>
    
    Fix this by exiting if the last client of fakeroot goes away.
    
    If noone has a right to any control or protid port, noone can ever
    reacquire any such right. So it is safe to shutdown the fakeroot
    translator in that case.
    
    * trans/fakeroot.c (fakeroot_netfs_release_protid): Shutdown the
    translator if the last protid object is destroyed and no control port
    is around either.
---
 trans/fakeroot.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/trans/fakeroot.c b/trans/fakeroot.c
index 203f2c1..0e0b618 100644
--- a/trans/fakeroot.c
+++ b/trans/fakeroot.c
@@ -1,5 +1,5 @@
 /* fakeroot -- a translator for faking actions that aren't really permitted
-   Copyright (C) 2002, 2003, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2008, 2013 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -184,6 +184,24 @@ fakeroot_netfs_release_protid (void *cookie)
  out:
   pthread_mutex_unlock (&np->lock);
   netfs_release_protid (cookie);
+
+  int cports = ports_count_class (netfs_control_class);
+  int nports = ports_count_class (netfs_protid_class);
+  ports_enable_class (netfs_control_class);
+  ports_enable_class (netfs_protid_class);
+  if (cports == 0 && nports == 0)
+    {
+      /* The last client is gone.  Our job is done.  */
+      error_t err = netfs_shutdown (0);
+      if (! err)
+        exit (EXIT_SUCCESS);
+
+      /* If netfs_shutdown returns EBUSY, we lost a race against
+         fsys_goaway.  Hence we ignore this error.  */
+      if (err != EBUSY)
+        error (1, err, "netfs_shutdown");
+    }
+
   pthread_mutex_unlock (&idport_ihash_lock);
 }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-hurd/hurd.git



reply via email to

[Prev in Thread] Current Thread [Next in Thread]