2014-04-03 20 views
13

Tôi đang làm việc trên một daemon Haskell sử dụng POSIX fork/exec cùng với cơ chế khóa tệp. Thử nghiệm của tôi cho thấy khóa tệp không được kế thừa trong thời gian executeFile với thời gian hoạt động -threaded (xem thêm this thread), cho dù tôi có sử dụng +RTS -N hay không. Vì vậy, tôi muốn thêm một kiểm tra để chắc chắn rằng daemon không được biên dịch với -threaded. Có cách nào để phát hiện ra nó không?Làm thế nào để phát hiện xem một chương trình đã được biên dịch bằng cách sử dụng -readed?

+3

'setNumCapabilities 2' và kiểm tra rằng 'getNumCapabilities' trả về 1? – Yuras

Trả lời

13

Có một value trong Control.Concurrent cho điều này, ví dụ:

module Main (main) where 

import Control.Concurrent 

main :: IO() 
main = print rtsSupportsBoundThreads 

Và kiểm tra:

$ 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 

Và đó là C-phần source code:

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

Đây là một bẩn hack và có thể không di động nhưng tôi có thể khẳng định nó hoạt động cho GHC-7.6.3 trên 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 

Xem BlockedOnOther docstring để biết chi tiết.

Các vấn đề liên quan