2014-04-03 35 views
13

Dosya kilitleme mekanizması ile birlikte POSIX fork/exec kullanan bir Haskell daemon üzerinde çalışıyorum. Benim denemelerim,çalışma zamanı (this thread) ile executeFile sırasında dosya kilitlerinin miras alınmadığını, +RTS -N kullanıp kullanmadığımı gösterir. Bu yüzden deemonun -threaded ile derlenmediğinden emin olmak için bir kontrol eklemek istiyorum. Bunu tespit etmek için taşınabilir bir yolu var mı?Bir programın -dreaded kullanılarak derlenmesi nasıl algılanır?

+3

'setNumCapabilities 2'FC ve 'getNumCapabilities' 1 döndürdüğünü kontrol edin? – Yuras

cevap

13

Orada örneğin, bunun için Control.Concurrent bir value olduğunu

$ 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 

Ve C parçalı source code var:

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

Bu kirli kesmek ve taşınabilir değil olabilir ama linux üzerinde ghc-7.6.3 için çalışır onaylayabilirsiniz:

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 

Detaylar için BlockedOnOther docstring bakınız.

module Main (main) where 

import Control.Concurrent 

main :: IO() 
main = print rtsSupportsBoundThreads 

Ve testin:

İlgili konular