Skip to content

Commit 743739d

Browse files
committed
unique ptr and backend_t = raw ptr
1 parent d319a35 commit 743739d

File tree

7 files changed

+44
-35
lines changed

7 files changed

+44
-35
lines changed

system/lib/wasmfs/backend.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace wasmfs {
2020
// extend its storage capabilities. Files and directories will be represented in
2121
// the file system structure, but their underlying backing could exist in
2222
// persistent storage, another thread, etc.
23-
class Backend : public std::enable_shared_from_this<Backend> {
23+
class Backend {
2424

2525
public:
2626
virtual std::shared_ptr<DataFile> createFile(mode_t mode) = 0;
@@ -32,5 +32,5 @@ class Backend : public std::enable_shared_from_this<Backend> {
3232
// Note: Backends will be defined in cpp files, but functions to acquire them
3333
// will be defined in this header. This is so that any unused backends are not
3434
// linked in if they are not called.
35-
std::shared_ptr<Backend> createMemoryFileBackend();
35+
std::unique_ptr<Backend> createMemoryFileBackend();
3636
} // namespace wasmfs

system/lib/wasmfs/file.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace wasmfs {
2323

2424
class Backend;
2525
// This specifies a reference to a directory's associated backend.
26-
using backend_t = std::shared_ptr<Backend>;
26+
using backend_t = Backend*;
2727

2828
class File : public std::enable_shared_from_this<File> {
2929

system/lib/wasmfs/memory_file.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
#include "memory_file.h"
3+
4+
namespace wasmfs {
5+
__wasi_errno_t MemoryFile::write(const uint8_t* buf, size_t len, off_t offset) {
6+
if (offset + len >= buffer.size()) {
7+
buffer.resize(offset + len);
8+
}
9+
memcpy(&buffer[offset], buf, len);
10+
11+
return __WASI_ERRNO_SUCCESS;
12+
}
13+
14+
__wasi_errno_t MemoryFile::read(uint8_t* buf, size_t len, off_t offset) {
15+
assert(offset + len - 1 < buffer.size());
16+
std::memcpy(buf, &buffer[offset], len);
17+
18+
return __WASI_ERRNO_SUCCESS;
19+
}
20+
21+
void MemoryFile::Handle::preloadFromJS(int index) {
22+
getFile()->buffer.resize(
23+
EM_ASM_INT({return wasmFS$preloadedFiles[$0].fileData.length}, index));
24+
// Ensure that files are preloaded from the main thread.
25+
assert(emscripten_is_main_runtime_thread());
26+
// TODO: Replace every EM_ASM with EM_JS.
27+
EM_ASM({ HEAPU8.set(wasmFS$preloadedFiles[$1].fileData, $0); },
28+
getFile()->buffer.data(),
29+
index);
30+
}
31+
} // namespace wasmfs

system/lib/wasmfs/memory_file.h

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,9 @@ namespace wasmfs {
1515
// This class describes a file that lives in Wasm Memory.
1616
class MemoryFile : public DataFile {
1717
std::vector<uint8_t> buffer;
18-
__wasi_errno_t write(const uint8_t* buf, size_t len, off_t offset) override {
19-
if (offset + len >= buffer.size()) {
20-
buffer.resize(offset + len);
21-
}
22-
memcpy(&buffer[offset], buf, len);
18+
__wasi_errno_t write(const uint8_t* buf, size_t len, off_t offset) override;
2319

24-
return __WASI_ERRNO_SUCCESS;
25-
}
26-
27-
__wasi_errno_t read(uint8_t* buf, size_t len, off_t offset) override {
28-
assert(offset + len - 1 < buffer.size());
29-
std::memcpy(buf, &buffer[offset], len);
30-
31-
return __WASI_ERRNO_SUCCESS;
32-
}
20+
__wasi_errno_t read(uint8_t* buf, size_t len, off_t offset) override;
3321

3422
size_t getSize() override { return buffer.size(); }
3523

@@ -43,16 +31,7 @@ class MemoryFile : public DataFile {
4331
public:
4432
Handle(std::shared_ptr<File> dataFile) : DataFile::Handle(dataFile) {}
4533
// This function copies preloaded files from JS Memory to Wasm Memory.
46-
void preloadFromJS(int index) {
47-
getFile()->buffer.resize(
48-
EM_ASM_INT({return wasmFS$preloadedFiles[$0].fileData.length}, index));
49-
// Ensure that files are preloaded from the main thread.
50-
assert(emscripten_is_main_browser_thread());
51-
// TODO: Replace every EM_ASM with EM_JS.
52-
EM_ASM({ HEAPU8.set(wasmFS$preloadedFiles[$1].fileData, $0); },
53-
getFile()->buffer.data(),
54-
index);
55-
}
34+
void preloadFromJS(int index);
5635
};
5736

5837
Handle locked() { return Handle(shared_from_this()); }

system/lib/wasmfs/memory_file_backend.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ class MemoryFileBackend : public Backend {
2222
return std::make_shared<MemoryFile>(mode);
2323
}
2424
std::shared_ptr<Directory> createDirectory(mode_t mode) override {
25-
return std::make_shared<Directory>(mode, shared_from_this());
25+
return std::make_shared<Directory>(mode, this);
2626
}
2727
};
2828

29-
std::shared_ptr<Backend> createMemoryFileBackend() {
30-
return std::make_shared<MemoryFileBackend>();
29+
std::unique_ptr<Backend> createMemoryFileBackend() {
30+
return std::make_unique<MemoryFileBackend>();
3131
}
3232
} // namespace wasmfs

system/lib/wasmfs/wasmfs.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,11 @@ __attribute__((init_priority(100))) WasmFS wasmFS;
2727
# 28 "wasmfs.cpp"
2828

2929
std::shared_ptr<Directory> WasmFS::initRootDirectory() {
30-
auto rootBackend = createMemoryFileBackend();
31-
backendTable.push_back(rootBackend);
30+
backendTable.push_back(createMemoryFileBackend());
3231
auto rootDirectory =
33-
std::make_shared<Directory>(S_IRUGO | S_IXUGO, rootBackend);
32+
std::make_shared<Directory>(S_IRUGO | S_IXUGO, backendTable[0].get());
3433
auto devDirectory =
35-
std::make_shared<Directory>(S_IRUGO | S_IXUGO, rootBackend);
34+
std::make_shared<Directory>(S_IRUGO | S_IXUGO, backendTable[0].get());
3635
rootDirectory->locked().setEntry("dev", devDirectory);
3736

3837
auto dir = devDirectory->locked();

system/lib/wasmfs/wasmfs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class WasmFS {
3737
void preloadFiles();
3838

3939
public:
40-
std::vector<std::shared_ptr<Backend>> backendTable;
40+
std::vector<std::unique_ptr<Backend>> backendTable;
4141
// Files will be preloaded in this constructor.
4242
// This global constructor has init_priority 100. Please see wasmfs.cpp.
4343
// The current working directory is initialized to the root directory.

0 commit comments

Comments
 (0)