2014-04-03 15 views
13

Ich arbeite an einem Haskell-Daemon, der POSIX fork/exec zusammen mit Dateiverriegelungsmechanismus verwendet. Meine Experimente zeigen, dass Dateisperren nicht während executeFile mit -threaded Laufzeit vererbt werden (siehe auch this thread), egal ob ich +RTS -N oder nicht verwenden. Daher möchte ich einen Check hinzufügen, um sicherzustellen, dass der Daemon nicht mit -threaded kompiliert wird. Gibt es einen tragbaren Weg, um es zu erkennen?Wie erkennt man, ob ein Programm mit Threaded kompiliert wurde?

+3

'setNumCapabilities 2' und überprüfe, ob 'getNumCapabilities' 1 zurückgibt? – Yuras

Antwort

13

Es gibt eine value in Control.Concurrent dafür, zum Beispiel:

module Main (main) where 

import Control.Concurrent 

main :: IO() 
main = print rtsSupportsBoundThreads 

Und Test:

$ 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 

Und es ist C-Teil source code:

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

Dies ist ein schmutziger Hack und möglicherweise nicht tragbar sein, aber ich kann es unter Linux arbeitet für GHC-7.6.3 bestätigen:

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 

Siehe BlockedOnOther docstring für weitere Einzelheiten.

Verwandte Themen