Ich arbeite an einem Haskell-Daemon, der POSIX fork/exec zusammen mit Dateiverriegelungsmechanismus verwendet. Meine Experimente zeigen, dass Dateisperren nicht während executeFile
mit -threaded
Laufzeit vererbt werden (siehe auch this thread), egal ob ich +RTS -N
oder nicht verwenden. Daher möchte ich einen Check hinzufügen, um sicherzustellen, dass der Daemon nicht mit -threaded
kompiliert wird. Gibt es einen tragbaren Weg, um es zu erkennen?Wie erkennt man, ob ein Programm mit Threaded kompiliert wurde?
13
A
Antwort
13
Es gibt eine value in Control.Concurrent
dafür, zum Beispiel:
module Main (main) where
import Control.Concurrent
main :: IO()
main = print rtsSupportsBoundThreads
Und 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
Und es ist C-Teil source code:
HsBool
rtsSupportsBoundThreads(void)
{
#if defined(THREADED_RTS)
return HS_BOOL_TRUE;
#else
return HS_BOOL_FALSE;
#endif
}
1
Dies ist ein schmutziger Hack und möglicherweise nicht tragbar sein, aber ich kann es unter Linux arbeitet für GHC-7.6.3 bestätigen:
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
Siehe BlockedOnOther docstring für weitere Einzelheiten.
Verwandte Themen
- 1. Wie erkennt man, ob ein PNG mit PhotoShop bearbeitet wurde?
- 2. Django wie erkennt man, ob ein Formularfeld ausgefüllt wurde?
- 3. Wie erkennt man, ob ein falscher Schlüssel in eingegeben wurde?
- 4. Wie kann man feststellen, ob Swift mit Optimization kompiliert wurde?
- 5. Wie überprüft man, ob das Programm mit Debug-Symbolen kompiliert wurde?
- 6. Prüfen, ob OpenCV mit TBB kompiliert wurde
- 7. Wie erkennt man, ob mein Programm in Windows läuft?
- 8. Wie erkennt man, ob Console.In (stdin) umgeleitet wurde?
- 9. Wie kann ich testen, ob ein Perl-Programm aus meiner Testsuite kompiliert wird?
- 10. Wie man erkennt, ob ein Programm dynamischen Versand verwendet, indem man auf die Assembly schaut
- 11. Wie erkennt man ein externes Programm, das Ihren Prozess überwacht?
- 12. Wie erkennt man, ob ein Drucker mit pyqt verbunden ist?
- 13. Wie erkennt man, ob ein Land Sommerzeit mit JavaScript verwendet?
- 14. Wie erkennt man, ob ein Skript auf einem TTY läuft?
- 15. Qt: Wie erkennt man, ob ein Widget ausgewählt ist?
- 16. Wie erkennt man, ob ein Datei-Handle ein Socket ist?
- 17. Wie erkennt man, wenn ein Windows Explorer Fenster geschlossen wurde?
- 18. Wie man die Anzahl der Bilder erkennt, wurde mit Intent.ACTION_OPEN_DOCUMENT
- 19. Wie man erkennt, wenn ein Browser-Tab dupliziert wurde
- 20. Wie erkennt man, ob ein Objekt in JavaScript in Garbage Collection gesammelt wurde?
- 21. Wie dieses Programm kompiliert und erfolgreich ausgeführt wurde?
- 22. Wie erkennt man, ob ein JPEG CMYK-Farbprofil enthält?
- 23. iPhone: Wie erkennt man, ob iTunes spielt?
- 24. Wie erkennt man, ob ein Feld geladen wird?
- 25. Wie erkennt man, welche Option ausgewählt wurde?
- 26. Wie erkennt man, ob ein OpenGL-Kontext Hardware-beschleunigt ist?
- 27. Wie erkennt man, ob ein Mikrofon in Android vorhanden ist?
- 28. Wie erkennt man, ob ein PHP-Skript bereits läuft?
- 29. Wie erkennt man, ob Daydream eingeschaltet ist?
- 30. Ermitteln, ob die .class-Datei mit Debug-Informationen kompiliert wurde?
'setNumCapabilities 2' und überprüfe, ob 'getNumCapabilities' 1 zurückgibt? – Yuras