2014-04-03 9 views
13

मैं एक हास्केल डिमन पर काम कर रहा हूं जो फ़ाइल लॉकिंग तंत्र के साथ POSIX कांटा/exec का उपयोग करता है। मेरे प्रयोगों से पता चलता है कि फ़ाइल लॉक executeFile के दौरान विरासत में -threaded रनटाइम के साथ विरासत में नहीं हैं (this thread देखें), इससे कोई फर्क नहीं पड़ता कि मैं +RTS -N का उपयोग करता हूं या नहीं। इसलिए मैं यह सुनिश्चित करने के लिए एक चेक जोड़ना चाहता हूं कि -threaded के साथ डिमन को संकलित नहीं किया गया है। क्या इसका पता लगाने के लिए कोई पोर्टेबल तरीका है?कैसे पता लगाया जाए कि एक प्रोग्राम का उपयोग करके संकलित किया गया है?

+3

'setNumCapabilities 2' और जांचें कि 'getNumCapabilities' रिटर्न 1? – Yuras

उत्तर

13

इस के लिए Control.Concurrent में एक value, उदाहरण के लिए है

$ 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 

और यह सी-भाग source code है:

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

यह एक गंदा हैक है और पोर्टेबल नहीं हो सकता है, लेकिन मैं इस बात की पुष्टि कर सकते हैं यह लिनक्स पर 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 देखें।

module Main (main) where 

import Control.Concurrent 

main :: IO() 
main = print rtsSupportsBoundThreads 

और परीक्षण:

संबंधित मुद्दे

 संबंधित मुद्दे