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?
13
A
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.
'setNumCapabilities 2' und überprüfe, ob 'getNumCapabilities' 1 zurückgibt? – Yuras