From 5a3fdef3c53075928a08fccccf0a1b5372bf94b9 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 11 Jul 2023 12:30:09 +0100 Subject: [PATCH] wazero v1.3.0. --- go.mod | 2 +- go.sum | 4 +- internal/util/handle.go | 15 +++---- sqlite.go | 55 ++++++++++--------------- vfs/lock_test.go | 3 +- vfs/tests/mptest/mptest_test.go | 21 ++++------ vfs/tests/speedtest1/speedtest1_test.go | 3 +- vfs/vfs_test.go | 6 +-- 8 files changed, 43 insertions(+), 66 deletions(-) diff --git a/go.mod b/go.mod index 97e463f..d678870 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/ncruces/julianday v0.1.5 github.com/psanford/httpreadat v0.1.0 - github.com/tetratelabs/wazero v1.2.1 + github.com/tetratelabs/wazero v1.3.0 golang.org/x/sync v0.3.0 golang.org/x/sys v0.10.0 golang.org/x/text v0.11.0 diff --git a/go.sum b/go.sum index fbf5690..6d68a8c 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ github.com/ncruces/julianday v0.1.5 h1:hDJ9ejiMp3DHsoZ5KW4c1lwfMjbARS7u/gbYcd0FB github.com/ncruces/julianday v0.1.5/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= -github.com/tetratelabs/wazero v1.2.1 h1:J4X2hrGzJvt+wqltuvcSjHQ7ujQxA9gb6PeMs4qlUWs= -github.com/tetratelabs/wazero v1.2.1/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= +github.com/tetratelabs/wazero v1.3.0 h1:nqw7zCldxE06B8zSZAY0ACrR9OH5QCcPwYmYlwtcwtE= +github.com/tetratelabs/wazero v1.3.0/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= diff --git a/internal/util/handle.go b/internal/util/handle.go index a1e5675..2309ed4 100644 --- a/internal/util/handle.go +++ b/internal/util/handle.go @@ -3,6 +3,8 @@ package util import ( "context" "io" + + "github.com/tetratelabs/wazero/experimental" ) type handleKey struct{} @@ -11,22 +13,21 @@ type handleState struct { empty int } -func NewContext(ctx context.Context) (context.Context, io.Closer) { +func NewContext(ctx context.Context) context.Context { state := new(handleState) - return context.WithValue(ctx, handleKey{}, state), state + ctx = experimental.WithCloseNotifier(ctx, state) + ctx = context.WithValue(ctx, handleKey{}, state) + return ctx } -func (s *handleState) Close() (err error) { +func (s *handleState) CloseNotify(ctx context.Context, exitCode uint32) { for _, h := range s.handles { if c, ok := h.(io.Closer); ok { - if e := c.Close(); err == nil { - err = e - } + c.Close() } } s.handles = nil s.empty = 0 - return err } func GetHandle(ctx context.Context, id uint32) any { diff --git a/sqlite.go b/sqlite.go index 115adf7..f442a72 100644 --- a/sqlite.go +++ b/sqlite.go @@ -3,7 +3,6 @@ package sqlite3 import ( "context" - "io" "math" "os" "sync" @@ -32,23 +31,6 @@ var instance struct { once sync.Once } -func instantiateSQLite() (*sqlite, error) { - ctx := context.Background() - - instance.once.Do(compileSQLite) - if instance.err != nil { - return nil, instance.err - } - - cfg := wazero.NewModuleConfig() - - mod, err := instance.runtime.InstantiateModule(ctx, instance.compiled, cfg) - if err != nil { - return nil, err - } - return newSQLite(mod) -} - func compileSQLite() { ctx := context.Background() instance.runtime = wazero.NewRuntime(ctx) @@ -77,23 +59,32 @@ func compileSQLite() { } type sqlite struct { - ctx context.Context - mod api.Module - closer io.Closer - api sqliteAPI - stack [8]uint64 + ctx context.Context + mod api.Module + api sqliteAPI + stack [8]uint64 } type sqliteKey struct{} -func newSQLite(mod api.Module) (sqlt *sqlite, err error) { +func instantiateSQLite() (sqlt *sqlite, err error) { + instance.once.Do(compileSQLite) + if instance.err != nil { + return nil, instance.err + } + sqlt = new(sqlite) - sqlt.ctx, sqlt.closer = util.NewContext(context.Background()) + sqlt.ctx = util.NewContext(context.Background()) sqlt.ctx = context.WithValue(sqlt.ctx, sqliteKey{}, sqlt) - sqlt.mod = mod + + sqlt.mod, err = instance.runtime.InstantiateModule(sqlt.ctx, + instance.compiled, wazero.NewModuleConfig()) + if err != nil { + return nil, err + } getFun := func(name string) api.Function { - f := mod.ExportedFunction(name) + f := sqlt.mod.ExportedFunction(name) if f == nil { err = util.NoFuncErr + util.ErrorString(name) return nil @@ -102,12 +93,12 @@ func newSQLite(mod api.Module) (sqlt *sqlite, err error) { } getVal := func(name string) uint32 { - g := mod.ExportedGlobal(name) + g := sqlt.mod.ExportedGlobal(name) if g == nil { err = util.NoGlobalErr + util.ErrorString(name) return 0 } - return util.ReadUint32(mod, uint32(g.Get())) + return util.ReadUint32(sqlt.mod, uint32(g.Get())) } sqlt.api = sqliteAPI{ @@ -191,9 +182,7 @@ func newSQLite(mod api.Module) (sqlt *sqlite, err error) { } func (sqlt *sqlite) close() error { - err := sqlt.mod.Close(sqlt.ctx) - sqlt.closer.Close() - return err + return sqlt.mod.Close(sqlt.ctx) } func (sqlt *sqlite) error(rc uint64, handle uint32, sql ...string) error { @@ -232,8 +221,6 @@ func (sqlt *sqlite) call(fn api.Function, params ...uint64) uint64 { copy(sqlt.stack[:], params) err := fn.CallWithStack(sqlt.ctx, sqlt.stack[:]) if err != nil { - // The module closed or panicked; release resources. - sqlt.closer.Close() panic(err) } return sqlt.stack[0] diff --git a/vfs/lock_test.go b/vfs/lock_test.go index cdbeaf4..4b5ed89 100644 --- a/vfs/lock_test.go +++ b/vfs/lock_test.go @@ -41,8 +41,7 @@ func Test_vfsLock(t *testing.T) { pOutput = 32 ) mod := wazerotest.NewModule(wazerotest.NewMemory(wazerotest.PageSize)) - ctx, closer := util.NewContext(context.TODO()) - defer closer.Close() + ctx := util.NewContext(context.TODO()) vfsFileRegister(ctx, mod, pFile1, &vfsFile{File: file1}) vfsFileRegister(ctx, mod, pFile2, &vfsFile{File: file2}) diff --git a/vfs/tests/mptest/mptest_test.go b/vfs/tests/mptest/mptest_test.go index 8f6ab9e..b89e150 100644 --- a/vfs/tests/mptest/mptest_test.go +++ b/vfs/tests/mptest/mptest_test.go @@ -83,16 +83,15 @@ func system(ctx context.Context, mod api.Module, ptr uint32) uint32 { cfg := config(ctx).WithArgs(args...) go func() { - ctx, closer := util.NewContext(ctx) + ctx := util.NewContext(ctx) mod, _ := rt.InstantiateModule(ctx, module, cfg) mod.Close(ctx) - closer.Close() }() return 0 } func Test_config01(t *testing.T) { - ctx, closer := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t)) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "config01.test") mod, err := rt.InstantiateModule(ctx, module, cfg) @@ -100,7 +99,6 @@ func Test_config01(t *testing.T) { t.Error(err) } mod.Close(ctx) - closer.Close() } func Test_config02(t *testing.T) { @@ -111,7 +109,7 @@ func Test_config02(t *testing.T) { t.Skip("skipping in CI") } - ctx, closer := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t)) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "config02.test") mod, err := rt.InstantiateModule(ctx, module, cfg) @@ -119,7 +117,6 @@ func Test_config02(t *testing.T) { t.Error(err) } mod.Close(ctx) - closer.Close() } func Test_crash01(t *testing.T) { @@ -127,7 +124,7 @@ func Test_crash01(t *testing.T) { t.Skip("skipping in short mode") } - ctx, closer := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t)) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "crash01.test") mod, err := rt.InstantiateModule(ctx, module, cfg) @@ -135,7 +132,6 @@ func Test_crash01(t *testing.T) { t.Error(err) } mod.Close(ctx) - closer.Close() } func Test_multiwrite01(t *testing.T) { @@ -143,7 +139,7 @@ func Test_multiwrite01(t *testing.T) { t.Skip("skipping in short mode") } - ctx, closer := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t)) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "multiwrite01.test") mod, err := rt.InstantiateModule(ctx, module, cfg) @@ -151,11 +147,10 @@ func Test_multiwrite01(t *testing.T) { t.Error(err) } mod.Close(ctx) - closer.Close() } func Test_config01_memory(t *testing.T) { - ctx, closer := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t)) cfg := config(ctx).WithArgs("mptest", "test.db", "config01.test", "--vfs", "memdb", @@ -165,7 +160,6 @@ func Test_config01_memory(t *testing.T) { t.Error(err) } mod.Close(ctx) - closer.Close() } func Test_multiwrite01_memory(t *testing.T) { @@ -173,7 +167,7 @@ func Test_multiwrite01_memory(t *testing.T) { t.Skip("skipping in short mode") } - ctx, closer := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t)) cfg := config(ctx).WithArgs("mptest", "/test.db", "multiwrite01.test", "--vfs", "memdb", @@ -183,7 +177,6 @@ func Test_multiwrite01_memory(t *testing.T) { t.Error(err) } mod.Close(ctx) - closer.Close() } func newContext(t *testing.T) context.Context { diff --git a/vfs/tests/speedtest1/speedtest1_test.go b/vfs/tests/speedtest1/speedtest1_test.go index c3e74ea..41dccac 100644 --- a/vfs/tests/speedtest1/speedtest1_test.go +++ b/vfs/tests/speedtest1/speedtest1_test.go @@ -75,7 +75,7 @@ func initFlags() { func Benchmark_speedtest1(b *testing.B) { output.Reset() - ctx, closer := util.NewContext(context.Background()) + ctx := util.NewContext(context.Background()) name := filepath.Join(b.TempDir(), "test.db") args := append(options, "--size", strconv.Itoa(b.N), name) cfg := wazero.NewModuleConfig(). @@ -89,5 +89,4 @@ func Benchmark_speedtest1(b *testing.B) { b.Error(err) } mod.Close(ctx) - closer.Close() } diff --git a/vfs/vfs_test.go b/vfs/vfs_test.go index ea1512d..c17319c 100644 --- a/vfs/vfs_test.go +++ b/vfs/vfs_test.go @@ -220,8 +220,7 @@ func Test_vfsAccess(t *testing.T) { func Test_vfsFile(t *testing.T) { mod := wazerotest.NewModule(wazerotest.NewMemory(wazerotest.PageSize)) - ctx, closer := util.NewContext(context.TODO()) - defer closer.Close() + ctx := util.NewContext(context.TODO()) // Open a temporary file. rc := vfsOpen(ctx, mod, 0, 0, 4, OPEN_CREATE|OPEN_EXCLUSIVE|OPEN_READWRITE|OPEN_DELETEONCLOSE, 0) @@ -293,8 +292,7 @@ func Test_vfsFile(t *testing.T) { func Test_vfsFile_psow(t *testing.T) { mod := wazerotest.NewModule(wazerotest.NewMemory(wazerotest.PageSize)) - ctx, closer := util.NewContext(context.TODO()) - defer closer.Close() + ctx := util.NewContext(context.TODO()) // Open a temporary file. rc := vfsOpen(ctx, mod, 0, 0, 4, OPEN_CREATE|OPEN_EXCLUSIVE|OPEN_READWRITE|OPEN_DELETEONCLOSE, 0)