testsuite timeouts

Ian Lynagh <[email protected]>
Newsgroups gmane.comp.lang.haskell.cvs.fptools
Message-ID <20050406121018.GA19110__44737.994837533$1112789329$gmane$org@matrix.chaos.earth.li>
Hi,

The timeout program in the testsuite doesn't seem to work correctly for
me. If I run the okeefe_neural test with a timeout of 10s then the tests
are aborted, but the ghc-6.5 processes aren't killed, leaving me with 7
of them working away when it finishes.

I've attached a replacement that does work for me. It makes a new
process group for the test, and kills that group rather than a single
process when a timeout happens. Annoyingly I can't seem to write it
without resorting to some C - in order to run createSession in a fork I
have to get a ProcessID, but waitForProcess wants a ProcessHandle. I
can't see a way to convert one to the other, nor a waitpid wrapper
working on ProcessIDs.

I don't think this will work on Windows, but driver/testlib.py doesn't
use it on Windows anyway, so this doesn't look like a problem.


Is it OK to commit this?


Thanks
Ian

_______________________________________________
Cvs-fptools mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-fptools
Makefile (text/plain, 199 B)
TOP = ..
include $(TOP)/mk/boilerplate.mk

HC = $(GHC_INPLACE)
MKDEPENDHS = $(GHC_INPLACE)
SRC_HC_OPTS += -threaded -package unix

HS_PROG = timeout

boot :: $(HS_PROG)

include $(TOP)/mk/target.mk
cbits.c (text/x-csrc, 206 B)
#include "timeout.h"

int mywaitpid(pid_t pid) {
    int status;
    waitpid(pid, &status, 0);
    if (WIFEXITED(status)) {
        return WEXITSTATUS(status);
    }
    else {
        return 99;
    }
}
timeout.h (text/x-chdr, 74 B)
#include <sys/types.h>
#include <sys/wait.h>

int mywaitpid(pid_t pid);
timeout.hs (text/plain, 1.1 KB)
{-# OPTIONS_GHC -fffi #-}

import Control.Concurrent
import System.Environment
import System.Process
import System.Exit

import Foreign.C.Types
import System.Posix.Signals
import System.Posix.Types
import System.IO
import System.Posix.Process (forkProcess, createSession)
import System.Cmd (system)

main = do
  args <- getArgs
  case args of 
    [secs,cmd] -> do
        p <- forkProcess $ do createSession
                              r <- system cmd
                              exitWith r
        m <- newEmptyMVar
        forkIO (do threadDelay (read secs * 1000000)
                   putMVar m Nothing
               )
        forkIO (do r <- waitpid p
                   putMVar m (Just (fromIntegral r)))
        r <- takeMVar m
        case r of
          Nothing -> do signalProcessGroup sigTERM p
                        exitWith (ExitFailure 99)
          Just 0 -> exitWith ExitSuccess
          Just r -> exitWith (ExitFailure r)
    _other -> do hPutStrLn stderr "timeout: bad arguments"
                 exitWith (ExitFailure 1)

foreign import ccall "timeout.h mywaitpid" waitpid :: CPid -> IO CInt
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.