How to detect if a program has been compiled using -threaded?

后端 未结 2 1206
清酒与你
清酒与你 2021-01-11 11:17

I\'m working on a Haskell daemon that uses POSIX fork/exec together with file locking mechanism. My experiments show that file locks aren\'t inherited during executeFi

相关标签:
2条回答
  • 2021-01-11 11:40

    This is a dirty hack and might be not portable but I can confirm it works for ghc-7.6.3 on 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
    

    See BlockedOnOther docstring for details.

    0 讨论(0)
  • 2021-01-11 11:42

    There is a value in Control.Concurrent for this, for example:

    module Main (main) where
    
    import Control.Concurrent
    
    main :: IO ()
    main = print rtsSupportsBoundThreads
    

    And 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
    

    And it's C-part source code:

    HsBool
    rtsSupportsBoundThreads(void)
    {
    #if defined(THREADED_RTS)
      return HS_BOOL_TRUE;
    #else
      return HS_BOOL_FALSE;
    #endif
    }
    
    0 讨论(0)
提交回复
热议问题