guix-commits
[Top][All Lists]
Advanced

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

[shepherd] 01/01: service: In 'exec-command', close open ports before 'e


From: Ludovic Courtès
Subject: [shepherd] 01/01: service: In 'exec-command', close open ports before 'execl'.
Date: Sun, 3 Dec 2017 16:32:04 -0500 (EST)

civodul pushed a commit to branch master
in repository shepherd.

commit 3e346a2a84b099766ea8a3a4a4549f6172483062
Author: Ludovic Courtès <address@hidden>
Date:   Sun Dec 3 22:30:03 2017 +0100

    service: In 'exec-command', close open ports before 'execl'.
    
    This gets rid of annoying "Bad file descriptor" warnings from shepherd.
    
    * modules/shepherd/service.scm (exec-command): In 'loop', invoke
    'close-port' and the ports returned by (fdes->ports i).
---
 modules/shepherd/service.scm | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm
index b2d8bc5..0ad28a0 100644
--- a/modules/shepherd/service.scm
+++ b/modules/shepherd/service.scm
@@ -1,5 +1,5 @@
 ;; service.scm -- Representation of services.
-;; Copyright (C) 2013, 2014, 2015, 2016 Ludovic Courtès <address@hidden>
+;; Copyright (C) 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <address@hidden>
 ;; Copyright (C) 2002, 2003 Wolfgang Järling <address@hidden>
 ;; Copyright (C) 2014 Alex Sassmannshausen <address@hidden>
 ;; Copyright (C) 2016 Alex Kost <address@hidden>
@@ -744,6 +744,14 @@ false."
 
        (let loop ((i 3))
          (when (< i max-fd)
+           ;; First try to close any ports associated with file descriptor I.
+           ;; Otherwise the finalization thread might get around to closing
+           ;; those ports eventually, which will raise an EBADF exception (on
+           ;; 2.2), leading to messages like "error in the finalization
+           ;; thread: Bad file descriptor".
+           (for-each (lambda (port)
+                       (catch-system-error (close-port port)))
+                     (fdes->ports i))
            (catch-system-error (close-fdes i))
            (loop (+ i 1)))))
 



reply via email to

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