From 55119253da99e2bea33d10975a6fae37ef44ca3e Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Sat, 29 Dec 2018 22:29:03 -0600 Subject: [PATCH] [ox/fs] Make format method static --- .../src/ox/fs/filestore/filestoretemplate.cpp | 2 +- .../src/ox/fs/filestore/filestoretemplate.hpp | 102 ++++++++++-------- deps/ox/src/ox/fs/filesystem/directory.cpp | 2 +- deps/ox/src/ox/fs/filesystem/directory.hpp | 52 ++++++--- deps/ox/src/ox/fs/filesystem/filesystem.cpp | 2 +- deps/ox/src/ox/fs/filesystem/filesystem.hpp | 72 ++++++++----- deps/ox/src/ox/fs/fs.hpp | 3 +- deps/ox/src/ox/fs/test/filestore_format.cpp | 18 ---- deps/ox/src/ox/fs/test/filestoreio.cpp | 68 ------------ deps/ox/src/ox/fs/test/filesystem_format.cpp | 23 ---- deps/ox/src/ox/fs/test/tests.cpp | 20 ++-- deps/ox/src/ox/ptrarith/nodebuffer.hpp | 20 ++-- deps/ox/src/ox/std/random.hpp | 2 +- deps/ox/src/ox/trace/trace.cpp | 4 + 14 files changed, 172 insertions(+), 218 deletions(-) delete mode 100644 deps/ox/src/ox/fs/test/filestore_format.cpp delete mode 100644 deps/ox/src/ox/fs/test/filestoreio.cpp delete mode 100644 deps/ox/src/ox/fs/test/filesystem_format.cpp diff --git a/deps/ox/src/ox/fs/filestore/filestoretemplate.cpp b/deps/ox/src/ox/fs/filestore/filestoretemplate.cpp index 063b79d0..13181d64 100644 --- a/deps/ox/src/ox/fs/filestore/filestoretemplate.cpp +++ b/deps/ox/src/ox/fs/filestore/filestoretemplate.cpp @@ -8,7 +8,7 @@ #include "filestoretemplate.hpp" -namespace ox::fs { +namespace ox { template class FileStoreTemplate; template class FileStoreTemplate; diff --git a/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp b/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp index e556185e..a1e6f818 100644 --- a/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp +++ b/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp @@ -10,7 +10,7 @@ #include -namespace ox::fs { +namespace ox { using InodeId_t = uint64_t; using FsSize_t = std::size_t; @@ -70,12 +70,14 @@ class FileStoreTemplate { }; size_t m_buffSize = 0; - Buffer *m_buffer = nullptr; + mutable Buffer *m_buffer = nullptr; public: + FileStoreTemplate() = default; + FileStoreTemplate(void *buff, size_t buffSize); - Error format(); + static Error format(void *buffer, size_t bufferSize); Error setSize(InodeId_t buffSize); @@ -87,11 +89,11 @@ class FileStoreTemplate { Error remove(InodeId_t id); - Error read(InodeId_t id, void *data, FsSize_t dataSize, FsSize_t *size = nullptr); + Error read(InodeId_t id, void *data, FsSize_t dataSize, FsSize_t *size = nullptr) const; - Error read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size = nullptr); + Error read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size = nullptr) const; - const ptrarith::Ptr read(InodeId_t id); + const ptrarith::Ptr read(InodeId_t id) const; /** * Reads the "file" at the given id. You are responsible for freeing @@ -106,7 +108,7 @@ class FileStoreTemplate { template Error read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, T *data, - FsSize_t *size); + FsSize_t *size) const; ValErr stat(InodeId_t id); @@ -114,7 +116,7 @@ class FileStoreTemplate { InodeId_t spaceNeeded(FsSize_t size); - InodeId_t size(); + InodeId_t size() const; InodeId_t available(); @@ -126,10 +128,10 @@ class FileStoreTemplate { bool valid() const; - private: void compact(); - FileStoreData *fileStoreData(); + private: + FileStoreData *fileStoreData() const; /** * Places the given Item at the given ID. If it already exists, the @@ -160,17 +162,17 @@ class FileStoreTemplate { /** * Finds the parent an inode by its ID. */ - ItemPtr findParent(ItemPtr ptr, size_t id); + ItemPtr findParent(ItemPtr ptr, size_t id) const; /** * Finds an inode by its ID. */ - ItemPtr find(ItemPtr item, InodeId_t id, int depth = 0); + ItemPtr find(ItemPtr item, InodeId_t id, int depth = 0) const; /** * Finds an inode by its ID. */ - ItemPtr find(InodeId_t id); + ItemPtr find(InodeId_t id) const; /** * Gets the root inode. @@ -192,11 +194,11 @@ FileStoreTemplate::FileStoreTemplate(void *buff, size_t buffSize) { } template -Error FileStoreTemplate::format() { - new (m_buffer) Buffer(m_buffSize); - auto fsData = m_buffer->malloc(sizeof(FileStoreData)); +Error FileStoreTemplate::format(void *buffer, size_t bufferSize) { + auto nb = new (buffer) Buffer(bufferSize); + auto fsData = nb->malloc(sizeof(FileStoreData)); if (fsData.valid()) { - auto data = m_buffer->template dataOf(fsData); + auto data = nb->template dataOf(fsData); if (data.valid()) { new (data) FileStoreData; return OxError(0); @@ -301,7 +303,7 @@ Error FileStoreTemplate::remove(InodeId_t id) { } template -Error FileStoreTemplate::read(InodeId_t id, void *data, FsSize_t dataSize, FsSize_t *size) { +Error FileStoreTemplate::read(InodeId_t id, void *data, FsSize_t dataSize, FsSize_t *size) const { oxTrace("ox::fs::FileStoreTemplate::read") << "Attempting to read from inode" << id; auto src = find(id); if (src.valid()) { @@ -327,7 +329,7 @@ Error FileStoreTemplate::read(InodeId_t id, void *data, FsSize_t dataSiz } template -Error FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size) { +Error FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size) const { auto src = find(id); if (src.valid()) { auto srcData = src->data(); @@ -354,19 +356,19 @@ Error FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, FsSize_t template template Error FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, - FsSize_t readSize, T *data, FsSize_t *size) { + FsSize_t readSize, T *data, FsSize_t *size) const { auto src = find(id); if (src.valid()) { auto srcData = src->data(); if (srcData.valid()) { - auto sub = srcData.subPtr(readStart, readSize); + auto sub = srcData.template subPtr(readStart, readSize); if (sub.valid() && sub.size() % sizeof(T)) { for (FsSize_t i = 0; i < sub.size() / sizeof(T); i++) { // do byte-by-byte copy to ensure alignment is right when // copying to final destination T tmp; for (size_t i = 0; i < sizeof(T); i++) { - *(reinterpret_cast(&tmp)[i]) = *(reinterpret_cast(sub.get()) + i); + reinterpret_cast(&tmp)[i] = *(reinterpret_cast(sub.get()) + i); } *(data + i) = tmp; } @@ -381,7 +383,7 @@ Error FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, } template -const ptrarith::Ptr FileStoreTemplate::read(InodeId_t id) { +const ptrarith::Ptr FileStoreTemplate::read(InodeId_t id) const { auto item = find(id); if (item.valid()) { return item->data(); @@ -419,7 +421,7 @@ typename FileStoreTemplate::InodeId_t FileStoreTemplate::spaceNe } template -typename FileStoreTemplate::InodeId_t FileStoreTemplate::size() { +typename FileStoreTemplate::InodeId_t FileStoreTemplate::size() const { return m_buffer->size(); } @@ -458,10 +460,22 @@ ValErr::InodeId_t> FileStoreTemplate: template void FileStoreTemplate::compact() { + m_buffer->compact([this](uint64_t oldAddr, ItemPtr item) { + if (item.valid()) { + auto parent = findParent(rootInode(), item); + if (parent.valid()) { + if (parent->left == oldAddr) { + parent->left = item; + } else if (parent->right == oldAddr) { + parent->right = item; + } + } + } + }); } template -typename FileStoreTemplate::FileStoreData *FileStoreTemplate::fileStoreData() { +typename FileStoreTemplate::FileStoreData *FileStoreTemplate::fileStoreData() const { auto first = m_buffer->firstItem(); if (first.valid()) { auto data = first->data(); @@ -607,23 +621,25 @@ Error FileStoreTemplate::remove(ItemPtr item) { } template -typename FileStoreTemplate::ItemPtr FileStoreTemplate::findParent(ItemPtr item, size_t id) { - if (id > item->id) { - auto right = m_buffer->ptr(item->right); - if (right.valid()) { - if (right->id == id) { - return item; - } else { - return findParent(right, id); +typename FileStoreTemplate::ItemPtr FileStoreTemplate::findParent(ItemPtr item, size_t id) const { + if (item.valid()) { + if (id > item->id) { + auto right = m_buffer->ptr(item->right); + if (right.valid()) { + if (right->id == id) { + return item; + } else { + return findParent(right, id); + } } - } - } else if (id < item->id) { - auto left = m_buffer->ptr(item->left); - if (left.valid()) { - if (left->id == id) { - return item; - } else { - return findParent(left, id); + } else if (id < item->id) { + auto left = m_buffer->ptr(item->left); + if (left.valid()) { + if (left->id == id) { + return item; + } else { + return findParent(left, id); + } } } } @@ -631,7 +647,7 @@ typename FileStoreTemplate::ItemPtr FileStoreTemplate::findParen } template -typename FileStoreTemplate::ItemPtr FileStoreTemplate::find(ItemPtr item, InodeId_t id, int depth) { +typename FileStoreTemplate::ItemPtr FileStoreTemplate::find(ItemPtr item, InodeId_t id, int depth) const { if (depth < 5000) { if (item.valid()) { if (id > item->id) { @@ -654,7 +670,7 @@ typename FileStoreTemplate::ItemPtr FileStoreTemplate::find(Item } template -typename FileStoreTemplate::ItemPtr FileStoreTemplate::find(InodeId_t id) { +typename FileStoreTemplate::ItemPtr FileStoreTemplate::find(InodeId_t id) const { auto fsData = fileStoreData(); if (fsData) { auto root = m_buffer->ptr(fsData->rootNode); diff --git a/deps/ox/src/ox/fs/filesystem/directory.cpp b/deps/ox/src/ox/fs/filesystem/directory.cpp index 30fc4e8b..c6f2ec07 100644 --- a/deps/ox/src/ox/fs/filesystem/directory.cpp +++ b/deps/ox/src/ox/fs/filesystem/directory.cpp @@ -8,7 +8,7 @@ #include "directory.hpp" -namespace ox::fs { +namespace ox { template class Directory; template class Directory; diff --git a/deps/ox/src/ox/fs/filesystem/directory.hpp b/deps/ox/src/ox/fs/filesystem/directory.hpp index 81bf9b32..94a4891d 100644 --- a/deps/ox/src/ox/fs/filesystem/directory.hpp +++ b/deps/ox/src/ox/fs/filesystem/directory.hpp @@ -13,7 +13,7 @@ #include #include -namespace ox::fs { +namespace ox { template struct __attribute__((packed)) DirectoryEntry { @@ -91,12 +91,12 @@ class Directory { InodeId_t m_inodeId = 0; std::size_t m_size = 0; - FileStore *m_fs = nullptr; + FileStore m_fs; public: Directory() = default; - Directory(FileStore *fs, InodeId_t inode); + Directory(FileStore fs, InodeId_t inode); /** * Initializes Directory. @@ -112,6 +112,9 @@ class Directory { Error remove(PathIterator it, FileName *nameBuff = nullptr) noexcept; + template + Error ls(F cb) noexcept; + ValErr findEntry(const FileName &name) const noexcept; ValErr find(PathIterator name, FileName *nameBuff = nullptr) const noexcept; @@ -119,10 +122,10 @@ class Directory { }; template -Directory::Directory(FileStore *fs, InodeId_t inodeId) { +Directory::Directory(FileStore fs, InodeId_t inodeId) { m_fs = fs; m_inodeId = inodeId; - auto buff = fs->read(inodeId).template to(); + auto buff = m_fs.read(inodeId).template to(); if (buff.valid()) { m_size = buff.size(); } @@ -131,8 +134,8 @@ Directory::Directory(FileStore *fs, InodeId_t inodeId) { template Error Directory::init() noexcept { constexpr auto Size = sizeof(Buffer); - oxReturnError(m_fs->write(m_inodeId, nullptr, Size)); - auto buff = m_fs->read(m_inodeId); + oxReturnError(m_fs.write(m_inodeId, nullptr, Size)); + auto buff = m_fs.read(m_inodeId); if (buff.valid()) { new (buff) Buffer(Size); m_size = Size; @@ -161,7 +164,7 @@ Error Directory::mkdir(PathIterator path, bool parents, Fi if (!parents && path.hasNext()) { return OxError(1); } - childInode = m_fs->generateInodeId(); + childInode = m_fs.generateInodeId(); oxLogError(childInode.error); oxReturnError(childInode.error); @@ -173,7 +176,7 @@ Error Directory::mkdir(PathIterator path, bool parents, Fi if (err) { oxLogError(err); // could not index the directory, delete it - oxLogError(m_fs->remove(childInode)); + oxLogError(m_fs.remove(childInode)); return err; } } @@ -225,7 +228,7 @@ Error Directory::write(PathIterator path, InodeId_t inode, // find existing version of directory oxTrace("ox::fs::Directory::write") << "Searching for inode" << m_inodeId; - auto old = m_fs->read(m_inodeId); + auto old = m_fs.read(m_inodeId); if (old.valid()) { const auto entrySize = DirectoryEntry::spaceNeeded(name->len()); const auto entryDataSize =DirectoryEntry::DirectoryEntryData::spaceNeeded(name->len()); @@ -239,7 +242,7 @@ Error Directory::write(PathIterator path, InodeId_t inode, if (val.valid()) { oxTrace("ox::fs::Directory::write") << "Attempting to write Directory to FileStore"; val->init(inode, name->data(), entrySize); - return m_fs->write(m_inodeId, cpy, cpy->size()); + return m_fs.write(m_inodeId, cpy, cpy->size()); } else { oxTrace("ox::fs::Directory::write::fail") << "Could not allocate memory for new directory entry"; return OxError(1); @@ -266,7 +269,7 @@ Error Directory::remove(PathIterator path, FileName *nameB oxReturnError(path.get(&name)); oxTrace("ox::fs::Directory::remove") << name.c_str(); - auto buff = m_fs->read(m_inodeId).template to(); + auto buff = m_fs.read(m_inodeId).template to(); if (buff.valid()) { oxTrace("ox::fs::Directory::remove") << "Found directory buffer."; for (auto i = buff->iterator(); i.valid(); i.next()) { @@ -286,10 +289,33 @@ Error Directory::remove(PathIterator path, FileName *nameB return OxError(0); } +template +template +Error Directory::ls(F cb) noexcept { + oxTrace("ox::fs::Directory::ls"); + auto buff = m_fs.read(m_inodeId).template to(); + if (buff.valid()) { + oxTrace("ox::fs::Directory::ls") << "Found directory buffer."; + for (auto i = buff->iterator(); i.valid(); i.next()) { + auto data = i->data(); + if (data.valid()) { + oxReturnError(cb(data->name, data->inode)); + } else { + oxTrace("ox::fs::Directory::ls") << "INVALID DIRECTORY ENTRY"; + } + } + oxTrace("ox::fs::Directory::ls::fail"); + return OxError(1); + } else { + oxTrace("ox::fs::Directory::ls::fail") << "Could not directory buffer"; + return OxError(2); + } +} + template ValErr Directory::findEntry(const FileName &name) const noexcept { oxTrace("ox::fs::Directory::findEntry") << name.c_str(); - auto buff = m_fs->read(m_inodeId).template to(); + auto buff = m_fs.read(m_inodeId).template to(); if (buff.valid()) { oxTrace("ox::fs::Directory::findEntry") << "Found directory buffer."; for (auto i = buff->iterator(); i.valid(); i.next()) { diff --git a/deps/ox/src/ox/fs/filesystem/filesystem.cpp b/deps/ox/src/ox/fs/filesystem/filesystem.cpp index a90a6f51..b2d65a46 100644 --- a/deps/ox/src/ox/fs/filesystem/filesystem.cpp +++ b/deps/ox/src/ox/fs/filesystem/filesystem.cpp @@ -8,7 +8,7 @@ #include "filesystem.hpp" -namespace ox::fs { +namespace ox { template class FileSystemTemplate; template class FileSystemTemplate; diff --git a/deps/ox/src/ox/fs/filesystem/filesystem.hpp b/deps/ox/src/ox/fs/filesystem/filesystem.hpp index ca9a5b60..64b66900 100644 --- a/deps/ox/src/ox/fs/filesystem/filesystem.hpp +++ b/deps/ox/src/ox/fs/filesystem/filesystem.hpp @@ -13,12 +13,12 @@ #include "directory.hpp" -namespace ox::fs { +namespace ox { class FileSystem { public: - virtual Error format() = 0; + virtual ~FileSystem() = default; virtual Error mkdir(const char *path, bool recursive = false) = 0; @@ -51,7 +51,7 @@ class FileSystem { virtual uint64_t available() = 0; - virtual uint64_t size() = 0; + virtual uint64_t size() const = 0; virtual uint8_t *buff() = 0; @@ -76,14 +76,16 @@ class FileSystemTemplate: public FileSystem { LittleEndian rootDirInode; }; - FileStore *m_fs = nullptr; + FileStore m_fs; public: - FileSystemTemplate(FileStore *fs); + FileSystemTemplate() = default; + + FileSystemTemplate(FileStore fs); ~FileSystemTemplate(); - Error format() override; + static Error format(void *buff, uint64_t buffSize); Error mkdir(const char *path, bool recursive = false) override; @@ -95,6 +97,9 @@ class FileSystemTemplate: public FileSystem { Error read(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) override; + template + Error ls(const char *dir, F cb); + Error remove(const char *path, bool recursive = false) override; void resize(uint64_t size, void *buffer = nullptr) override; @@ -111,7 +116,7 @@ class FileSystemTemplate: public FileSystem { uint64_t available() override; - uint64_t size() override; + uint64_t size() const override; uint8_t *buff() override; @@ -132,7 +137,7 @@ class FileSystemTemplate: public FileSystem { }; template -FileSystemTemplate::FileSystemTemplate(FileStore *fs) { +FileSystemTemplate::FileSystemTemplate(FileStore fs) { m_fs = fs; } @@ -141,19 +146,20 @@ FileSystemTemplate::~FileSystemTemplate() { } template -Error FileSystemTemplate::format() { - oxReturnError(m_fs->format()); +Error FileSystemTemplate::format(void *buff, uint64_t buffSize) { + oxReturnError(FileStore::format(buff, buffSize)); + FileStore fs(buff, buffSize); constexpr auto rootDirInode = MaxValue / 2; - Directory rootDir(m_fs, rootDirInode); + Directory rootDir(fs, rootDirInode); oxReturnError(rootDir.init()); FileSystemData fd; fd.rootDirInode = rootDirInode; oxTrace("ox::fs::FileSystemTemplate::format") << "rootDirInode:" << fd.rootDirInode; - oxReturnError(m_fs->write(InodeFsData, &fd, sizeof(fd))); + oxReturnError(fs.write(InodeFsData, &fd, sizeof(fd))); - if (m_fs->read(fd.rootDirInode).valid()) { + if (fs.read(fd.rootDirInode).valid()) { oxTrace("ox::fs::FileSystemTemplate::format::error") << "FileSystemTemplate::format did not correctly create root directory"; } @@ -192,12 +198,24 @@ Error FileSystemTemplate::read(const char *path, void *buf template Error FileSystemTemplate::read(uint64_t inode, void *buffer, std::size_t buffSize) { - return m_fs->read(inode, buffer, buffSize); + return m_fs.read(inode, buffer, buffSize); } template Error FileSystemTemplate::read(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) { - return m_fs->read(inode, readStart, readSize, buffer, size); + return m_fs.read(inode, readStart, readSize, reinterpret_cast(buffer), size); +} + +template +template +Error FileSystemTemplate::ls(const char *path, F cb) { + auto s = stat(path); + oxReturnError(s.error); + + Directory dir(m_fs, s.value.inode); + dir.ls(cb); + + return OxError(0); } template @@ -224,14 +242,14 @@ Error FileSystemTemplate::remove(const char *path, bool re template void FileSystemTemplate::resize(uint64_t size, void *buffer) { - m_fs->resize(size, buffer); + m_fs.resize(size, buffer); } template Error FileSystemTemplate::write(const char *path, void *buffer, uint64_t size, uint8_t fileType) { auto inode = find(path); if (inode.error) { - inode.value = m_fs->generateInodeId(); + inode.value = m_fs.generateInodeId(); } auto rootDir = this->rootDir(); oxReturnError(rootDir.error); @@ -242,12 +260,12 @@ Error FileSystemTemplate::write(const char *path, void *bu template Error FileSystemTemplate::write(uint64_t inode, void *buffer, uint64_t size, uint8_t fileType) { - return m_fs->write(inode, buffer, size, fileType); + return m_fs.write(inode, buffer, size, fileType); } template ValErr FileSystemTemplate::stat(uint64_t inode) { - auto s = m_fs->stat(inode); + auto s = m_fs.stat(inode); FileStat out; out.inode = s.value.inode; out.links = s.value.links; @@ -267,38 +285,38 @@ ValErr FileSystemTemplate::stat(const char *path template uint64_t FileSystemTemplate::spaceNeeded(uint64_t size) { - return m_fs->spaceNeeded(size); + return m_fs.spaceNeeded(size); } template uint64_t FileSystemTemplate::available() { - return m_fs->available(); + return m_fs.available(); } template -uint64_t FileSystemTemplate::size() { - return m_fs->size(); +uint64_t FileSystemTemplate::size() const { + return m_fs.size(); } template uint8_t *FileSystemTemplate::buff() { - return m_fs->buff(); + return m_fs.buff(); } template Error FileSystemTemplate::walk(Error(*cb)(uint8_t, uint64_t, uint64_t)) { - return m_fs->walk(cb); + return m_fs.walk(cb); } template bool FileSystemTemplate::valid() const { - return m_fs && m_fs->valid(); + return m_fs.valid(); } template ValErr::FileSystemData> FileSystemTemplate::fileSystemData() const noexcept { FileSystemData fd; - auto err = m_fs->read(InodeFsData, &fd, sizeof(fd)); + auto err = m_fs.read(InodeFsData, &fd, sizeof(fd)); if (err != 0) { return {fd, err}; } diff --git a/deps/ox/src/ox/fs/fs.hpp b/deps/ox/src/ox/fs/fs.hpp index a8ddabcb..8fdf632a 100644 --- a/deps/ox/src/ox/fs/fs.hpp +++ b/deps/ox/src/ox/fs/fs.hpp @@ -8,5 +8,6 @@ #pragma once -//#include "filesystem/filesystemtemplate.hpp" +#include "filestore/filestoretemplate.hpp" +#include "filesystem/filesystem.hpp" #include "filesystem/directory.hpp" diff --git a/deps/ox/src/ox/fs/test/filestore_format.cpp b/deps/ox/src/ox/fs/test/filestore_format.cpp deleted file mode 100644 index 850f51e4..00000000 --- a/deps/ox/src/ox/fs/test/filestore_format.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2015 - 2018 gtalent2@gmail.com - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -#include - -using namespace ox; - -int main() { - const auto size = 65535; - uint8_t volume[size]; - uint32_t err = 0; - FileStore32::format(volume, size); - return err; -} diff --git a/deps/ox/src/ox/fs/test/filestoreio.cpp b/deps/ox/src/ox/fs/test/filestoreio.cpp deleted file mode 100644 index 30b73314..00000000 --- a/deps/ox/src/ox/fs/test/filestoreio.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2015 - 2018 gtalent2@gmail.com - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -#include -#include -#include - -using namespace ox; - -template -int test() { - const uint16_t size = ~0; - uint8_t volume[size]; - char out[6]; - typename FileStore::FsSize_t outSize; - FileStore::format(volume, size); - FileStore *fs = (FileStore*) volume; - - if (fs->write(1, (void*) "Hello", 6) || - fs->read(1, (char*) out, &outSize) || - ox_strcmp("Hello", out)) { - printf("Failure 1\n"); - return 1; - } - - if (fs->write(2, (void*) "World", 6) || - fs->read(2, (char*) out, &outSize) || - ox_strcmp("World", out)) { - printf("Failure 2\n"); - return 2; - } - - // make sure first value was not overwritten - if (fs->read(1, (char*) out, &outSize) || - ox_strcmp("Hello", out)) { - printf("Failure 3\n"); - return 3; - } - - if (fs->remove(1)) { - printf("Failure 4\n"); - return 4; - } - - // make sure inode is not found - if (fs->read(1, (char*) out, &outSize) == 0) { - printf("Failure 5\n"); - return 5; - } - - // make sure 2 is still available - if (fs->write(2, (void*) "World", 6) || - fs->read(2, (char*) out, &outSize) || - ox_strcmp("World", out)) { - printf("Failure 6\n"); - return 6; - } - - return 0; -} - -int main() { - return test() || test() | test(); -} diff --git a/deps/ox/src/ox/fs/test/filesystem_format.cpp b/deps/ox/src/ox/fs/test/filesystem_format.cpp deleted file mode 100644 index ff115652..00000000 --- a/deps/ox/src/ox/fs/test/filesystem_format.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2015 - 2018 gtalent2@gmail.com - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#include - -using namespace ox; - -template -int test() { - const uint16_t size = ~0; - uint8_t volume[size]; - FileSystem::format(volume, size, true); - return 0; -} - -int main() { - return test() | test() | test(); -} diff --git a/deps/ox/src/ox/fs/test/tests.cpp b/deps/ox/src/ox/fs/test/tests.cpp index ddd58f3d..dd5f2763 100644 --- a/deps/ox/src/ox/fs/test/tests.cpp +++ b/deps/ox/src/ox/fs/test/tests.cpp @@ -137,7 +137,7 @@ map tests = { [](string) { int err = 0; constexpr auto buffLen = 5000; - auto list = new (ox_alloca(buffLen)) ox::ptrarith::NodeBuffer>(buffLen); + auto list = new (ox_alloca(buffLen)) ox::ptrarith::NodeBuffer>(buffLen); oxAssert(list->malloc(50).valid(), "NodeBuffer::insert: malloc 1 failed"); oxAssert(list->malloc(50).valid(), "NodeBuffer::insert: malloc 2 failed"); auto first = list->firstItem(); @@ -154,9 +154,9 @@ map tests = { constexpr auto str1Len = ox_strlen(str1) + 1; constexpr auto str2 = "Hello, Moon!"; constexpr auto str2Len = ox_strlen(str2) + 1; - auto list = new (ox_alloca(buffLen)) ox::ptrarith::NodeBuffer>(buffLen); - ox::fs::FileStore32 fileStore(list, buffLen); - oxAssert(fileStore.format() == 0, "FileStore::format failed."); + auto list = new (ox_alloca(buffLen)) ox::ptrarith::NodeBuffer>(buffLen); + oxAssert(ox::FileStore32::format(list, buffLen) == 0, "FileStore::format failed."); + ox::FileStore32 fileStore(list, buffLen); oxAssert(fileStore.write(4, const_cast(str1), str1Len, 1) == 0, "FileStore::write 1 failed."); oxAssert(fileStore.write(5, const_cast(str2), str2Len, 1) == 0, "FileStore::write 2 failed."); @@ -171,9 +171,9 @@ map tests = { "Directory", [](string) { std::array fsBuff; - ox::fs::FileStore32 fileStore(fsBuff.data(), fsBuff.size()); - fileStore.format(); - auto dir = ox_malloca(1000, ox::fs::Directory32, &fileStore, 100); + ox::FileStore32::format(fsBuff.data(), fsBuff.size()); + ox::FileStore32 fileStore(fsBuff.data(), fsBuff.size()); + auto dir = ox_malloca(1000, ox::Directory32, fileStore, 100); oxTrace("ox::fs::test::Directory") << "Init"; oxAssert(dir->init(), "Init failed"); @@ -198,11 +198,9 @@ map tests = { "FileSystem", [](string) { std::array fsBuff; - ox::fs::FileStore32 fileStore(fsBuff.data(), fsBuff.size()); - ox::fs::FileSystem32 fs(&fileStore); - oxTrace("ox::fs::test::FileSystem") << "format"; - oxAssert(fs.format(), "FileSystem format failed"); + oxAssert(ox::FileSystem32::format(fsBuff.data(), fsBuff.size()), "FileSystem format failed"); + ox::FileSystem32 fs(ox::FileStore32(fsBuff.data(), fsBuff.size())); oxTrace("ox::fs::test::FileSystem") << "mkdir"; oxAssert(fs.mkdir("/l1d1/l2d1/l3d1", true), "mkdir failed"); diff --git a/deps/ox/src/ox/ptrarith/nodebuffer.hpp b/deps/ox/src/ox/ptrarith/nodebuffer.hpp index 7621a76d..925bc023 100644 --- a/deps/ox/src/ox/ptrarith/nodebuffer.hpp +++ b/deps/ox/src/ox/ptrarith/nodebuffer.hpp @@ -142,7 +142,8 @@ class __attribute__((packed)) NodeBuffer { */ size_t spaceNeeded(size_t size); - void compact(void (*cb)(ItemPtr itemMoved) = nullptr); + template + void compact(F cb = [](uint64_t, ItemPtr) {}); void truncate(); @@ -174,7 +175,7 @@ typename NodeBuffer::Iterator NodeBuffer::iterator() template typename NodeBuffer::ItemPtr NodeBuffer::firstItem() { - oxTrace("ox::ptrarith::NodeBuffer::firstItem") << m_header.firstItem; + //oxTrace("ox::ptrarith::NodeBuffer::firstItem") << m_header.firstItem; return ptr(m_header.firstItem); } @@ -215,10 +216,10 @@ typename NodeBuffer::ItemPtr NodeBuffer::ptr(size_t itemSpace >= item->fullSize()) { return ItemPtr(this, m_header.size, itemOffset, item->fullSize()); } else { - oxTrace("ox::ptrarith::NodeBuffer::ptr::null") << "itemOffset:" << itemOffset; - oxTrace("ox::ptrarith::NodeBuffer::ptr::null") << "itemOffset >= sizeof(Header):" << (itemOffset >= sizeof(Header)); - oxTrace("ox::ptrarith::NodeBuffer::ptr::null") << "itemSpace >= sizeof(Item):" << (itemSpace >= sizeof(Item)); - oxTrace("ox::ptrarith::NodeBuffer::ptr::null") << "itemSpace >= item->fullSize():" << (itemSpace >= item->fullSize()); + //oxTrace("ox::ptrarith::NodeBuffer::ptr::null") << "itemOffset:" << itemOffset; + //oxTrace("ox::ptrarith::NodeBuffer::ptr::null") << "itemOffset >= sizeof(Header):" << (itemOffset >= sizeof(Header)); + //oxTrace("ox::ptrarith::NodeBuffer::ptr::null") << "itemSpace >= sizeof(Item):" << (itemSpace >= sizeof(Item)); + //oxTrace("ox::ptrarith::NodeBuffer::ptr::null") << "itemSpace >= item->fullSize():" << (itemSpace >= item->fullSize()); return ItemPtr(this, m_header.size, 0, 0); } } @@ -324,15 +325,14 @@ size_t NodeBuffer::spaceNeeded(size_t size) { } template -void NodeBuffer::compact(void (*cb)(ItemPtr)) { +template +void NodeBuffer::compact(F cb) { auto src = firstItem(); auto dest = ptr(sizeof(*this)); while (src.valid() && dest.valid()) { // move node ox_memcpy(dest, src, src.size()); - if (cb) { - cb(dest); - } + cb(src, dest); // update surrounding nodes auto prev = ptr(dest->next); if (prev.valid()) { diff --git a/deps/ox/src/ox/std/random.hpp b/deps/ox/src/ox/std/random.hpp index ce089d1c..72108e0b 100644 --- a/deps/ox/src/ox/std/random.hpp +++ b/deps/ox/src/ox/std/random.hpp @@ -14,7 +14,7 @@ namespace ox { using RandomSeed = uint64_t[2]; -class Random { +class __attribute__((packed)) Random { private: RandomSeed m_seed; diff --git a/deps/ox/src/ox/trace/trace.cpp b/deps/ox/src/ox/trace/trace.cpp index d8df0998..2d93845a 100644 --- a/deps/ox/src/ox/trace/trace.cpp +++ b/deps/ox/src/ox/trace/trace.cpp @@ -19,7 +19,11 @@ namespace ox::trace { +#if defined(OX_USE_STDLIB) static const auto OxPrintTrace = std::getenv("OXTRACE"); +#else +static const auto OxPrintTrace = false; +#endif namespace gdblogger {