diff --git a/system/lib/wasmfs/backend.h b/system/lib/wasmfs/backend.h index d8e584c01136a..437b5cb3773f6 100644 --- a/system/lib/wasmfs/backend.h +++ b/system/lib/wasmfs/backend.h @@ -21,6 +21,8 @@ class Backend { virtual std::shared_ptr createDirectory(mode_t mode) = 0; virtual std::shared_ptr createSymlink(std::string target) = 0; + virtual bool shouldPopulateRoot() { return true; } + virtual ~Backend() = default; }; diff --git a/system/lib/wasmfs/backends/node_backend.cpp b/system/lib/wasmfs/backends/node_backend.cpp index 4bfd0f12cd70a..c408c8d6134ca 100644 --- a/system/lib/wasmfs/backends/node_backend.cpp +++ b/system/lib/wasmfs/backends/node_backend.cpp @@ -296,6 +296,8 @@ class NodeBackend : public Backend { std::shared_ptr createSymlink(std::string target) override { WASMFS_UNREACHABLE("TODO: implement NodeBackend::createSymlink"); } + + virtual bool shouldPopulateRoot() override { return false; } }; // TODO: symlink diff --git a/system/lib/wasmfs/wasmfs.cpp b/system/lib/wasmfs/wasmfs.cpp index 7a771a8ff4bd0..0ba1fea8ec016 100644 --- a/system/lib/wasmfs/wasmfs.cpp +++ b/system/lib/wasmfs/wasmfs.cpp @@ -106,8 +106,14 @@ std::shared_ptr WasmFS::initRootDirectory() { // The root directory is its own parent. lockedRoot.setParent(rootDirectory); + // Skip setting up the root directory when not needed (e.g. in NODERAWFS + // mode). + if (!rootBackend->shouldPopulateRoot()) { + return rootDirectory; + } + // If the /dev/ directory does not already exist, create it. (It may already - // exist in NODERAWFS mode, or if those files have been preloaded.) + // exist if those files have been preloaded.) auto devDir = lockedRoot.insertDirectory("dev", S_IRUGO | S_IXUGO); if (devDir) { auto lockedDev = devDir->locked(); diff --git a/test/codesize/test_codesize_cxx_wasmfs.json b/test/codesize/test_codesize_cxx_wasmfs.json index 954e689d7009d..f03d677a036c9 100644 --- a/test/codesize/test_codesize_cxx_wasmfs.json +++ b/test/codesize/test_codesize_cxx_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 7056, "a.out.js.gz": 3322, - "a.out.nodebug.wasm": 172695, - "a.out.nodebug.wasm.gz": 63383, - "total": 179751, - "total_gz": 66705, + "a.out.nodebug.wasm": 172722, + "a.out.nodebug.wasm.gz": 63393, + "total": 179778, + "total_gz": 66715, "sent": [ "__cxa_throw", "_abort_js", diff --git a/test/codesize/test_codesize_files_wasmfs.json b/test/codesize/test_codesize_files_wasmfs.json index 9d9818ea4adfd..0faaf6dbef762 100644 --- a/test/codesize/test_codesize_files_wasmfs.json +++ b/test/codesize/test_codesize_files_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 5487, "a.out.js.gz": 2586, - "a.out.nodebug.wasm": 58324, - "a.out.nodebug.wasm.gz": 18215, - "total": 63811, - "total_gz": 20801, + "a.out.nodebug.wasm": 58349, + "a.out.nodebug.wasm.gz": 18247, + "total": 63836, + "total_gz": 20833, "sent": [ "a (emscripten_date_now)", "b (emscripten_err)", diff --git a/test/test_other.py b/test/test_other.py index 0d924f90e18a6..92c8d2da973d0 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -5554,6 +5554,8 @@ def test_fsync(self, args): def test_fs_dev_random(self): if WINDOWS and self.get_setting('NODERAWFS'): self.skipTest('Crashes on Windows and NodeFS') + if self.get_setting('NODERAWFS') and self.get_setting('WASMFS'): + self.skipTest('https://github.com/emscripten-core/emscripten/issues/24830') self.do_runf('fs/test_fs_dev_random.c', 'done\n') @parameterized({ @@ -13274,6 +13276,8 @@ def test_unistd_chown(self): @wasmfs_all_backends def test_wasmfs_getdents(self): + if self.get_setting('NODERAWFS'): + self.skipTest('test expectations assumes /dev is virtualized') # Run only in WASMFS for now. self.set_setting('FORCE_FILESYSTEM') self.do_run_in_out_file_test('wasmfs/wasmfs_getdents.c')