Fix to pass FileStore::readWrite test for new FileStore

This commit is contained in:
Gary Talent 2018-03-15 01:03:16 -05:00
parent db7eb9a397
commit 9d70927ad4
8 changed files with 63 additions and 44 deletions

View File

@ -41,11 +41,9 @@ if(NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
endif() endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# forces colored output when using ninja # forces colored output when using ninja
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
endif() endif()
endif()
enable_testing() enable_testing()

View File

@ -1,5 +1,6 @@
cmake_minimum_required(VERSION 2.8) cmake_minimum_required(VERSION 2.8)
add_subdirectory(__buildinfo)
if(OX_USE_STDLIB STREQUAL "ON") if(OX_USE_STDLIB STREQUAL "ON")
add_subdirectory(clargs) add_subdirectory(clargs)
endif(OX_USE_STDLIB STREQUAL "ON") endif(OX_USE_STDLIB STREQUAL "ON")

View File

@ -45,7 +45,7 @@ class FileStoreTemplate: public FileStore {
using Buffer = ox::fs::NodeBuffer<size_t, FileStoreItem<size_t>>; using Buffer = ox::fs::NodeBuffer<size_t, FileStoreItem<size_t>>;
struct __attribute__((packed)) FileStoreData { struct __attribute__((packed)) FileStoreData {
ox::LittleEndian<size_t> rootNode = sizeof(NodeBuffer<size_t, FileStoreItem<size_t>>); ox::LittleEndian<size_t> rootNode;
}; };
size_t m_buffSize = 0; size_t m_buffSize = 0;
@ -83,7 +83,7 @@ class FileStoreTemplate: public FileStore {
* Places the given Item at the given ID. If it already exists, the * Places the given Item at the given ID. If it already exists, the
* existing value will be overwritten. * existing value will be overwritten.
*/ */
Error placeItem(ItemPtr root, ItemPtr item); Error placeItem(ItemPtr root, ItemPtr item, int depth = 0);
/** /**
* Finds the parent an inode by its ID. * Finds the parent an inode by its ID.
@ -93,12 +93,12 @@ class FileStoreTemplate: public FileStore {
/** /**
* Finds an inode by its ID. * Finds an inode by its ID.
*/ */
ItemPtr find(ItemPtr ptr, size_t id); ItemPtr find(ItemPtr item, InodeId_t id, int depth = 0);
/** /**
* Finds an inode by its ID. * Finds an inode by its ID.
*/ */
ItemPtr find(size_t id); ItemPtr find(InodeId_t id);
/** /**
* Gets the root inode. * Gets the root inode.
@ -183,8 +183,10 @@ Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSi
if (fsData) { if (fsData) {
auto root = m_buffer->ptr(fsData->rootNode); auto root = m_buffer->ptr(fsData->rootNode);
if (root.valid()) { if (root.valid()) {
oxTrace("ox::fs::FileStoreTemplate::write") << "Placing" << dest->id << "on" << root->id;
return placeItem(root, dest); return placeItem(root, dest);
} else { } else {
oxTrace("ox::fs::FileStoreTemplate::write") << "Initializing root inode.";
fsData->rootNode = dest; fsData->rootNode = dest;
return 0; return 0;
} }
@ -265,14 +267,15 @@ typename FileStoreTemplate<size_t>::FileStoreData *FileStoreTemplate<size_t>::fi
} }
template<typename size_t> template<typename size_t>
Error FileStoreTemplate<size_t>::placeItem(ItemPtr root, ItemPtr item) { Error FileStoreTemplate<size_t>::placeItem(ItemPtr root, ItemPtr item, int depth) {
if (depth < 5000) {
if (item->id > root->id) { if (item->id > root->id) {
auto right = m_buffer->ptr(root->right); auto right = m_buffer->ptr(root->right);
if (!right.valid() || right->id == item->id) { if (!right.valid() || right->id == item->id) {
root->right = root; root->right = root;
return 0; return 0;
} else { } else {
return placeItem(right, item); return placeItem(right, item, depth + 1);
} }
} else if (item->id < root->id) { } else if (item->id < root->id) {
auto left = m_buffer->ptr(root->left); auto left = m_buffer->ptr(root->left);
@ -280,9 +283,12 @@ Error FileStoreTemplate<size_t>::placeItem(ItemPtr root, ItemPtr item) {
root->left = root; root->left = root;
return 0; return 0;
} else { } else {
return placeItem(left, item); return placeItem(left, item, depth + 1);
} }
} }
} else {
oxTrace("ox::fs::FileStoreTemplate::placeItem::fail") << "Excessive recursion depth, stopping before stack overflow.";
}
return 1; return 1;
} }
@ -311,25 +317,36 @@ typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::findParen
} }
template<typename size_t> template<typename size_t>
typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(ItemPtr item, size_t id) { typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(ItemPtr item, InodeId_t id, int depth) {
if (depth < 5000) {
if (item.valid()) { if (item.valid()) {
if (id > item->id) { if (id > item->id) {
return find(m_buffer->ptr(item->right), id); return find(m_buffer->ptr(item->right), id, depth + 1);
} else if (id < item->id) { } else if (id < item->id) {
return find(m_buffer->ptr(item->left), id); return find(m_buffer->ptr(item->left), id, depth + 1);
} else { } else {
return item; return item;
} }
} }
} else {
oxTrace("ox::fs::FileStoreTemplate::find::fail") << "Excessive recursion depth, stopping before stack overflow. Search for:" << id;
}
return nullptr; return nullptr;
} }
template<typename size_t> template<typename size_t>
typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(size_t id) { typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(InodeId_t id) {
auto root = m_buffer->ptr(fileStoreData()->rootNode); auto fsData = fileStoreData();
if (fsData) {
auto root = m_buffer->ptr(fsData->rootNode);
if (root.valid()) { if (root.valid()) {
auto item = find(root, id); auto item = find(root, id);
return item; return item;
} else {
oxTrace("ox::fs::FileStoreTemplate::find::fail") << "No root node";
}
} else {
oxTrace("ox::fs::FileStoreTemplate::find::fail") << "No FileStore Data";
} }
return nullptr; return nullptr;
} }

View File

@ -141,7 +141,7 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::malloc(size
} else { } else {
// there is no first item, so this may be the first item // there is no first item, so this may be the first item
if (!m_header.firstItem) { if (!m_header.firstItem) {
oxTrace("ox::fs::NodeBuffer::malloc") << "No first item."; oxTrace("ox::fs::NodeBuffer::malloc") << "No first item, initializing.";
m_header.firstItem = sizeof(m_header); m_header.firstItem = sizeof(m_header);
addr = m_header.firstItem; addr = m_header.firstItem;
} }

View File

@ -350,13 +350,16 @@ map<string, int(*)(string)> tests = {
"FileStore::readWrite", "FileStore::readWrite",
[](string) { [](string) {
constexpr auto buffLen = 5000; constexpr auto buffLen = 5000;
constexpr auto str = "Hello, World!"; constexpr auto str1 = "Hello, World!";
constexpr auto strLen = ox_strlen(str); constexpr auto str1Len = ox_strlen(str1);
constexpr auto str2 = "Hello, World!";
constexpr auto str2Len = ox_strlen(str2);
uint8_t buff[buffLen]; uint8_t buff[buffLen];
auto list = new (buff) ox::fs::NodeBuffer<uint32_t, ox::fs::FileStoreItem<uint32_t>>(buffLen); auto list = new (buff) ox::fs::NodeBuffer<uint32_t, ox::fs::FileStoreItem<uint32_t>>(buffLen);
ox::fs::FileStore32 fileStore(list, buffLen); ox::fs::FileStore32 fileStore(list, buffLen);
ox_assert(fileStore.format() == 0, "FileStore::format failed."); ox_assert(fileStore.format() == 0, "FileStore::format failed.");
ox_assert(fileStore.write(5, (void*) str, strLen, 1) == 0, "FileStore::write 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.");
return 0; return 0;
} }
}, },

View File

@ -79,7 +79,7 @@ inline T bigEndianAdapt(T i) {
template<typename T> template<typename T>
class LittleEndian { class __attribute__((packed)) LittleEndian {
private: private:
T m_value; T m_value;

View File

@ -102,7 +102,7 @@ const BString<size> &BString<size>::operator+=(const char *str) {
} }
ox_memcpy(m_buff + currentLen, str, strLen); ox_memcpy(m_buff + currentLen, str, strLen);
// make sure last element is a null terminator // make sure last element is a null terminator
m_buff[cap() - 1] = 0; m_buff[currentLen + strLen] = 0;
return *this; return *this;
} }