2016-02-06 18 views
8

Ruby's callcc acquisisce la continuazione corrente, che può essere successivamente richiamata per ripristinare il controllo, ma non i dati. Vorrei catturare la continuazione corrente insieme all'immagine corrente della memoria.Checkpoint e ripristino heap in Ruby

Mi sembra che catturare il mucchio non dovrebbe essere molto difficile; Posso contare su ObjectSpace::each_object e ObjectSpace::dump_all, o Marshal.dump, o semplicemente su Object.clone. Tuttavia, non vedo alcun modo diretto per ripristinare l'heap. Idealmente, mi piacerebbe attraversare la mappa object_id -> object, ripristinando la vecchia immagine dell'oggetto per ogni object_id (e aggiungere nuovamente lo object_id se l'oggetto corrispondente era stato GC'd). Non sorprende che non ci sia una API a livello di Ruby che mi permetta di farlo. Mi chiedo se ci sono ganci di basso livello per il GC di Ruby che posso usare.

Qualsiasi aiuto è apprezzato, compresi suggerimenti su approcci alternativi.

risposta

1

Per rispondere alla mia domanda, Process.fork può essere utilizzato per più o meno ottenere l'effetto di cumulo checkpoint e restauro. Ogni volta che devo controllare l'heap, forzo un nuovo processo e permetto al bambino di continuare. Il processo padre ora contiene mucchio checkpoint:

def checkpoint 
    if Process.fork.nil? then # if child, then resume execution immediately 
    return 
    else # if parent, wait for the child to exit. 
    Process.wait 
    end 
    return # Parent now resumes execution from state it was in before forking. 
end 

Quando lo stato è da ripristinare, il processo figlio esce semplicemente:

def restore 
    Process.exit 
end 

Attualmente sto usando questa soluzione, e non hanno riscontrato alcun problema in modo lontano. Modificherò questa risposta se ne trovassi qualcuno in futuro.