From 381c739e46ef326341697d188b0a6fe110fcd470 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Thu, 15 Mar 2018 19:32:40 -0500 Subject: [PATCH] Add missing read to new FileStore --- deps/ox/src/ox/__buildinfo/defines.hpp | 8 ++++++ deps/ox/src/ox/fs/filestore.hpp | 2 ++ deps/ox/src/ox/fs/filestore/filestore.hpp | 8 +++--- .../src/ox/fs/filestore/filestoretemplate.cpp | 1 + .../src/ox/fs/filestore/filestoretemplate.hpp | 23 +++++++++++----- deps/ox/src/ox/fs/filestore/ptr.hpp | 27 ++++++++++++++----- deps/ox/src/ox/fs/test/tests.cpp | 12 ++++----- 7 files changed, 59 insertions(+), 22 deletions(-) diff --git a/deps/ox/src/ox/__buildinfo/defines.hpp b/deps/ox/src/ox/__buildinfo/defines.hpp index e1fcacfc..0571e2f7 100644 --- a/deps/ox/src/ox/__buildinfo/defines.hpp +++ b/deps/ox/src/ox/__buildinfo/defines.hpp @@ -28,4 +28,12 @@ constexpr auto NDebug = true; constexpr auto NDebug = false; #endif +#if defined(__BIG_ENDIAN__) +constexpr auto BigEndian = true; +constexpr auto LittleEndian = false; +#else +constexpr auto BigEndian = false; +constexpr auto LittleEndian = true; +#endif + } diff --git a/deps/ox/src/ox/fs/filestore.hpp b/deps/ox/src/ox/fs/filestore.hpp index 023ccc1f..f8e45ce3 100644 --- a/deps/ox/src/ox/fs/filestore.hpp +++ b/deps/ox/src/ox/fs/filestore.hpp @@ -706,6 +706,8 @@ int FileStore
::read(Inode *inode, typename Header::FsSize_t readStart, readSize /= sizeof(T); uint8_t *it = &(inode->getData()[readStart]); for (typename Header::FsSize_t i = 0; i < readSize; i++) { + // do byte-by-byte copy to ensure alignment is right when copying to + // final destination T val; for (size_t i = 0; i < sizeof(T); i++) { ((uint8_t*) (&val))[i] = *(it++); diff --git a/deps/ox/src/ox/fs/filestore/filestore.hpp b/deps/ox/src/ox/fs/filestore/filestore.hpp index 641a7997..44039f42 100644 --- a/deps/ox/src/ox/fs/filestore/filestore.hpp +++ b/deps/ox/src/ox/fs/filestore/filestore.hpp @@ -19,10 +19,10 @@ class FileStore { public: struct StatInfo { - InodeId_t inodeId; - InodeId_t links; - InodeId_t size; - uint8_t fileType; + InodeId_t inodeId = 0; + InodeId_t links = 0; + InodeId_t size = 0; + uint8_t fileType = 0; }; virtual Error format() = 0; diff --git a/deps/ox/src/ox/fs/filestore/filestoretemplate.cpp b/deps/ox/src/ox/fs/filestore/filestoretemplate.cpp index 93fc6a91..063b79d0 100644 --- a/deps/ox/src/ox/fs/filestore/filestoretemplate.cpp +++ b/deps/ox/src/ox/fs/filestore/filestoretemplate.cpp @@ -10,6 +10,7 @@ namespace ox::fs { +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 220e1a5d..0ad09c02 100644 --- a/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp +++ b/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp @@ -161,6 +161,7 @@ Error FileStoreTemplate::decLinks(InodeId_t id) { template Error FileStoreTemplate::write(InodeId_t id, void *data, FsSize_t dataSize, uint8_t fileType) { auto existing = find(id); + // TODO: try compacting if unable to write if (canWrite(existing, dataSize)) { // delete the old node if it exists if (existing.valid()) { @@ -203,10 +204,10 @@ Error FileStoreTemplate::write(InodeId_t id, void *data, FsSize_t dataSi template Error FileStoreTemplate::read(InodeId_t id, void *data, FsSize_t dataSize, FsSize_t *size) { auto src = find(id); - if (src.valid() && src.size() <= dataSize) { + if (src.valid()) { auto srcData = src->data(); - if (srcData.valid()) { - ox_memcpy(data, srcData, src.size()); + if (srcData.valid() && srcData.size() <= dataSize) { + ox_memcpy(data, srcData, srcData.size()); if (size) { *size = src.size(); } @@ -217,10 +218,20 @@ 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) { auto src = find(id); if (src.valid()) { - return 0; + auto srcData = src->data(); + if (srcData.valid()) { + auto sub = srcData.subPtr(readStart, readSize); + if (sub.valid()) { + ox_memcpy(data, sub, sub.size()); + if (size) { + *size = sub.size(); + } + return 0; + } + } } return 1; } @@ -369,10 +380,10 @@ bool FileStoreTemplate::canWrite(ItemPtr existing, size_t size) { return existing.size() >= size || m_buffer->spaceNeeded(size) <= m_buffer->available(); } +extern template class FileStoreTemplate; extern template class FileStoreTemplate; using FileStore16 = FileStoreTemplate; using FileStore32 = FileStoreTemplate; -using FileStore64 = FileStoreTemplate; } diff --git a/deps/ox/src/ox/fs/filestore/ptr.hpp b/deps/ox/src/ox/fs/filestore/ptr.hpp index b6bccad0..7762f38e 100644 --- a/deps/ox/src/ox/fs/filestore/ptr.hpp +++ b/deps/ox/src/ox/fs/filestore/ptr.hpp @@ -49,6 +49,10 @@ class Ptr { inline T &operator*() const; + inline Ptr subPtr(size_t offset, size_t size); + + inline Ptr subPtr(size_t offset); + inline void init(void *dataStart, size_t dataSize, size_t itemStart, size_t itemSize); }; @@ -85,15 +89,15 @@ inline size_t Ptr::end() { template inline T *Ptr::get() const { - ox_assert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::get())"); - ox_assert(valid(), "Invalid pointer access. (ox::fs::Ptr::get())"); + oxAssert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::get())"); + oxAssert(valid(), "Invalid pointer access. (ox::fs::Ptr::get())"); return reinterpret_cast(m_dataStart + m_itemOffset); } template inline T *Ptr::operator->() const { - ox_assert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::operator->())"); - ox_assert(valid(), "Invalid pointer access. (ox::fs::Ptr::operator->())"); + oxAssert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::operator->())"); + oxAssert(valid(), "Invalid pointer access. (ox::fs::Ptr::operator->())"); return reinterpret_cast(m_dataStart + m_itemOffset); } @@ -112,11 +116,22 @@ inline Ptr::operator size_t() const { template inline T &Ptr::operator*() const { - ox_assert(m_validated, "Unvalidated pointer dereference. (ox::fs::Ptr::operator*())"); - ox_assert(valid(), "Invalid pointer dereference. (ox::fs::Ptr::operator*())"); + oxAssert(m_validated, "Unvalidated pointer dereference. (ox::fs::Ptr::operator*())"); + oxAssert(valid(), "Invalid pointer dereference. (ox::fs::Ptr::operator*())"); return *static_cast(this); } +template +inline Ptr Ptr::subPtr(size_t offset, size_t size) { + auto dataSize = ((m_dataStart + offset) - m_dataStart) + m_itemSize; + return Ptr(m_dataStart, dataSize, offset, size); +} + +template +inline Ptr Ptr::subPtr(size_t offset) { + return subPtr(offset, m_itemSize - offset); +} + template inline void Ptr::init(void *dataStart, size_t dataSize, size_t itemStart, size_t itemSize) { // do some sanity checks before assuming this is valid diff --git a/deps/ox/src/ox/fs/test/tests.cpp b/deps/ox/src/ox/fs/test/tests.cpp index 4aa4a3ad..0536e550 100644 --- a/deps/ox/src/ox/fs/test/tests.cpp +++ b/deps/ox/src/ox/fs/test/tests.cpp @@ -341,8 +341,8 @@ map tests = { auto list = new (buff) ox::fs::NodeBuffer>(buffLen); err |= !(list->malloc(50).valid()); auto first = list->firstItem(); - ox_assert(first.valid(), "NodeBuffer::insert: Could not access first item"); - ox_assert(first->size() == 50, "NodeBuffer::insert: First item size invalid"); + oxAssert(first.valid(), "NodeBuffer::insert: Could not access first item"); + oxAssert(first->size() == 50, "NodeBuffer::insert: First item size invalid"); return err; } }, @@ -352,14 +352,14 @@ map tests = { constexpr auto buffLen = 5000; constexpr auto str1 = "Hello, World!"; constexpr auto str1Len = ox_strlen(str1); - constexpr auto str2 = "Hello, World!"; + constexpr auto str2 = "Hello, Moon!"; constexpr auto str2Len = ox_strlen(str2); uint8_t buff[buffLen]; auto list = new (buff) ox::fs::NodeBuffer>(buffLen); ox::fs::FileStore32 fileStore(list, buffLen); - ox_assert(fileStore.format() == 0, "FileStore::format failed."); - ox_assert(fileStore.write(4, (void*) str1, str1Len, 1) == 0, "FileStore::write 1 failed."); - ox_assert(fileStore.write(5, (void*) str2, str2Len, 1) == 0, "FileStore::write 2 failed."); + oxAssert(fileStore.format() == 0, "FileStore::format failed."); + oxAssert(fileStore.write(4, (void*) str1, str1Len, 1) == 0, "FileStore::write 1 failed."); + oxAssert(fileStore.write(5, (void*) str2, str2Len, 1) == 0, "FileStore::write 2 failed."); return 0; } },