Fix to pass FileStore::readWrite test for new FileStore
This commit is contained in:
parent
db7eb9a397
commit
9d70927ad4
2
deps/ox/CMakeLists.txt
vendored
2
deps/ox/CMakeLists.txt
vendored
@ -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()
|
||||||
|
|
||||||
|
1
deps/ox/src/ox/CMakeLists.txt
vendored
1
deps/ox/src/ox/CMakeLists.txt
vendored
@ -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")
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
2
deps/ox/src/ox/fs/filestore/nodebuffer.hpp
vendored
2
deps/ox/src/ox/fs/filestore/nodebuffer.hpp
vendored
@ -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;
|
||||||
}
|
}
|
||||||
|
9
deps/ox/src/ox/fs/test/tests.cpp
vendored
9
deps/ox/src/ox/fs/test/tests.cpp
vendored
@ -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;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
2
deps/ox/src/ox/std/byteswap.hpp
vendored
2
deps/ox/src/ox/std/byteswap.hpp
vendored
@ -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;
|
||||||
|
|
||||||
|
2
deps/ox/src/ox/std/string.hpp
vendored
2
deps/ox/src/ox/std/string.hpp
vendored
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user