mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-01-14 00:49:41 -05:00
117 lines
3.7 KiB
C++
117 lines
3.7 KiB
C++
/*******************************************************************************
|
|
* libretroshare/src/util: smallobject.h *
|
|
* *
|
|
* libretroshare: retroshare core library *
|
|
* *
|
|
* Copyright (c) 2011, Cyril Soler <csoler@users.sourceforge.net> *
|
|
* *
|
|
* This program is free software: you can redistribute it and/or modify *
|
|
* it under the terms of the GNU Lesser General Public License as *
|
|
* published by the Free Software Foundation, either version 3 of the *
|
|
* License, or (at your option) any later version. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU Lesser General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU Lesser General Public License *
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
|
|
* *
|
|
*******************************************************************************/
|
|
#pragma once
|
|
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
|
|
#include <vector>
|
|
#include <map>
|
|
|
|
#include <util/rsthreads.h>
|
|
|
|
namespace RsMemoryManagement
|
|
{
|
|
static const int MAX_SMALL_OBJECT_SIZE = 128 ;
|
|
static const unsigned char BLOCKS_PER_CHUNK = 255 ;
|
|
|
|
struct Chunk
|
|
{
|
|
void init(size_t blockSize,unsigned char blocks);
|
|
void free() ;
|
|
|
|
void *allocate(size_t);
|
|
void deallocate(void *p,size_t blockSize);
|
|
|
|
unsigned char *_data ;
|
|
unsigned char _firstAvailableBlock ;
|
|
unsigned char _blocksAvailable ;
|
|
|
|
void printStatistics(int blockSize) const ;
|
|
};
|
|
|
|
class FixedAllocator
|
|
{
|
|
public:
|
|
FixedAllocator(size_t bytes) ;
|
|
virtual ~FixedAllocator() ;
|
|
|
|
void *allocate();
|
|
void deallocate(void *p) ;
|
|
inline size_t blockSize() const { return _blockSize ; }
|
|
|
|
inline bool chunkOwnsPointer(const Chunk& c,void *p) const
|
|
{
|
|
return intptr_t(p) >= intptr_t(c._data) && (intptr_t(static_cast<unsigned char *>(p))-intptr_t(c._data))/intptr_t(_blockSize)< intptr_t( _numBlocks );
|
|
}
|
|
|
|
void printStatistics() const ;
|
|
uint32_t currentSize() const;
|
|
private:
|
|
size_t _blockSize ;
|
|
unsigned char _numBlocks ;
|
|
std::vector<Chunk*> _chunks ;
|
|
int _allocChunk ; // last chunk that provided allocation. -1 if not inited
|
|
int _deallocChunk ; // last chunk that provided de-allocation. -1 if not inited
|
|
};
|
|
|
|
class SmallObjectAllocator
|
|
{
|
|
public:
|
|
SmallObjectAllocator(size_t maxObjectSize) ;
|
|
virtual ~SmallObjectAllocator() ;
|
|
|
|
void *allocate(size_t numBytes) ;
|
|
void deallocate(void *p,size_t size) ;
|
|
|
|
void printStatistics() const ;
|
|
|
|
bool _active ;
|
|
private:
|
|
std::map<int,FixedAllocator*> _pool ;
|
|
FixedAllocator *_lastAlloc ;
|
|
FixedAllocator *_lastDealloc ;
|
|
size_t _maxObjectSize ;
|
|
};
|
|
|
|
class SmallObject
|
|
{
|
|
public:
|
|
static void *operator new(size_t size) ;
|
|
static void operator delete(void *p,size_t size) ;
|
|
|
|
static void printStatistics() ;
|
|
|
|
virtual ~SmallObject() {}
|
|
|
|
private:
|
|
static SmallObjectAllocator _allocator ;
|
|
static RsMutex _mtx;
|
|
|
|
friend class SmallObjectAllocator ;
|
|
};
|
|
|
|
extern void printStatistics() ;
|
|
}
|
|
|
|
|