1
0
mirror of https://github.com/xmonad/xmonad-contrib.git synced 2025-08-13 11:16:01 -07:00

Use doubleFork instead of manual double fork, or buggy single fork.

This fixes showWName because Timer was leaking zombie processes.
You should update xmonad, since doubleFork was not exported.
This commit is contained in:
nicolas.pouillard
2008-01-14 20:28:33 +00:00
parent 73502fbbdf
commit c7a64a99ce
2 changed files with 16 additions and 29 deletions
XMonad/Util

@@ -29,11 +29,9 @@ module XMonad.Util.Run (
) where
import System.Posix.IO
import System.Posix.Process (createSession, forkProcess, executeFile,
getProcessStatus)
import System.Posix.Process (executeFile)
import Control.Concurrent (threadDelay)
import Control.Exception (try)
import System.Exit (ExitCode(ExitSuccess), exitWith)
import System.IO
import System.Process (runInteractiveProcess, waitForProcess)
import XMonad
@@ -67,22 +65,16 @@ runProcessWithInput cmd args input = do
-- | Wait is in us
runProcessWithInputAndWait :: FilePath -> [String] -> String -> Int -> IO ()
runProcessWithInputAndWait cmd args input timeout = do
pid <- forkProcess $ do
forkProcess $ do -- double fork it over to init
createSession
(pin, pout, perr, ph) <- runInteractiveProcess cmd args Nothing Nothing
hPutStr pin input
hFlush pin
threadDelay timeout
hClose pin
hClose pout
hClose perr
waitForProcess ph
return ()
exitWith ExitSuccess
return ()
getProcessStatus True False pid
return ()
doubleFork $ do
(pin, pout, perr, ph) <- runInteractiveProcess cmd args Nothing Nothing
hPutStr pin input
hFlush pin
threadDelay timeout
hClose pin
hClose pout
hClose perr
waitForProcess ph
return ()
-- | Multiplies by ONE MILLION, for use with
-- 'runProcessWithInputAndWait'.
@@ -113,7 +105,7 @@ seconds = fromEnum . (* 1000000)
-- interpolation, whereas the safeSpawn example can be safe because
-- Firefox doesn't need any arguments if it is just being started.
safeSpawn :: MonadIO m => FilePath -> String -> m ()
safeSpawn prog arg = liftIO (try (forkProcess $ executeFile prog True [arg] Nothing) >> return ())
safeSpawn prog arg = liftIO (try (doubleFork $ executeFile prog True [arg] Nothing) >> return ())
unsafeSpawn :: MonadIO m => String -> m ()
unsafeSpawn = spawn
@@ -134,11 +126,7 @@ spawnPipe x = do
setFdOption wr CloseOnExec True
h <- fdToHandle wr
hSetBuffering h LineBuffering
pid <- forkProcess $ do
forkProcess $ do
dupTo rd stdInput
createSession
executeFile "/bin/sh" False ["-c", x] Nothing
exitWith ExitSuccess
getProcessStatus True False pid
doubleFork $ do
dupTo rd stdInput
executeFile "/bin/sh" False ["-c", x] Nothing
return h

@@ -24,7 +24,6 @@ import Control.Applicative
import Control.Concurrent
import Data.Unique
import System.Environment
import System.Posix.Process
-- $usage
-- This module can be used to setup a timer to handle deferred events.
@@ -40,7 +39,7 @@ startTimer s = io $ do
d <- openDisplay dpy
rw <- rootWindow d $ defaultScreen d
u <- hashUnique <$> newUnique
forkProcess $ do
doubleFork $ do
threadDelay (fromEnum $ s * 1000000)
a <- internAtom d "XMONAD_TIMER" False
allocaXEvent $ \e -> do