2019-06-13 15:42:39 -05:00
|
|
|
#ifndef VTR_MEMORY_H
|
|
|
|
#define VTR_MEMORY_H
|
|
|
|
#include <cstddef>
|
|
|
|
|
|
|
|
namespace vtr {
|
2020-01-03 17:14:42 -06:00
|
|
|
struct t_linked_vptr; //Forward declaration
|
|
|
|
|
|
|
|
/* This structure is to keep track of chunks of memory that is being *
|
|
|
|
* allocated to save overhead when allocating very small memory pieces. *
|
|
|
|
* For a complete description, please see the comment in chunk_malloc*/
|
|
|
|
struct t_chunk {
|
|
|
|
t_linked_vptr* chunk_ptr_head = nullptr;
|
|
|
|
/* chunk_ptr_head->data_vptr: head of the entire linked
|
|
|
|
* list of allocated "chunk" memory;
|
|
|
|
* chunk_ptr_head->next: pointer to the next chunk on the linked list*/
|
|
|
|
int mem_avail = 0; /* number of bytes left in the current chunk */
|
|
|
|
char* next_mem_loc_ptr = nullptr; /* pointer to the first available (free) *
|
|
|
|
* byte in the current chunk */
|
|
|
|
};
|
|
|
|
|
|
|
|
void* free(void* some);
|
|
|
|
void* calloc(size_t nelem, size_t size);
|
|
|
|
void* malloc(size_t size);
|
|
|
|
void* realloc(void* ptr, size_t size);
|
|
|
|
|
|
|
|
void* chunk_malloc(size_t size, t_chunk* chunk_info);
|
|
|
|
void free_chunk_memory(t_chunk* chunk_info);
|
|
|
|
|
|
|
|
//Like chunk_malloc, but with proper C++ object initialization
|
|
|
|
template<typename T>
|
|
|
|
T* chunk_new(t_chunk* chunk_info) {
|
|
|
|
void* block = chunk_malloc(sizeof(T), chunk_info);
|
|
|
|
|
|
|
|
return new (block) T(); //Placement new
|
|
|
|
}
|
2019-06-13 15:42:39 -05:00
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
//Call the destructor of an obj which must have been allocated in the specified chunk
|
|
|
|
template<typename T>
|
|
|
|
void chunk_delete(T* obj, t_chunk* /*chunk_info*/) {
|
|
|
|
if (obj) {
|
|
|
|
obj->~T(); //Manually call destructor
|
|
|
|
//Currently we don't mark the unused memory as free
|
2019-06-13 15:42:39 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
//Cross platform wrapper around GNU's malloc_trim()
|
|
|
|
// TODO: This is only used in one place within VPR, consider removing it
|
|
|
|
int malloc_trim(size_t pad);
|
|
|
|
} // namespace vtr
|
|
|
|
|
2019-06-13 15:42:39 -05:00
|
|
|
#endif
|