Подтвердить что ты не робот

Как определить, была ли программа скомпилирована с использованием -threaded?

Я работаю над демоном Haskell, который использует POSIX fork/exec вместе с механизмом блокировки файлов. Мои эксперименты показывают, что блокировки файлов не наследуются во время executeFile с -threaded runtime (см. Также этот поток), независимо от того, использую ли я +RTS -N или нет. Поэтому я хотел бы добавить чек, чтобы убедиться, что демон не скомпилирован с помощью -threaded. Есть ли переносной способ его обнаружения?

4b9b3361

Ответ 1

В Control.Concurrent для Control.Concurrent есть значение, например:

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 исходный код:

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

Ответ 2

Это грязный хак и может быть не переносимым, но я могу подтвердить, что он работает для ghc-7.6.3 на 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

Подробнее см. BlockedOnOther docstring.