2017-08-01 14:30:58 +02:00
|
|
|
/*! \file btGenericPoolAllocator.h
|
|
|
|
\author Francisco Leon Najera. email projectileman@yahoo.com
|
|
|
|
|
|
|
|
General purpose allocator class
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
Bullet Continuous Collision Detection and Physics Library
|
2022-01-06 23:37:49 +01:00
|
|
|
Copyright (c) 2003-2006 Erwin Coumans https://bulletphysics.org
|
2017-08-01 14:30:58 +02:00
|
|
|
|
|
|
|
This software is provided 'as-is', without any express or implied warranty.
|
|
|
|
In no event will the authors be held liable for any damages arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
|
|
including commercial applications, and to alter it and redistribute it freely,
|
|
|
|
subject to the following restrictions:
|
|
|
|
|
|
|
|
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
|
|
|
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
|
|
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef BT_GENERIC_POOL_ALLOCATOR_H
|
|
|
|
#define BT_GENERIC_POOL_ALLOCATOR_H
|
|
|
|
|
|
|
|
#include <limits.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include "LinearMath/btAlignedAllocator.h"
|
|
|
|
|
|
|
|
#define BT_UINT_MAX UINT_MAX
|
|
|
|
#define BT_DEFAULT_MAX_POOLS 16
|
|
|
|
|
|
|
|
//! Generic Pool class
|
|
|
|
class btGenericMemoryPool
|
|
|
|
{
|
|
|
|
public:
|
2019-01-03 14:26:51 +01:00
|
|
|
unsigned char *m_pool; //[m_element_size*m_max_element_count];
|
|
|
|
size_t *m_free_nodes; //[m_max_element_count];//! free nodes
|
|
|
|
size_t *m_allocated_sizes; //[m_max_element_count];//! Number of elements allocated per node
|
2017-08-01 14:30:58 +02:00
|
|
|
size_t m_allocated_count;
|
|
|
|
size_t m_free_nodes_count;
|
2019-01-03 14:26:51 +01:00
|
|
|
|
2017-08-01 14:30:58 +02:00
|
|
|
protected:
|
|
|
|
size_t m_element_size;
|
|
|
|
size_t m_max_element_count;
|
|
|
|
|
|
|
|
size_t allocate_from_free_nodes(size_t num_elements);
|
|
|
|
size_t allocate_from_pool(size_t num_elements);
|
|
|
|
|
|
|
|
public:
|
|
|
|
void init_pool(size_t element_size, size_t element_count);
|
|
|
|
|
|
|
|
void end_pool();
|
|
|
|
|
|
|
|
btGenericMemoryPool(size_t element_size, size_t element_count)
|
|
|
|
{
|
|
|
|
init_pool(element_size, element_count);
|
|
|
|
}
|
|
|
|
|
|
|
|
~btGenericMemoryPool()
|
|
|
|
{
|
|
|
|
end_pool();
|
|
|
|
}
|
|
|
|
|
|
|
|
inline size_t get_pool_capacity()
|
|
|
|
{
|
2019-01-03 14:26:51 +01:00
|
|
|
return m_element_size * m_max_element_count;
|
2017-08-01 14:30:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
inline size_t gem_element_size()
|
|
|
|
{
|
|
|
|
return m_element_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline size_t get_max_element_count()
|
|
|
|
{
|
|
|
|
return m_max_element_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline size_t get_allocated_count()
|
|
|
|
{
|
|
|
|
return m_allocated_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline size_t get_free_positions_count()
|
|
|
|
{
|
|
|
|
return m_free_nodes_count;
|
|
|
|
}
|
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
inline void *get_element_data(size_t element_index)
|
2017-08-01 14:30:58 +02:00
|
|
|
{
|
2019-01-03 14:26:51 +01:00
|
|
|
return &m_pool[element_index * m_element_size];
|
2017-08-01 14:30:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//! Allocates memory in pool
|
|
|
|
/*!
|
|
|
|
\param size_bytes size in bytes of the buffer
|
|
|
|
*/
|
2019-01-03 14:26:51 +01:00
|
|
|
void *allocate(size_t size_bytes);
|
2017-08-01 14:30:58 +02:00
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
bool freeMemory(void *pointer);
|
2017-08-01 14:30:58 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
//! Generic Allocator with pools
|
|
|
|
/*!
|
|
|
|
General purpose Allocator which can create Memory Pools dynamiacally as needed.
|
|
|
|
*/
|
|
|
|
class btGenericPoolAllocator
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
size_t m_pool_element_size;
|
|
|
|
size_t m_pool_element_count;
|
2019-01-03 14:26:51 +01:00
|
|
|
|
2017-08-01 14:30:58 +02:00
|
|
|
public:
|
2019-01-03 14:26:51 +01:00
|
|
|
btGenericMemoryPool *m_pools[BT_DEFAULT_MAX_POOLS];
|
2017-08-01 14:30:58 +02:00
|
|
|
size_t m_pool_count;
|
|
|
|
|
|
|
|
inline size_t get_pool_capacity()
|
|
|
|
{
|
2019-01-03 14:26:51 +01:00
|
|
|
return m_pool_element_size * m_pool_element_count;
|
2017-08-01 14:30:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
// creates a pool
|
2019-01-03 14:26:51 +01:00
|
|
|
btGenericMemoryPool *push_new_pool();
|
2017-08-01 14:30:58 +02:00
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
void *failback_alloc(size_t size_bytes);
|
2017-08-01 14:30:58 +02:00
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
bool failback_free(void *pointer);
|
2017-08-01 14:30:58 +02:00
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
public:
|
2017-08-01 14:30:58 +02:00
|
|
|
btGenericPoolAllocator(size_t pool_element_size, size_t pool_element_count)
|
|
|
|
{
|
|
|
|
m_pool_count = 0;
|
|
|
|
m_pool_element_size = pool_element_size;
|
|
|
|
m_pool_element_count = pool_element_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual ~btGenericPoolAllocator();
|
|
|
|
|
|
|
|
//! Allocates memory in pool
|
|
|
|
/*!
|
|
|
|
\param size_bytes size in bytes of the buffer
|
|
|
|
*/
|
2019-01-03 14:26:51 +01:00
|
|
|
void *allocate(size_t size_bytes);
|
2017-08-01 14:30:58 +02:00
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
bool freeMemory(void *pointer);
|
2017-08-01 14:30:58 +02:00
|
|
|
};
|
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
void *btPoolAlloc(size_t size);
|
|
|
|
void *btPoolRealloc(void *ptr, size_t oldsize, size_t newsize);
|
2017-08-01 14:30:58 +02:00
|
|
|
void btPoolFree(void *ptr);
|
|
|
|
|
|
|
|
#endif
|