Quando si esporta una funzione Haskell da chiamare da C, quando viene raccolta la spazzatura di Haskell? Se C possiede main
allora non c'è modo di prevedere la prossima chiamata in Haskell. Questa domanda è particolarmente pertinente quando si esegue Haskell a thread singolo o senza GC parallelo.Quando viene eseguito il Garbage Collector quando si chiama Haskell da C?
risposta
Quando si inizializza il runtime ghc
, si può passare RTS bandiere ad esso tramite argc e argv like so:
RtsConfig conf = defaultRtsConfig;
conf.rts_opts_enabled = RtsOptsAll;
hs_init_ghc(&argc, &argv, conf);
Ciò consente set options, ad esempio fissare una dimensione heap massima minore o utilizzare un algoritmo di compattazione nella scuola materna per ridurre ulteriormente l'allocazione. Inoltre, si noti che c'è un GC inattivo il cui intervallo può essere impostato (o disabilitato) e, se si collega il runtime threadato, questo dovrebbe essere eseguito indipendentemente dal fatto che si possa mai tornare a una chiamata Haskell.
Edit: Non ho effettivamente eseguito la sperimentazione per verificare quanto segue, ma se guardiamo alla source of hs_init_ghc vediamo che inizializza gestori di segnale, che dovrebbe includere la timer handlers che rispondono a SIGVTALRM
e in effetti si inizia anche la Ora, che chiama (su POSIX) timer_create
che dovrebbe inviare quei segnali a intervalli regolari. A sua volta, questo periodicamente dovrebbe "svegliare" l'RTS indipendentemente dal fatto che qualcosa stia succedendo, il che a sua volta dovrebbe significare che eseguirà GC inattivo indipendentemente dal fatto che il sistema restituisca o meno Haskell da C. Ma di nuovo, ho letto solo il codice e commento, non testato da solo.
Sembra che tu abbia un "rispondi alle vecchie domande". Qualche ragione in particolare, o sei solo dell'umore? – dfeuer
@dfeuer insonnia e una compulsione occasionale che mi travolge per cercare di abbassare il nostro rapporto domande senza risposta. – sclv
@sclv Sono quasi pronto ad accettare questa risposta, ma la carne della mia domanda rimane ancora: quando esegui il GC? E 'solo "quando ci sono allocazioni" sul lato Haskell o qualcosa del genere? –
- 1. Quando viene eseguito il garbage collector .net?
- 2. Garbage collector CMS: quando viene eseguito?
- 3. Il garbage collector chiama Dispose()?
- 4. Quando il garbage collector raccoglierà un Singleton?
- 5. Il sistema Unix fork() chiama quando viene eseguito?
- 6. Eclipse: Pulsante Garbage Collector
- 7. e il garbage collector Go
- 8. Come disabilitare il garbage collector Java?
- 9. Perché viene chiamato il distruttore quando il garbage collector CPython è disabilitato?
- 10. Garbage Collector di monitoraggio in C#
- 11. Perché disabilitare il garbage collector?
- 12. quando eseguo manualmente il garbage collector, come posso sapere quando è completato?
- 13. Quando viene eseguito esattamente `componentDidMount`?
- 14. .NET Garbage Collector mystery
- 15. Più garbage collector in java
- 16. MS Excel si blocca quando viene eseguito il codice vba
- 17. System.IO.IOException quando si chiama System.Console.WindowWidth
- 18. System.AccessViolationException quando si chiama C++ dll
- 19. In che modo il Garbage Collector decide quando uccidere oggetti tenuti da WeakReferences?
- 20. Perché ReflectionOnlyAssemblyResolve non viene eseguito quando si prova a Assembly.ReflectionOnlyLoad?
- 21. VBA Garbage Collector Dettagli
- 22. Python: comportamento del garbage collector
- 23. C# e. Net prestazioni del garbage collector
- 24. LogManager e Garbage Collector
- 25. ActivityNotFoundException quando si chiama Intent.ACTION_CALL
- 26. ffmpeg si blocca quando viene eseguito in background
- 27. Cosa viene eseguito in PowerShell quando si digita "alias"?
- 28. NullReferenceException quando si chiama NavigationContext
- 29. Come sapere quando si disabilitaModalViewControllerAnimated viene avviato e anche quando viene eseguito?
- 30. Quando esattamente si chiama il distruttore in C++
Se sei preoccupato per un'esportazione o esportazione straniera specifica potresti aggiungere un ['performGC'] (http://hackage.haskell.org/package/base-4.7.0.2/docs/System-Mem.html #v: performGC) prima di restituire l'addr'. – Cirdec
@Cirdec Cosa significa "add"? –
IIRC, la garbage collection ha la possibilità di essere eseguita ogni volta che il codice Haskell assegna qualcosa. Se il tuo programma chiama spesso in Haskell, questo dovrebbe essere sufficiente. Altrimenti, se ti preoccupi che Haskell conservi memoria per troppo tempo, puoi attivare un GC chiamando 'performGC' da C. – chi