Add memory pool
This commit is contained in:
parent
a2852bd823
commit
17d4ee8ff9
56
src/Pool.h
Normal file
56
src/Pool.h
Normal 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
|
Loading…
Reference in New Issue
Block a user