Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wasi: prepares for native support of preopens #1067

Merged
merged 2 commits into from
Jan 29, 2023
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
polish
Signed-off-by: Adrian Cole <[email protected]>
Adrian Cole committed Jan 29, 2023
commit 32e9e28a6508f8d116a5b2ffe4583739192beab5
6 changes: 2 additions & 4 deletions imports/wasi_snapshot_preview1/wasi_bench_test.go
Original file line number Diff line number Diff line change
@@ -174,8 +174,7 @@ func Benchmark_fdReaddir(b *testing.B) {

// Open the root directory as a file-descriptor.
fsc := mod.(*wasm.CallContext).Sys.FS()
preopen := fsc.RootFS()
fd, err := fsc.OpenFile(preopen, ".", os.O_RDONLY, 0)
fd, err := fsc.OpenFile(fsc.RootFS(), ".", os.O_RDONLY, 0)
if err != nil {
b.Fatal(err)
}
@@ -281,8 +280,7 @@ func Benchmark_pathFilestat(b *testing.B) {
fd := sys.FdPreopen
if bc.fd != sys.FdPreopen {
fsc := mod.(*wasm.CallContext).Sys.FS()
preopen := fsc.RootFS()
fd, err = fsc.OpenFile(preopen, "zig", os.O_RDONLY, 0)
fd, err = fsc.OpenFile(fsc.RootFS(), "zig", os.O_RDONLY, 0)
if err != nil {
b.Fatal(err)
}
16 changes: 8 additions & 8 deletions internal/sys/fs.go
Original file line number Diff line number Diff line change
@@ -202,8 +202,8 @@ type ReadDir struct {
}

type FSContext struct {
// root is the root ("/") mount.
root sysfs.FS
// rootFS is the root ("/") mount.
rootFS sysfs.FS

// openedFiles is a map of file descriptor numbers (>=FdPreopen) to open files
// (or directories) and defaults to empty.
@@ -216,23 +216,23 @@ type FSContext struct {
//
// If `preopened` is not sysfs.UnimplementedFS, it is inserted into
// the file descriptor table as FdPreopen.
func NewFSContext(stdin io.Reader, stdout, stderr io.Writer, root sysfs.FS) (fsc *FSContext, err error) {
fsc = &FSContext{root: root}
func NewFSContext(stdin io.Reader, stdout, stderr io.Writer, rootFS sysfs.FS) (fsc *FSContext, err error) {
fsc = &FSContext{rootFS: rootFS}
fsc.openedFiles.Insert(stdinReader(stdin))
fsc.openedFiles.Insert(stdioWriter(stdout, noopStdoutStat))
fsc.openedFiles.Insert(stdioWriter(stderr, noopStderrStat))

if _, ok := root.(sysfs.UnimplementedFS); ok {
if _, ok := rootFS.(sysfs.UnimplementedFS); ok {
return fsc, nil
}

// TODO: destructure CompositeFS into multiple pre-opens after #1077
fsc.openedFiles.Insert(&FileEntry{
FS: root,
FS: rootFS,
Name: "/",
IsPreopen: true,
isDirectory: true,
File: &lazyDir{fs: root},
File: &lazyDir{fs: rootFS},
})

return fsc, nil
@@ -277,7 +277,7 @@ func (s fileModeStat) IsDir() bool { return false }
// RootFS returns the underlying filesystem. Any files that should be added to
// the table should be inserted via InsertFile.
func (c *FSContext) RootFS() sysfs.FS {
return c.root
return c.rootFS
}

// OpenFile opens the file into the table and returns its file descriptor.
6 changes: 3 additions & 3 deletions internal/sys/fs_test.go
Original file line number Diff line number Diff line change
@@ -67,7 +67,7 @@ func TestNewFSContext(t *testing.T) {
defer fsc.Close(testCtx)

preopenedDir, _ := fsc.openedFiles.Lookup(FdPreopen)
require.Equal(t, tc.fs, fsc.root)
require.Equal(t, tc.fs, fsc.rootFS)
require.NotNil(t, preopenedDir)
require.Equal(t, "/", preopenedDir.Name)

@@ -97,7 +97,7 @@ func TestUnimplementedFSContext(t *testing.T) {
testFS, err := NewFSContext(nil, nil, nil, sysfs.UnimplementedFS{})
require.NoError(t, err)

expected := &FSContext{root: sysfs.UnimplementedFS{}}
expected := &FSContext{rootFS: sysfs.UnimplementedFS{}}
expected.openedFiles.Insert(noopStdin)
expected.openedFiles.Insert(noopStdout)
expected.openedFiles.Insert(noopStderr)
@@ -107,7 +107,7 @@ func TestUnimplementedFSContext(t *testing.T) {
require.NoError(t, err)

// Closes opened files
require.Equal(t, &FSContext{root: sysfs.UnimplementedFS{}}, testFS)
require.Equal(t, &FSContext{rootFS: sysfs.UnimplementedFS{}}, testFS)
})
}

6 changes: 3 additions & 3 deletions internal/sys/sys.go
Original file line number Diff line number Diff line change
@@ -134,7 +134,7 @@ func NewContext(
nanotime *sys.Nanotime,
nanotimeResolution sys.ClockResolution,
nanosleep *sys.Nanosleep,
fs sysfs.FS,
rootFS sysfs.FS,
) (sysCtx *Context, err error) {
sysCtx = &Context{args: args, environ: environ}

@@ -180,8 +180,8 @@ func NewContext(
sysCtx.nanosleep = &ns
}

if fs != nil {
sysCtx.fsc, err = NewFSContext(stdin, stdout, stderr, fs)
if rootFS != nil {
sysCtx.fsc, err = NewFSContext(stdin, stdout, stderr, rootFS)
} else {
sysCtx.fsc, err = NewFSContext(stdin, stdout, stderr, sysfs.UnimplementedFS{})
}
12 changes: 6 additions & 6 deletions internal/sys/sys_test.go
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ func TestDefaultSysContext(t *testing.T) {
nil, 0, // walltime, walltimeResolution
nil, 0, // nanotime, nanotimeResolution
nil, // nanosleep
testFS, // root
testFS, // rootFS
)
require.NoError(t, err)

@@ -120,7 +120,7 @@ func TestNewContext_Args(t *testing.T) {
nil, 0, // walltime, walltimeResolution
nil, 0, // nanotime, nanotimeResolution
nil, // nanosleep
nil, // root
nil, // rootFS
)
if tc.expectedErr == "" {
require.Nil(t, err)
@@ -182,7 +182,7 @@ func TestNewContext_Environ(t *testing.T) {
nil, 0, // walltime, walltimeResolution
nil, 0, // nanotime, nanotimeResolution
nil, // nanosleep
nil, // root
nil, // rootFS
)
if tc.expectedErr == "" {
require.Nil(t, err)
@@ -230,7 +230,7 @@ func TestNewContext_Walltime(t *testing.T) {
tc.time, tc.resolution, // walltime, walltimeResolution
nil, 0, // nanotime, nanotimeResolution
nil, // nanosleep
nil, // root
nil, // rootFS
)
if tc.expectedErr == "" {
require.Nil(t, err)
@@ -278,7 +278,7 @@ func TestNewContext_Nanotime(t *testing.T) {
nil, 0, // nanotime, nanotimeResolution
tc.time, tc.resolution, // nanotime, nanotimeResolution
nil, // nanosleep
nil, // root
nil, // rootFS
)
if tc.expectedErr == "" {
require.Nil(t, err)
@@ -335,7 +335,7 @@ func TestNewContext_Nanosleep(t *testing.T) {
nil, 0, // Nanosleep, NanosleepResolution
nil, 0, // Nanosleep, NanosleepResolution
&aNs, // nanosleep
nil, // root
nil, // rootFS
)
require.Nil(t, err)
require.Equal(t, &aNs, sysCtx.nanosleep)