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,10 +41,8 @@ if(NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# forces colored output when using ninja
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
endif()
# forces colored output when using ninja
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
endif()
enable_testing()

View File

@ -1,5 +1,6 @@
cmake_minimum_required(VERSION 2.8)
add_subdirectory(__buildinfo)
if(OX_USE_STDLIB STREQUAL "ON")
add_subdirectory(clargs)
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>>;
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;
@ -83,7 +83,7 @@ class FileStoreTemplate: public FileStore {
* Places the given Item at the given ID. If it already exists, the
* 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.
@ -93,12 +93,12 @@ class FileStoreTemplate: public FileStore {
/**
* 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.
*/
ItemPtr find(size_t id);
ItemPtr find(InodeId_t id);
/**
* Gets the root inode.
@ -183,8 +183,10 @@ Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSi
if (fsData) {
auto root = m_buffer->ptr(fsData->rootNode);
if (root.valid()) {
oxTrace("ox::fs::FileStoreTemplate::write") << "Placing" << dest->id << "on" << root->id;
return placeItem(root, dest);
} else {
oxTrace("ox::fs::FileStoreTemplate::write") << "Initializing root inode.";
fsData->rootNode = dest;
return 0;
}
@ -265,23 +267,27 @@ typename FileStoreTemplate<size_t>::FileStoreData *FileStoreTemplate<size_t>::fi
}
template<typename size_t>
Error FileStoreTemplate<size_t>::placeItem(ItemPtr root, ItemPtr item) {
if (item->id > root->id) {
auto right = m_buffer->ptr(root->right);
if (!right.valid() || right->id == item->id) {
root->right = root;
return 0;
} else {
return placeItem(right, item);
}
} else if (item->id < root->id) {
auto left = m_buffer->ptr(root->left);
if (!left.valid() || left->id == item->id) {
root->left = root;
return 0;
} else {
return placeItem(left, item);
Error FileStoreTemplate<size_t>::placeItem(ItemPtr root, ItemPtr item, int depth) {
if (depth < 5000) {
if (item->id > root->id) {
auto right = m_buffer->ptr(root->right);
if (!right.valid() || right->id == item->id) {
root->right = root;
return 0;
} else {
return placeItem(right, item, depth + 1);
}
} else if (item->id < root->id) {
auto left = m_buffer->ptr(root->left);
if (!left.valid() || left->id == item->id) {
root->left = root;
return 0;
} else {
return placeItem(left, item, depth + 1);
}
}
} else {
oxTrace("ox::fs::FileStoreTemplate::placeItem::fail") << "Excessive recursion depth, stopping before stack overflow.";
}
return 1;
}
@ -311,25 +317,36 @@ typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::findParen
}
template<typename size_t>
typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(ItemPtr item, size_t id) {
if (item.valid()) {
if (id > item->id) {
return find(m_buffer->ptr(item->right), id);
} else if (id < item->id) {
return find(m_buffer->ptr(item->left), id);
} else {
return item;
typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(ItemPtr item, InodeId_t id, int depth) {
if (depth < 5000) {
if (item.valid()) {
if (id > item->id) {
return find(m_buffer->ptr(item->right), id, depth + 1);
} else if (id < item->id) {
return find(m_buffer->ptr(item->left), id, depth + 1);
} else {
return item;
}
}
} else {
oxTrace("ox::fs::FileStoreTemplate::find::fail") << "Excessive recursion depth, stopping before stack overflow. Search for:" << id;
}
return nullptr;
}
template<typename size_t>
typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(size_t id) {
auto root = m_buffer->ptr(fileStoreData()->rootNode);
if (root.valid()) {
auto item = find(root, id);
return item;
typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(InodeId_t id) {
auto fsData = fileStoreData();
if (fsData) {
auto root = m_buffer->ptr(fsData->rootNode);
if (root.valid()) {
auto item = find(root, id);
return item;
} else {
oxTrace("ox::fs::FileStoreTemplate::find::fail") << "No root node";
}
} else {
oxTrace("ox::fs::FileStoreTemplate::find::fail") << "No FileStore Data";
}
return nullptr;
}

View File

@ -141,7 +141,7 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::malloc(size
} else {
// there is no first item, so this may be the first item
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);
addr = m_header.firstItem;
}

View File

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

View File

@ -14,4 +14,4 @@ void oxAssert(const char *file, int line, bool pass, const char *msg);
#define ox_assert(pass, msg) oxAssert(__FILE__, __LINE__, pass, msg)
#else
#define ox_assert(pass, msg)
#endif
#endif

View File

@ -79,7 +79,7 @@ inline T bigEndianAdapt(T i) {
template<typename T>
class LittleEndian {
class __attribute__((packed)) LittleEndian {
private:
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);
// make sure last element is a null terminator
m_buff[cap() - 1] = 0;
m_buff[currentLen + strLen] = 0;
return *this;
}