2014-04-03 14 views
13

Pracuję nad demonem Haskell, który wykorzystuje POSIX fork/exec wraz z mechanizmem blokowania plików. Moje eksperymenty pokazują, że blokady plików nie są dziedziczone podczas wykonywania executeFile z runtime -threaded (zobacz także this thread), bez względu na to, czy używam +RTS -N czy nie. Dlatego chciałbym dodać czek, aby upewnić się, że demon nie jest skompilowany z -threaded. Czy istnieje przenośny sposób na wykrycie tego?Jak wykryć, czy program został skompilowany przy użyciu -readread?

+3

'setNumCapabilities 2' i sprawdź, czy 'getNumCapabilities' zwraca 1? – Yuras

Odpowiedz

13

Jest value w Control.Concurrent za to, na przykład:

module Main (main) where 

import Control.Concurrent 

main :: IO() 
main = print rtsSupportsBoundThreads 

i przetestować:

$ ghc -fforce-recomp Test.hs; ./Test 
[1 of 1] Compiling Main    (Test.hs, Test.o) 
Linking Test ... 
False 
$ ghc -fforce-recomp -threaded Test.hs; ./Test 
[1 of 1] Compiling Main    (Test.hs, Test.o) 
Linking Test ... 
True 

I to jest C-część source code:

HsBool 
rtsSupportsBoundThreads(void) 
{ 
#if defined(THREADED_RTS) 
    return HS_BOOL_TRUE; 
#else 
    return HS_BOOL_FALSE; 
#endif 
} 
1

To jest brudny siekać i może być przenośny, ale nie mogę potwierdzić, że pracuje dla ghc-7.6.3 w systemie Linux:

isThreaded :: IO (Maybe Bool) 
isThreaded = do 
    tid <- forkIO $ threadDelay 1000000 
    yield 
    stat <- threadStatus tid 
    killThread tid 
    case stat of 
    ThreadBlocked BlockedOnMVar -> return (Just True) 
    ThreadBlocked BlockedOnOther -> return (Just False) 
    _       -> return Nothing 

Zobacz BlockedOnOther docstring szczegóły.

Powiązane problemy