2015-02-11 16 views
10

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?

+0

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

+0

@Cirdec Cosa significa "add"? –

+5

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

risposta

2

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.

+0

Sembra che tu abbia un "rispondi alle vecchie domande". Qualche ragione in particolare, o sei solo dell'umore? – dfeuer

+2

@dfeuer insonnia e una compulsione occasionale che mi travolge per cercare di abbassare il nostro rapporto domande senza risposta. – sclv

+0

@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? –

Problemi correlati