data structure cleanup

This commit is contained in:
nakst 2021-12-19 14:48:26 +00:00
parent 0af72eb18d
commit acee390166
16 changed files with 89 additions and 126 deletions

View File

@ -8,8 +8,6 @@
#include <shared/hash_table.cpp>
#include <shared/array.cpp>
#include <shared/arena.cpp>
#define IMPLEMENTATION
#include <shared/arena.cpp>
// TODO Possible candidates for moving in the core API:
// - String/paths utils

View File

@ -624,15 +624,15 @@ EsError InstallGPT(EsBlockDeviceInformation driveInformation, EsMessageDevice dr
partitionTable[1].firstLBA = partitionTable[0].lastLBA + 1;
partitionTable[1].lastLBA = header->lastUsableLBA;
header->tableCRC32 = CalculateCRC32(partitionTable, partitionEntryCount * sizeof(GPTEntry));
header->headerCRC32 = CalculateCRC32(header, header->headerBytes);
header->tableCRC32 = CalculateCRC32(partitionTable, partitionEntryCount * sizeof(GPTEntry), 0);
header->headerCRC32 = CalculateCRC32(header, header->headerBytes, 0);
GPTHeader *backupHeader = (GPTHeader *) EsHeapAllocate(driveInformation.sectorSize, true);
EsMemoryCopy(backupHeader, header, driveInformation.sectorSize);
backupHeader->headerSelfLBA = header->headerBackupLBA;
backupHeader->headerBackupLBA = header->headerSelfLBA;
backupHeader->headerCRC32 = 0;
backupHeader->headerCRC32 = CalculateCRC32(backupHeader, header->headerBytes);
backupHeader->headerCRC32 = CalculateCRC32(backupHeader, header->headerBytes, 0);
parameters[0] = 0;
parameters[1] = driveInformation.sectorSize;

View File

@ -27,7 +27,6 @@
#define SHARED_COMMON_WANT_ALL
#define SHARED_MATH_WANT_ALL
#include <shared/ini.h>
#include <shared/avl_tree.cpp>
#include <shared/heap.cpp>
#include <shared/linked_list.cpp>
#include <shared/hash.cpp>
@ -1901,7 +1900,7 @@ const void *EsBundleFind(const EsBundle *bundle, const char *_name, ptrdiff_t na
const BundleHeader *header = bundle->base;
const BundleFile *files = (const BundleFile *) (header + 1);
uint64_t name = CalculateCRC64(_name, nameBytes);
uint64_t name = CalculateCRC64(_name, nameBytes, 0);
for (uintptr_t i = 0; i < header->fileCount; i++) {
if (files[i].nameCRC64 == name) {

View File

@ -1245,7 +1245,7 @@ const void *GetConstant(const char *cKey, size_t *byteCount, bool *scale) {
const ThemeHeader *header = (const ThemeHeader *) EsBufferRead(&data, sizeof(ThemeHeader));
EsBufferRead(&data, sizeof(ThemeStyle) * header->styleCount);
uint64_t hash = CalculateCRC64(EsLiteral(cKey));
uint64_t hash = CalculateCRC64(EsLiteral(cKey), 0);
for (uintptr_t i = 0; i < header->constantCount; i++) {
const ThemeConstant *constant = (const ThemeConstant *) EsBufferRead(&data, sizeof(ThemeConstant));

View File

@ -51,7 +51,7 @@ static bool AccessBlock(Volume *volume, uint64_t index, uint64_t count, void *bu
static bool ValidateIndexVertex(Superblock *superblock, IndexVertex *vertex) {
uint32_t checksum = vertex->checksum;
vertex->checksum = 0;
uint32_t calculated = CalculateCRC32(vertex, superblock->blockSize);
uint32_t calculated = CalculateCRC32(vertex, superblock->blockSize, 0);
ESFS_CHECK(checksum == calculated, "ValidateIndexVertex - Invalid vertex checksum.");
ESFS_CHECK(0 == EsMemoryCompare(vertex->signature, ESFS_INDEX_VERTEX_SIGNATURE, 4), "ValidateIndexVertex - Invalid vertex signature.");
@ -69,7 +69,7 @@ static EsError FindDirectoryEntryReferenceFromIndex(Volume *volume, uint8_t *buf
Superblock *superblock = &volume->superblock;
// Get the root vertex.
uint64_t nameHash = CalculateCRC64(name, nameLength);
uint64_t nameHash = CalculateCRC64(name, nameLength, 0);
IndexVertex *vertex = (IndexVertex *) buffer;
if (!AccessBlock(volume, rootBlock, 1, vertex, FS_BLOCK_ACCESS_CACHED, K_ACCESS_READ)) {
@ -112,7 +112,7 @@ static EsError FindDirectoryEntryReferenceFromIndex(Volume *volume, uint8_t *buf
static bool ValidateDirectoryEntry(Volume *volume, DirectoryEntry *entry) {
uint32_t checksum = entry->checksum;
entry->checksum = 0;
uint32_t calculated = CalculateCRC32(entry, sizeof(DirectoryEntry));
uint32_t calculated = CalculateCRC32(entry, sizeof(DirectoryEntry), 0);
entry->checksum = calculated;
ESFS_CHECK_VA(checksum == calculated, "ValidateDirectoryEntry - Invalid checksum (%x, calculated %x).", checksum, calculated);
@ -346,7 +346,7 @@ static void Sync(KNode *_directory, KNode *node) {
{
file->entry.checksum = 0;
file->entry.checksum = CalculateCRC32(&file->entry, sizeof(DirectoryEntry));
file->entry.checksum = CalculateCRC32(&file->entry, sizeof(DirectoryEntry), 0);
}
uint8_t *blockBuffer = (uint8_t *) EsHeapAllocate(superblock->blockSize, false, K_FIXED);
@ -462,14 +462,14 @@ static uint64_t FindLargestExtent(uint8_t *bitmap, Superblock *superblock) {
static bool ValidateGroupDescriptor(GroupDescriptor *descriptor) {
uint32_t checksum = descriptor->checksum;
descriptor->checksum = 0;
uint32_t calculated = CalculateCRC32(descriptor, sizeof(GroupDescriptor));
uint32_t calculated = CalculateCRC32(descriptor, sizeof(GroupDescriptor), 0);
ESFS_CHECK(checksum == calculated, "ValidateGroupDescriptor - Invalid checksum.");
ESFS_CHECK(0 == EsMemoryCompare(descriptor->signature, ESFS_GROUP_DESCRIPTOR_SIGNATURE, 4), "ValidateGroupDescriptor - Invalid signature.");
return true;
}
static bool ValidateBlockBitmap(GroupDescriptor *descriptor, uint8_t *bitmap, Superblock *superblock) {
uint32_t calculated = CalculateCRC32(bitmap, superblock->blocksPerGroupBlockBitmap * superblock->blockSize);
uint32_t calculated = CalculateCRC32(bitmap, superblock->blocksPerGroupBlockBitmap * superblock->blockSize, 0);
ESFS_CHECK(calculated == descriptor->bitmapChecksum, "ValidateBlockBitmap - Invalid checksum.");
uint32_t blocksUsed = 0;
@ -586,9 +586,9 @@ static bool AllocateExtent(Volume *volume, uint64_t nearby, uint64_t increaseBlo
target->largestExtent = FindLargestExtent(bitmap, superblock);
target->blocksUsed += *extentCount;
target->bitmapChecksum = CalculateCRC32(bitmap, superblock->blocksPerGroupBlockBitmap * superblock->blockSize);
target->bitmapChecksum = CalculateCRC32(bitmap, superblock->blocksPerGroupBlockBitmap * superblock->blockSize, 0);
target->checksum = 0;
target->checksum = CalculateCRC32(target, sizeof(GroupDescriptor));
target->checksum = CalculateCRC32(target, sizeof(GroupDescriptor), 0);
}
*extentStart += (target - volume->groupDescriptorTable) * superblock->blocksPerGroup;
@ -662,10 +662,10 @@ static bool FreeExtent(Volume *volume, uint64_t extentStart, uint64_t extentCoun
}
target->largestExtent = FindLargestExtent(bitmap, superblock);
target->bitmapChecksum = CalculateCRC32(bitmap, superblock->blocksPerGroupBlockBitmap * superblock->blockSize);
target->bitmapChecksum = CalculateCRC32(bitmap, superblock->blocksPerGroupBlockBitmap * superblock->blockSize, 0);
target->blocksUsed -= extentCount;
target->checksum = 0;
target->checksum = CalculateCRC32(target, sizeof(GroupDescriptor));
target->checksum = CalculateCRC32(target, sizeof(GroupDescriptor), 0);
superblock->blocksUsed -= extentCount;
volume->spaceUsed -= extentCount * superblock->blockSize;
@ -984,7 +984,7 @@ static bool IndexModifyKey(Volume *volume, uint64_t newKey, DirectoryEntryRefere
&& keys[i].data.offsetIntoBlock + sizeof(DirectoryEntry) <= superblock->blockSize,
"IndexModifyKey - Invalid key entry.");
keys[i].data = reference;
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize);
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize, 0);
return AccessBlock(volume, block, 1, vertex, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE);
}
}
@ -1162,8 +1162,8 @@ static bool IndexAddKey(Volume *volume, uint64_t newKey, DirectoryEntryReference
// Write the blocks.
sibling->checksum = 0; sibling->checksum = CalculateCRC32(sibling, superblock->blockSize);
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize);
sibling->checksum = 0; sibling->checksum = CalculateCRC32(sibling, superblock->blockSize, 0);
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize, 0);
ESFS_CHECK(AccessBlock(volume, siblingBlock, 1, sibling, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE), "IndexAddKey - Could not update index.");
ESFS_CHECK(AccessBlock(volume, blocks[depth], 1, vertex, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE), "IndexAddKey - Could not update index.");
@ -1175,7 +1175,7 @@ static bool IndexAddKey(Volume *volume, uint64_t newKey, DirectoryEntryReference
// Write the block.
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize);
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize, 0);
ESFS_CHECK(AccessBlock(volume, blocks[depth], 1, vertex, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE), "IndexAddKey - Could not update index.");
return true;
@ -1245,7 +1245,7 @@ static bool IndexRemoveKey(Volume *volume, uint64_t removeKey, uint64_t *rootBlo
ESFS_VERTEX_KEY(vertex, position)->value = ESFS_VERTEX_KEY(search, 0)->value;
ESFS_VERTEX_KEY(vertex, position)->data = ESFS_VERTEX_KEY(search, 0)->data;
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize);
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize, 0);
ESFS_CHECK(AccessBlock(volume, blocks[startDepth], 1, vertex, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE), "IndexRemoveKey - Could not write index.");
EsMemoryCopy(vertex, search, superblock->blockSize);
@ -1264,7 +1264,7 @@ static bool IndexRemoveKey(Volume *volume, uint64_t removeKey, uint64_t *rootBlo
if (vertex->count >= (vertex->maxCount - 1) / 2) {
// EsPrint("Vertex has enough keys, exiting...\n");
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize);
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize, 0);
ESFS_CHECK(AccessBlock(volume, blocks[depth], 1, vertex, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE), "IndexRemoveKey - Could not write index.");
return true;
}
@ -1281,7 +1281,7 @@ static bool IndexRemoveKey(Volume *volume, uint64_t removeKey, uint64_t *rootBlo
*rootBlock = vertex->keys[0].child;
} else {
// EsPrint("Vertex is at root, exiting...\n");
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize);
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize, 0);
ESFS_CHECK(AccessBlock(volume, blocks[depth], 1, vertex, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE), "IndexRemoveKey - Could not write index.");
}
@ -1325,9 +1325,9 @@ static bool IndexRemoveKey(Volume *volume, uint64_t removeKey, uint64_t *rootBlo
sibling->count--, vertex->count++;
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize);
sibling->checksum = 0; sibling->checksum = CalculateCRC32(sibling, superblock->blockSize);
parent->checksum = 0; parent->checksum = CalculateCRC32(parent, superblock->blockSize);
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize, 0);
sibling->checksum = 0; sibling->checksum = CalculateCRC32(sibling, superblock->blockSize, 0);
parent->checksum = 0; parent->checksum = CalculateCRC32(parent, superblock->blockSize, 0);
ESFS_CHECK(AccessBlock(volume, ESFS_VERTEX_KEY(parent, positionInParent - 1)->child, 1, sibling, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE), "IndexRemoveKey - Could not write index.");
ESFS_CHECK(AccessBlock(volume, blocks[depth], 1, vertex, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE), "IndexRemoveKey - Could not write index.");
@ -1353,9 +1353,9 @@ static bool IndexRemoveKey(Volume *volume, uint64_t removeKey, uint64_t *rootBlo
sibling->count--, vertex->count++;
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize);
sibling->checksum = 0; sibling->checksum = CalculateCRC32(sibling, superblock->blockSize);
parent->checksum = 0; parent->checksum = CalculateCRC32(parent, superblock->blockSize);
vertex->checksum = 0; vertex->checksum = CalculateCRC32(vertex, superblock->blockSize, 0);
sibling->checksum = 0; sibling->checksum = CalculateCRC32(sibling, superblock->blockSize, 0);
parent->checksum = 0; parent->checksum = CalculateCRC32(parent, superblock->blockSize, 0);
ESFS_CHECK(AccessBlock(volume, ESFS_VERTEX_KEY(parent, positionInParent + 1)->child, 1, sibling, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE), "IndexRemoveKey - Could not write index.");
ESFS_CHECK(AccessBlock(volume, blocks[depth], 1, vertex, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE), "IndexRemoveKey - Could not write index.");
@ -1397,7 +1397,7 @@ static bool IndexRemoveKey(Volume *volume, uint64_t removeKey, uint64_t *rootBlo
ESFS_CHECK(FreeExtent(volume, blocks[depth], 1), "IndexRemoveKey - Could not free merged vertex.");
}
sibling->checksum = 0; sibling->checksum = CalculateCRC32(sibling, superblock->blockSize);
sibling->checksum = 0; sibling->checksum = CalculateCRC32(sibling, superblock->blockSize, 0);
ESFS_CHECK(AccessBlock(volume, ESFS_VERTEX_KEY(parent, positionInParent - 1)->child, 1, sibling, FS_BLOCK_ACCESS_CACHED, K_ACCESS_WRITE), "IndexRemoveKey - Could not write index.");
EsMemoryCopy(vertex, parent, superblock->blockSize);
@ -1453,7 +1453,7 @@ static EsError RemoveDirectoryEntry(FSNode *file, uint8_t *blockBuffers /* super
((FSNode *) node->driverNode)->reference = file->reference;
}
uint64_t key = CalculateCRC64(filename->filename, filename->length);
uint64_t key = CalculateCRC64(filename->filename, filename->length, 0);
// EsPrint("\tModify index key for %s\n", filename->length, filename->filename);
ESFS_CHECK_TO_ERROR(IndexModifyKey(volume, key, file->reference, directoryAttribute->indexRootBlock, blockBuffers + superblock->blockSize),
"Remove - Could not update index (2).", ES_ERROR_DRIVE_CONTROLLER_REPORTED);
@ -1475,7 +1475,7 @@ static EsError RemoveDirectoryEntry(FSNode *file, uint8_t *blockBuffers /* super
// EsPrint("\tRemoving %s from index\n", filename->length, filename->filename);
if (filename) {
uint64_t removeKey = CalculateCRC64(filename->filename, filename->length);
uint64_t removeKey = CalculateCRC64(filename->filename, filename->length, 0);
ESFS_CHECK_TO_ERROR(IndexRemoveKey(volume, removeKey, &directoryAttribute->indexRootBlock), "Remove - Could not update index.", ES_ERROR_DRIVE_CONTROLLER_REPORTED);
}
@ -1646,7 +1646,7 @@ static bool CreateInternal(const char *name, size_t nameLength, EsNodeType type,
}
entry->checksum = 0;
entry->checksum = CalculateCRC32(entry, sizeof(DirectoryEntry));
entry->checksum = CalculateCRC32(entry, sizeof(DirectoryEntry), 0);
if (!ValidateDirectoryEntry(volume, entry)) KernelPanic("EsFS::CreateInternal - Created directory entry is invalid.\n");
// Write the directory entry.
@ -1658,7 +1658,7 @@ static bool CreateInternal(const char *name, size_t nameLength, EsNodeType type,
// Add the node into the index.
uint64_t newKey = CalculateCRC64(name, nameLength);
uint64_t newKey = CalculateCRC64(name, nameLength, 0);
ESFS_CHECK(IndexAddKey(volume, newKey, reference, &directoryAttribute->indexRootBlock), "Create - Could not add file to index.");
directoryAttribute->childNodes++;
@ -1681,7 +1681,7 @@ static EsError Move(KNode *_oldDirectory, KNode *_file, KNode *_newDirectory, co
if (oldDirectory->type != ES_NODE_DIRECTORY || newDirectory->type != ES_NODE_DIRECTORY) KernelPanic("EsFS::Move - Incorrect node types.\n");
file->entry.checksum = 0;
file->entry.checksum = CalculateCRC32(&file->entry, sizeof(DirectoryEntry));
file->entry.checksum = CalculateCRC32(&file->entry, sizeof(DirectoryEntry), 0);
if (!ValidateDirectoryEntry(volume, &file->entry)) KernelPanic("EsFS::Move - Existing entry is invalid.\n");
uint8_t *buffers = (uint8_t *) EsHeapAllocate(superblock->blockSize * 2, true, K_FIXED);
@ -1854,7 +1854,7 @@ static bool Mount(Volume *volume, EsFileOffsetDifference *rootDirectoryChildren)
uint32_t checksum = volume->superblock.checksum;
volume->superblock.checksum = 0;
uint32_t calculated = CalculateCRC32(&volume->superblock, sizeof(Superblock));
uint32_t calculated = CalculateCRC32(&volume->superblock, sizeof(Superblock), 0);
ESFS_CHECK_FATAL(checksum == calculated, "Invalid superblock checksum.");
ESFS_CHECK_FATAL(0 == EsMemoryCompare(volume->superblock.signature, ESFS_SIGNATURE_STRING, 16), "Invalid superblock signature.");
@ -1881,7 +1881,7 @@ static bool Mount(Volume *volume, EsFileOffsetDifference *rootDirectoryChildren)
if (!volume->readOnly) {
superblock->mounted = true;
superblock->checksum = 0;
superblock->checksum = CalculateCRC32(superblock, sizeof(Superblock));
superblock->checksum = CalculateCRC32(superblock, sizeof(Superblock), 0);
ESFS_CHECK_ERROR_READ_ONLY(volume->Access(ESFS_BOOT_SUPER_BLOCK_SIZE, ESFS_BOOT_SUPER_BLOCK_SIZE,
K_ACCESS_WRITE, (uint8_t *) superblock, ES_FLAGS_DEFAULT), "Could not mark volume as mounted.");
}
@ -1957,7 +1957,7 @@ static void Unmount(KFileSystem *fileSystem) {
superblock->mounted = false;
superblock->checksum = 0;
superblock->checksum = CalculateCRC32(superblock, sizeof(Superblock));
superblock->checksum = CalculateCRC32(superblock, sizeof(Superblock), 0);
volume->Access(ESFS_BOOT_SUPER_BLOCK_SIZE, ESFS_BOOT_SUPER_BLOCK_SIZE, K_ACCESS_WRITE,
(uint8_t *) superblock, ES_FLAGS_DEFAULT);
}

View File

@ -516,7 +516,7 @@ static void DeviceAttach(KDevice *parent) {
volume->spaceUsed = volume->primaryDescriptor.volumeSize.x * volume->primaryDescriptor.logicalBlockSize.x;
volume->spaceTotal = volume->spaceUsed;
uint64_t crc64 = CalculateCRC64(&volume->primaryDescriptor, sizeof(PrimaryDescriptor));
uint64_t crc64 = CalculateCRC64(&volume->primaryDescriptor, sizeof(PrimaryDescriptor), 0);
EsMemoryCopy(&volume->identifier, &crc64, sizeof(crc64));
volume->nameBytes = sizeof(volume->primaryDescriptor.volumeIdentifier);

View File

@ -168,7 +168,7 @@ EsError KLoadELF(KNode *node, KLoadedExecutable *executable) {
// Look for the executable in the bundle.
uint64_t name = CalculateCRC64(EsLiteral("$Executables/" K_ARCH_NAME));
uint64_t name = CalculateCRC64(EsLiteral("$Executables/" K_ARCH_NAME), 0);
BundleFile *files = (BundleFile *) ((BundleHeader *) header.mapAddress + 1);
bool found = false;

View File

@ -181,10 +181,23 @@ extern "C" {
// Kernel components.
// ---------------------------------------------------------------------------------------------------------------
#include <shared/avl_tree.cpp>
#ifndef IMPLEMENTATION
#include <shared/bitset.cpp>
#include <shared/range_set.cpp>
#include <shared/arena.cpp>
#include <shared/avl_tree.cpp>
#include <shared/range_set.cpp>
#include <shared/ini.h>
#include <shared/partitions.cpp>
#include <shared/heap.cpp>
#include <shared/hash.cpp>
#define ARRAY_IMPLEMENTATION_ONLY
#include <shared/array.cpp>
#define SHARED_COMMON_WANT_ALL
#include <shared/strings.cpp>
#include <shared/common.cpp>
#endif
#include "objects.cpp"
#include "memory.cpp"
@ -203,14 +216,6 @@ extern "C" {
#include "posix.cpp"
#endif
#ifndef IMPLEMENTATION
#define ARRAY_IMPLEMENTATION_ONLY
#include <shared/array.cpp>
#include <shared/heap.cpp>
#include <shared/partitions.cpp>
#include <shared/ini.h>
#endif
// ---------------------------------------------------------------------------------------------------------------
// Miscellaneous.
// ---------------------------------------------------------------------------------------------------------------

View File

@ -205,14 +205,6 @@ struct PMM {
// See MMPhysicalAllocate.
alignas(K_PAGE_SIZE) uint8_t earlyZeroBuffer[K_PAGE_SIZE];
// Memory spaces.
// kernelMMSpace - Whence the kernel allocates memory.
// coreMMSpace - Whence other memory managers allocate memory.
extern MMSpace _kernelMMSpace, _coreMMSpace;
#define kernelMMSpace (&_kernelMMSpace)
#define coreMMSpace (&_coreMMSpace)
// Constants.
// MMArchMapPage.

View File

@ -110,21 +110,17 @@ void KUnregisterMSI(uintptr_t tag);
// Common data types, algorithms and things.
// ---------------------------------------------------------------------------------------------------------------
#define SHARED_MATH_WANT_BASIC_UTILITIES
#include <shared/math.cpp>
#ifndef K_IN_CORE_KERNEL
#define SHARED_DEFINITIONS_ONLY
#endif
#define SHARED_MATH_WANT_BASIC_UTILITIES
#include <shared/unicode.cpp>
#include <shared/math.cpp>
#include <shared/linked_list.cpp>
#include <shared/hash.cpp>
#ifdef K_IN_CORE_KERNEL
#define SHARED_COMMON_WANT_ALL
#include <shared/strings.cpp>
#include <shared/common.cpp>
#endif
uint32_t CalculateCRC32(const void *_buffer, size_t length, uint32_t carry);
uint64_t CalculateCRC64(const void *_buffer, size_t length, uint64_t carry);
// ---------------------------------------------------------------------------------------------------------------
// Processor IO.
@ -340,6 +336,15 @@ struct MMSpace;
MMSpace *MMGetKernelSpace();
MMSpace *MMGetCurrentProcessSpace();
#ifdef K_IN_CORE_KERNEL
// Memory spaces.
// kernelMMSpace - Whence the kernel allocates memory.
// coreMMSpace - Whence other memory managers allocate memory.
extern MMSpace _kernelMMSpace, _coreMMSpace;
#define kernelMMSpace (&_kernelMMSpace)
#define coreMMSpace (&_coreMMSpace)
#endif
#define MM_REGION_FIXED (0x01) // A region where all the physical pages are allocated up-front, and cannot be removed from the working set.
#define MM_REGION_NOT_CACHEABLE (0x02) // Do not cache the pages in the region.
#define MM_REGION_NO_COMMIT_TRACKING (0x04) // Page committing is manually tracked.

View File

@ -2,8 +2,6 @@
// It is released under the terms of the MIT license -- see LICENSE.md.
// Written by: nakst.
#ifndef IMPLEMENTATION
struct Arena {
// Arenas are not thread-safe!
// You can use different arenas in different threads, though.
@ -15,8 +13,6 @@ void *ArenaAllocate(Arena *arena, bool zero); // Not thread-safe.
void ArenaFree(Arena *arena, void *pointer); // Not thread-safe.
void ArenaInitialise(Arena *arena, size_t blockSize, size_t itemSize);
#else
struct ArenaSlot {
uintptr_t indexInBlock;
ArenaSlot *nextEmpty, **previousEmpty;
@ -120,5 +116,3 @@ void ArenaInitialise(Arena *arena, size_t blockSize, size_t itemSize) {
if (arena->slotsPerBlock < 32) arena->slotsPerBlock = 32;
arena->blockSize = arena->slotsPerBlock * arena->slotSize;
}
#endif

View File

@ -2,18 +2,10 @@
// It is released under the terms of the MIT license -- see LICENSE.md.
// Written by: nakst.
#ifndef IMPLEMENTATION
#ifdef DEBUG_BUILD
#define TREE_VALIDATE
#endif
#ifdef KERNEL
#define AVLPanic KernelPanic
#else
#define AVLPanic(...) do { EsPrint(__VA_ARGS__); EsAssert(false); } while (0)
#endif
enum TreeSearchMode {
TREE_SEARCH_EXACT,
TREE_SEARCH_SMALLEST_ABOVE_OR_EQUAL,
@ -118,19 +110,19 @@ template <class T>
int TreeValidate(AVLItem<T> *root, bool before, AVLTree<T> *tree, AVLItem<T> *parent = nullptr, int depth = 0) {
#ifdef TREE_VALIDATE
if (!root) return 0;
if (root->parent != parent) AVLPanic("TreeValidate - Invalid binary tree 1 (%d).\n", before);
if (root->tree != tree) AVLPanic("TreeValidate - Invalid binary tree 4 (%d).\n", before);
if (root->parent != parent) EsPanic("TreeValidate - Invalid binary tree 1 (%d).\n", before);
if (root->tree != tree) EsPanic("TreeValidate - Invalid binary tree 4 (%d).\n", before);
AVLItem<T> *left = root->children[0];
AVLItem<T> *right = root->children[1];
if (left && TreeCompare(tree, &left->key, &root->key) > 0) AVLPanic("TreeValidate - Invalid binary tree 2 (%d).\n", before);
if (right && TreeCompare(tree, &right->key, &root->key) < 0) AVLPanic("TreeValidate - Invalid binary tree 3 (%d).\n", before);
if (left && TreeCompare(tree, &left->key, &root->key) > 0) EsPanic("TreeValidate - Invalid binary tree 2 (%d).\n", before);
if (right && TreeCompare(tree, &right->key, &root->key) < 0) EsPanic("TreeValidate - Invalid binary tree 3 (%d).\n", before);
int leftHeight = TreeValidate(left, before, tree, root, depth + 1);
int rightHeight = TreeValidate(right, before, tree, root, depth + 1);
int height = (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
if (height != root->height) AVLPanic("TreeValidate - Invalid AVL tree 1 (%d).\n", before);
if (height != root->height) EsPanic("TreeValidate - Invalid AVL tree 1 (%d).\n", before);
#if 0
static int maxSeenDepth = 0;
@ -203,14 +195,14 @@ enum AVLDuplicateKeyPolicy {
template <class T>
bool TreeInsert(AVLTree<T> *tree, AVLItem<T> *item, T *thisItem, AVLKey key, AVLDuplicateKeyPolicy duplicateKeyPolicy = AVL_DUPLICATE_KEYS_PANIC) {
if (tree->modCheck) AVLPanic("TreeInsert - Concurrent modification\n");
if (tree->modCheck) EsPanic("TreeInsert - Concurrent modification\n");
tree->modCheck = true; EsDefer({tree->modCheck = false;});
TreeValidate(tree->root, true, tree);
#ifdef TREE_VALIDATE
if (item->tree) {
AVLPanic("TreeInsert - Item %x already in tree %x (adding to %x).\n", item, item->tree, tree);
EsPanic("TreeInsert - Item %x already in tree %x (adding to %x).\n", item, item->tree, tree);
}
item->tree = tree;
@ -234,7 +226,7 @@ bool TreeInsert(AVLTree<T> *tree, AVLItem<T> *item, T *thisItem, AVLKey key, AVL
if (TreeCompare(tree, &item->key, &node->key) == 0) {
if (duplicateKeyPolicy == AVL_DUPLICATE_KEYS_PANIC) {
AVLPanic("TreeInsertRecursive - Duplicate keys: %x and %x both have key %x.\n", item, node, node->key);
EsPanic("TreeInsertRecursive - Duplicate keys: %x and %x both have key %x.\n", item, node, node->key);
} else if (duplicateKeyPolicy == AVL_DUPLICATE_KEYS_FAIL) {
return false;
}
@ -310,14 +302,14 @@ AVLItem<T> *TreeFindRecursive(AVLTree<T> *tree, AVLItem<T> *root, AVLKey *key, T
return TreeFindRecursive(tree, root->children[0], key, mode);
}
} else {
AVLPanic("TreeFindRecursive - Invalid search mode.\n");
EsPanic("TreeFindRecursive - Invalid search mode.\n");
return nullptr;
}
}
template <class T>
AVLItem<T> *TreeFind(AVLTree<T> *tree, AVLKey key, TreeSearchMode mode) {
if (tree->modCheck) AVLPanic("TreeFind - Concurrent access\n");
if (tree->modCheck) EsPanic("TreeFind - Concurrent access\n");
TreeValidate(tree->root, true, tree);
return TreeFindRecursive(tree, tree->root, &key, mode);
@ -334,13 +326,13 @@ int TreeGetBalance(AVLItem<T> *item) {
template <class T>
void TreeRemove(AVLTree<T> *tree, AVLItem<T> *item) {
if (tree->modCheck) AVLPanic("TreeRemove - Concurrent modification\n");
if (tree->modCheck) EsPanic("TreeRemove - Concurrent modification\n");
tree->modCheck = true; EsDefer({tree->modCheck = false;});
TreeValidate(tree->root, true, tree);
#ifdef TREE_VALIDATE
if (item->tree != tree) AVLPanic("TreeRemove - Item %x not in tree %x (in %x).\n", item, tree, item->tree);
if (item->tree != tree) EsPanic("TreeRemove - Item %x not in tree %x (in %x).\n", item, tree, item->tree);
#endif
AVLItem<T> fakeRoot = {};
@ -395,11 +387,9 @@ void TreeRemove(AVLTree<T> *tree, AVLItem<T> *item) {
tree->root = fakeRoot.children[0];
if (tree->root) {
if (tree->root->parent != &fakeRoot) AVLPanic("TreeRemove - Incorrect root parent.\n");
if (tree->root->parent != &fakeRoot) EsPanic("TreeRemove - Incorrect root parent.\n");
tree->root->parent = nullptr;
}
TreeValidate(tree->root, false, tree);
}
#endif

View File

@ -2,8 +2,6 @@
// It is released under the terms of the MIT license -- see LICENSE.md.
// Written by: nakst.
#ifndef IMPLEMENTATION
struct Bitset {
void Initialise(size_t count, bool mapAll = false);
void PutAll();
@ -24,8 +22,6 @@ struct Bitset {
#endif
};
#else
void Bitset::Initialise(size_t count, bool mapAll) {
singleCount = (count + 31) & ~31;
groupCount = singleCount / BITSET_GROUP_SIZE + 1;
@ -192,5 +188,3 @@ void Bitset::Put(uintptr_t index) {
groupUsage[index / BITSET_GROUP_SIZE]++;
}
}
#endif

View File

@ -2,9 +2,9 @@
// Currently used for: EsFS, theme constants, build core configuration hash, make bundle.
#ifdef __cplusplus
constexpr static uint32_t crc32Table[] = {
constexpr uint32_t crc32Table[] = {
#else
static uint32_t crc32Table[] = {
uint32_t crc32Table[] = {
#endif
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
@ -41,9 +41,9 @@ static uint32_t crc32Table[] = {
};
#ifdef __cplusplus
constexpr static uint64_t crc64Table[] = {
constexpr uint64_t crc64Table[] = {
#else
static uint64_t crc64Table[] = {
uint64_t crc64Table[] = {
#endif
0x0000000000000000UL, 0x7AD870C830358979UL, 0xF5B0E190606B12F2UL, 0x8F689158505E9B8BUL, 0xC038E5739841B68FUL, 0xBAE095BBA8743FF6UL, 0x358804E3F82AA47DUL, 0x4F50742BC81F2D04UL,
0xAB28ECB46814FE75UL, 0xD1F09C7C5821770CUL, 0x5E980D24087FEC87UL, 0x24407DEC384A65FEUL, 0x6B1009C7F05548FAUL, 0x11C8790FC060C183UL, 0x9EA0E857903E5A08UL, 0xE478989FA00BD371UL,
@ -79,11 +79,7 @@ static uint64_t crc64Table[] = {
0x66E7A46C27F3AA2CUL, 0x1C3FD4A417C62355UL, 0x935745FC4798B8DEUL, 0xE98F353477AD31A7UL, 0xA6DF411FBFB21CA3UL, 0xDC0731D78F8795DAUL, 0x536FA08FDFD90E51UL, 0x29B7D047EFEC8728UL,
};
#ifdef __cplusplus
constexpr static uint32_t CalculateCRC32(const void *_buffer, size_t length, uint32_t carry = 0) {
#else
static uint32_t CalculateCRC32(const void *_buffer, size_t length, uint32_t carry) {
#endif
uint32_t CalculateCRC32(const void *_buffer, size_t length, uint32_t carry) {
const uint8_t *buffer = (const uint8_t *) _buffer;
uint32_t x = ~carry;
@ -94,11 +90,7 @@ static uint32_t CalculateCRC32(const void *_buffer, size_t length, uint32_t carr
return ~x;
}
#ifdef __cplusplus
constexpr static uint64_t CalculateCRC64(const void *_buffer, size_t length, uint64_t carry = 0) {
#else
static uint64_t CalculateCRC64(const void *_buffer, size_t length, uint64_t carry) {
#endif
uint64_t CalculateCRC64(const void *_buffer, size_t length, uint64_t carry) {
const uint8_t *buffer = (const uint8_t *) _buffer;
uint64_t x = ~carry;

View File

@ -9,14 +9,14 @@
#if defined(SHARED_MATH_WANT_BASIC_UTILITIES) || defined(SHARED_MATH_WANT_ALL)
template <class T>
T RoundDown(T value, T divisor) {
inline T RoundDown(T value, T divisor) {
value /= divisor;
value *= divisor;
return value;
}
template <class T>
T RoundUp(T value, T divisor) {
inline T RoundUp(T value, T divisor) {
value += divisor - 1;
value /= divisor;
value *= divisor;

View File

@ -2,8 +2,6 @@
// It is released under the terms of the MIT license -- see LICENSE.md.
// Written by: nakst.
#ifndef IMPLEMENTATION
struct Range {
uintptr_t from, to;
};
@ -21,8 +19,6 @@ struct RangeSet {
bool Clear(uintptr_t from, uintptr_t to, intptr_t *delta, bool modify);
};
#else
Range *RangeSet::Find(uintptr_t offset, bool touching) {
if (!ranges.Length()) return nullptr;
@ -351,8 +347,6 @@ bool RangeSet::Clear(uintptr_t from, uintptr_t to, intptr_t *delta, bool modify)
return true;
}
#endif
#if 0
int main(int argc, char **argv) {
RangeSet set = {};