Path: blob/main/system/lib/wasmfs/memory_backend.h
6174 views
// Copyright 2021 The Emscripten Authors. All rights reserved.1// Emscripten is available under two separate licenses, the MIT license and the2// University of Illinois/NCSA Open Source License. Both these licenses can be3// found in the LICENSE file.45// This file defines the memory file class. This should be the only backend file6// type defined in a header since it is the default type.78#pragma once910#include "backend.h"11#include "file.h"12#include <emscripten/threading.h>1314namespace wasmfs {1516// This class describes a file that lives in Wasm Memory.17class MemoryDataFile : public DataFile {18std::vector<uint8_t> buffer;1920int open(oflags_t) override { return 0; }21int close() override { return 0; }22ssize_t write(const uint8_t* buf, size_t len, off_t offset) override;23ssize_t read(uint8_t* buf, size_t len, off_t offset) override;24int flush() override { return 0; }25off_t getSize() override { return buffer.size(); }26int setSize(off_t size) override {27if (size > buffer.max_size()) {28return -EOVERFLOW;29}30buffer.resize(size);31return 0;32}3334public:35MemoryDataFile(mode_t mode, backend_t backend) : DataFile(mode, backend) {}3637class Handle : public DataFile::Handle {3839std::shared_ptr<MemoryDataFile> getFile() {40return file->cast<MemoryDataFile>();41}4243public:44Handle(std::shared_ptr<File> dataFile) : DataFile::Handle(dataFile) {}45};4647Handle locked() { return Handle(shared_from_this()); }48};4950class MemoryDirectory : public Directory {51// Use a vector instead of a map to save code size.52struct ChildEntry {53std::string name;54std::shared_ptr<File> child;55};5657std::vector<ChildEntry> entries;5859std::vector<ChildEntry>::iterator findEntry(const std::string& name);6061protected:62void insertChild(const std::string& name, std::shared_ptr<File> child) {63assert(findEntry(name) == entries.end());64entries.push_back({name, child});65}6667std::shared_ptr<File> getChild(const std::string& name) override;6869int removeChild(const std::string& name) override;7071std::shared_ptr<DataFile> insertDataFile(const std::string& name,72mode_t mode) override {73auto child = getBackend()->createFile(mode);74insertChild(name, child);75return child;76}7778std::shared_ptr<Directory> insertDirectory(const std::string& name,79mode_t mode) override {80auto child = getBackend()->createDirectory(mode);81insertChild(name, child);82return child;83}8485std::shared_ptr<Symlink> insertSymlink(const std::string& name,86const std::string& target) override {87auto child = getBackend()->createSymlink(target);88insertChild(name, child);89return child;90}9192int insertMove(const std::string& name, std::shared_ptr<File> file) override;9394ssize_t getNumEntries() override { return entries.size(); }95Directory::MaybeEntries getEntries() override;9697std::string getName(std::shared_ptr<File> file) override;9899// Since we internally track files with `File` objects, we don't need the100// dcache as well.101bool maintainsFileIdentity() override { return true; }102103public:104MemoryDirectory(mode_t mode, backend_t backend) : Directory(mode, backend) {}105};106107class MemorySymlink : public Symlink {108std::string target;109110std::string getTarget() const override { return target; }111112public:113MemorySymlink(const std::string& target, backend_t backend)114: Symlink(backend), target(target) {}115};116117backend_t createMemoryBackend();118119} // namespace wasmfs120121122