Add memory pool

This commit is contained in:
Thomas Klaehn 2020-04-14 12:57:01 +02:00
parent a2852bd823
commit 17d4ee8ff9

56
src/Pool.h Normal file
View File

@ -0,0 +1,56 @@
#ifndef __POOL_H__
#define __POOL_H__
#include <cstddef>
#include <cstdint>
#include "platform/cm4/InterruptLock.h"
namespace pinetime
{
template <typename T, std::size_t sizeT>
class Pool
{
union Item
{
uint8_t item[sizeof(T)];
Item * next;
};
Item items[sizeT];
uint8_t map[sizeT];
public:
Pool()
{
for(unsigned int i = 0; i < sizeT; i++) {
map[i] = 0;
}
}
void *alloc()
{
pinetime::platform::cm4::InterruptLock lock;
void * res = nullptr;
for(unsigned int i = 0; i < sizeT; i++) {
if(map[i] == 0) {
map[i] = 0xff;
res = static_cast<void *>(items + i);
break;
}
}
return res;
}
void free(T * ptr)
{
pinetime::platform::cm4::InterruptLock lock;
// ptr is not assumed to be aligned, since the integer based aritmetic provides always the correct index and omits the ramainder.
std::size_t index = (reinterpret_cast<std::uintptr_t>(ptr) - reinterpret_cast<std::uintptr_t>(items)) / sizeof(Item);
map[index] = 0;
}
};
}
#endif