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 3fd32b3e1faf4..a829127c25e2a 100644 --- a/test/codesize/test_codesize_cxx_wasmfs.json +++ b/test/codesize/test_codesize_cxx_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 6938, "a.out.js.gz": 3259, - "a.out.nodebug.wasm": 172803, - "a.out.nodebug.wasm.gz": 63374, - "total": 179741, - "total_gz": 66633, + "a.out.nodebug.wasm": 172830, + "a.out.nodebug.wasm.gz": 63389, + "total": 179768, + "total_gz": 66648, "sent": [ "__cxa_throw", "_abort_js", diff --git a/test/codesize/test_codesize_files_wasmfs.json b/test/codesize/test_codesize_files_wasmfs.json index 6ef587b23b45f..e7bbf45a125b6 100644 --- a/test/codesize/test_codesize_files_wasmfs.json +++ b/test/codesize/test_codesize_files_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 5372, "a.out.js.gz": 2527, - "a.out.nodebug.wasm": 58520, - "a.out.nodebug.wasm.gz": 18225, - "total": 63892, - "total_gz": 20752, + "a.out.nodebug.wasm": 58545, + "a.out.nodebug.wasm.gz": 18255, + "total": 63917, + "total_gz": 20782, "sent": [ "a (emscripten_date_now)", "b (emscripten_err)", diff --git a/test/test_other.py b/test/test_other.py index 081ef40d60032..5f426752a2ee3 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -5610,6 +5610,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({ @@ -13476,6 +13478,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')