diff --git a/interp/wazero/interp.go b/interp/wazero/interp.go index ab47809..59f40e0 100644 --- a/interp/wazero/interp.go +++ b/interp/wazero/interp.go @@ -5,7 +5,9 @@ import ( "errors" "fmt" "io" + "runtime" + "github.com/hybridgroup/mechanoid" "github.com/hybridgroup/mechanoid/engine" "github.com/orsinium-labs/wypes" "github.com/tetratelabs/wazero" @@ -23,6 +25,12 @@ func (i *Interpreter) Name() string { } func (i *Interpreter) Init() error { + return i.init() +} + +func (i *Interpreter) init() error { + mechanoid.DebugMemory("Interpreter Init") + ctx := context.Background() conf := wazero.NewRuntimeConfigInterpreter() conf = conf.WithDebugInfoEnabled(false) @@ -32,6 +40,8 @@ func (i *Interpreter) Init() error { } func (i *Interpreter) SetModules(modules wypes.Modules) error { + mechanoid.Log("Registering host modules...") + if i.modules == nil { i.modules = modules return nil @@ -50,6 +60,14 @@ func (i *Interpreter) SetModules(modules wypes.Modules) error { } func (i *Interpreter) Load(code engine.Reader) error { + if i.runtime == nil { + if err := i.init(); err != nil { + return fmt.Errorf("init wazero runtime: %v", err) + } + } + + mechanoid.DebugMemory("Interpreter Load") + err := i.defineModules() if err != nil { return fmt.Errorf("register wazero host modules: %v", err) @@ -115,6 +133,8 @@ func wazeroAdaptHostFunc(hf wypes.HostFunc, refs wypes.Refs) api.GoModuleFunctio } func (i *Interpreter) Run() (engine.Instance, error) { + mechanoid.DebugMemory("Interpreter Run") + var err error ctx := context.Background() init := i.module.ExportedFunction("_initialize") @@ -128,9 +148,17 @@ func (i *Interpreter) Run() (engine.Instance, error) { } func (i *Interpreter) Halt() error { + mechanoid.DebugMemory("Interpreter Halt") + ctx := context.Background() err := i.runtime.Close(ctx) i.runtime = nil + i.module = nil + + // force a garbage collection to free memory + runtime.GC() + mechanoid.DebugMemory("Interpreter Halt after GC") + return err }