如何检测程序是否已使用-threaded编译?

时间:2014-04-03 13:50:20

标签: haskell concurrency process ghc

我正在使用一个Haskell守护进程,它使用POSIX fork / exec和文件锁定机制。我的实验表明,executeFile -threaded运行时期间不会继承文件锁(另请参阅this thread),无论我是否使用+RTS -N。所以我想添加一个检查,以确保守护进程没有使用-threaded进行编译。有可行的方法来检测吗?

2 个答案:

答案 0 :(得分:14)

Control.Concurrent中有value,例如:

module Main (main) where

import Control.Concurrent

main :: IO ()
main = print rtsSupportsBoundThreads

并测试:

$ 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

它是C-part source code

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

答案 1 :(得分:1)

这是一个肮脏的黑客,可能不便携但我可以确认它适用于linux上的ghc-7.6.3:

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

有关详细信息,请参阅BlockedOnOther docstring