Files
LanguageBasics/malloc/Cpp/malloc.cpp
2025-06-07 11:38:03 -04:00

132 lines
2.7 KiB
C++

#include <cstdlib>
#include <cstdint>
/*
* Contains functions provided by the operating system
*/
namespace OurImaginaryOS
{
/*
* Return 1024byte aligned page of size PAGE_SIZE * pageCount
* e.g. GetNewPage(1) returns a 32MiB page (PAGE_SIZE)
* GetNewPage(2) returns two contiguous pages, totaling 64MiB
* GetNewPage(0) is undefined.
*/
void *GetNewPage(size_t pageCount = 1);
void FreePage(void *p);
const size_t PAGE_SIZE = 32 * 1024 * 1024;
}
/* IAllocator interface for memory allocations.
Example Usage:
struct Foo() {
IAllocator &mAllocator;
MyDynamicObject *mDynamicObject;
void Foo(IAllocator &allocator)
: mAllocator(allocator)
{
mDynamicObject = new(mAllocator.Alloc(sizeof(*mDynamicObject)) MyDynamicObject();
}
void ~Foo()
{
mDynamicObject->~MyDynamicObject();
mAllocator.Free(mDynamicObject);
}
}
*/
class IAllocator
{
public:
// size in bytes
// alignment in bytes, 0 means don't care
// alignOffset: offset to align returned pointer. E.g. alignoffset of 4:
// ptr aligned start point that matches alignment parameter.
// ^ ^
// | 4 bytes | Rest of block of size "size - alignOffset" |
// flags - currently unused
virtual void *Alloc(size_t size, size_t alignment = 0, size_t alignOffset = 0, int64_t flags = 0) = 0;
virtual void Free(void *ptr) = 0;
virtual ~IAllocator() = default;
};
using namespace OurImaginaryOS;
class MyAllocator : public IAllocator
{
public:
MyAllocator()
{
}
virtual void *Alloc(size_t size, size_t alignment = 0, size_t alignOffset = 0, int64_t flags = 0)
{
return nullptr;
}
virtual void Free(void *ptr)
{
}
virtual ~MyAllocator()
{
}
};
int main()
{
return 0;
}
/*********************************************************/
// Stuff to make coding game syntax highlighting work
// Don't worry about what's below here.
#include <vector>
#include <mutex>
namespace OurImaginaryOS
{
static std::mutex s_internalPagesLock;
static std::vector<void *> s_internalPages;
void *GetNewPage(size_t pageCount)
{
void *newPage = malloc(PAGE_SIZE * pageCount);
s_internalPagesLock.lock();
s_internalPages.push_back(newPage);
s_internalPagesLock.unlock();
return newPage;
}
void FreePage(void *p)
{
void *toFree = nullptr;
s_internalPagesLock.lock();
for (auto iter = s_internalPages.begin(); iter != s_internalPages.end(); iter++)
{
if (*iter == p)
{
toFree = p;
s_internalPages.erase(iter);
break;
}
}
s_internalPagesLock.unlock();
if (toFree)
{
free(p);
}
}
}