32 #define THREAD_NUMBER omp_get_thread_num() 33 static const size_t MAXNBTHREADS = 128;
35 #define THREAD_NUMBER 0 36 static const size_t MAXNBTHREADS = 1;
39 static const size_t BUFFOBJ = 20;
72 template <
typename TYPE >
79 inline void *
operator new(
size_t sizeofObj) {
81 inline void *
operator new( size_t ) {
83 assert(
sizeof(TYPE) == sizeofObj);
85 t = _memoryChunkManager.getObject(THREAD_NUMBER);
89 inline void operator delete(
void *p ) {
90 _memoryChunkManager.releaseObject(THREAD_NUMBER, p);
94 class MemoryChunkManager {
97 ~MemoryChunkManager() {
98 for (
unsigned int i = 0 ; i < MAXNBTHREADS ; ++i) {
99 for (
size_t j = 0 ; j < _allocatedChunks[i].size() ; ++j) {
100 free(_allocatedChunks[i][j]);
105 TYPE* getObject(
size_t threadId) {
108 if (_freeObject[threadId].empty()) {
109 void *chunk = malloc(BUFFOBJ *
sizeof(TYPE));
110 TYPE * p =
reinterpret_cast<TYPE *
>(chunk);
111 _allocatedChunks[threadId].push_back(chunk);
113 for (
size_t j=0; j< BUFFOBJ - 1; ++j) {
114 _freeObject[threadId].push_back(reinterpret_cast<void *>(p));
121 result =
reinterpret_cast<TYPE *
>(_freeObject[threadId].back());
122 _freeObject[threadId].pop_back();
128 void releaseObject(
size_t threadId,
void *p) {
129 _freeObject[threadId].push_back(p);
133 std::vector<void * > _allocatedChunks[MAXNBTHREADS];
134 std::vector<void * > _freeObject[MAXNBTHREADS];
138 static MemoryChunkManager _memoryChunkManager;
142 template <
typename TYPE >
143 typename MemoryPool<TYPE>::MemoryChunkManager MemoryPool<TYPE>::_memoryChunkManager;
146 #endif // MEMORYPOOL_H