#include "cs_defs.h"
#include <map>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "bft_error.h"
#include "bft_mem_usage.h"
#include "bft_mem.h"
#include "bft_printf.h"
Functions | |
cs_mem_block_t | bft_mem_get_block_info (const void *p_get) |
Return the cs_mem_block structure corresponding to a given allocated block. More... | |
cs_mem_block_t | bft_mem_get_block_info_try (const void *p_get) |
Return the cs_mem_block structure corresponding to a given allocated block if available. More... | |
void | bft_mem_update_block_info (const char *var_name, const char *file_name, int line_num, const cs_mem_block_t *old_block, const cs_mem_block_t *new_block) |
Log matching memory operation if logging is enabled. More... | |
void | bft_mem_init (const char *log_file_name) |
Initialize memory handling. More... | |
void | bft_mem_end (void) |
End memory handling. More... | |
int | bft_mem_initialized (void) |
Indicates if bft_mem_...() functions are initialized. More... | |
void * | bft_mem_malloc (size_t ni, size_t size, const char *var_name, const char *file_name, int line_num) |
Allocate memory for ni elements of size bytes. More... | |
void * | bft_mem_realloc (void *ptr, size_t ni, size_t size, const char *var_name, const char *file_name, int line_num) |
Reallocate memory for ni elements of size bytes. More... | |
void * | bft_mem_free (void *ptr, const char *var_name, const char *file_name, int line_num) |
Free allocated memory. More... | |
void * | bft_mem_memalign (size_t alignment, size_t ni, size_t size, const char *var_name, const char *file_name, int line_num) |
Allocate aligned memory for ni elements of size bytes. More... | |
size_t | bft_mem_size_current (void) |
Return current theoretical dynamic memory allocated. More... | |
size_t | bft_mem_size_max (void) |
Return maximum theoretical dynamic memory allocated. More... | |
int | bft_mem_have_memalign (void) |
Indicate if a memory aligned allocation variant is available. More... | |
bft_error_handler_t * | bft_mem_error_handler_get (void) |
Returns the error handler associated with the bft_mem_...() functions. More... | |
void | bft_mem_error_handler_set (bft_error_handler_t *handler) |
Associates an error handler with the bft_mem_...() functions. More... | |
void | bft_mem_alternative_set (bft_mem_realloc_t *realloc_func, bft_mem_free_t *free_func) |
void bft_mem_alternative_set | ( | bft_mem_realloc_t * | realloc_func, |
bft_mem_free_t * | free_func | ||
) |
void bft_mem_end | ( | void | ) |
End memory handling.
This function should be called after all other bft_mem_...() functions. In case of memory allocation logging, it writes final information to the log file and closes is.
bft_error_handler_t* bft_mem_error_handler_get | ( | void | ) |
Returns the error handler associated with the bft_mem_...() functions.
void bft_mem_error_handler_set | ( | bft_error_handler_t * | handler | ) |
Associates an error handler with the bft_mem_...() functions.
With the default error handler, an error message is output to stderr, (after bft_print_flush() is called), and the general error handler used by bft_error() is then called (which results in the termination of the current process or process group).
handler | pointer to the error handler function [in]. |
void* bft_mem_free | ( | void * | ptr, |
const char * | var_name, | ||
const char * | file_name, | ||
int | line_num | ||
) |
Free allocated memory.
This function calls free(), but adds tracing capabilities, and automatically calls the bft_error() errorhandler if it fails to free the corresponding memory. In case of a NULL pointer argument, the function simply returns.
[in] | ptr | pointer to previous memory location (if NULL, bft_alloc() called). |
[in] | var_name | allocated variable name string |
[in] | file_name | name of calling source file |
[in] | line_num | line number in calling source file |
cs_mem_block_t bft_mem_get_block_info | ( | const void * | p_get | ) |
Return the cs_mem_block structure corresponding to a given allocated block.
[in] | p_get | allocated block's start adress. |
cs_mem_block_t bft_mem_get_block_info_try | ( | const void * | p_get | ) |
Return the cs_mem_block structure corresponding to a given allocated block if available.
If no block info is available, return block with null pointers and zero size.
[in] | p_get | allocated block's start adress. |
int bft_mem_have_memalign | ( | void | ) |
Indicate if a memory aligned allocation variant is available.
If no such function is available, bft_mem_memalign() will always fail.
void bft_mem_init | ( | const char * | log_file_name | ) |
Initialize memory handling.
This function should be called before any other bft_mem_...() function. To activate memory allocation logging, a logfile name should be given as an argument. The resulting file will be a regular, local file. If this file cannot be opened for some reason, logging is silently de-activated.
log_file_name | name of optional log_file (if NULL, no log). |
int bft_mem_initialized | ( | void | ) |
Indicates if bft_mem_...() functions are initialized.
void* bft_mem_malloc | ( | size_t | ni, |
size_t | size, | ||
const char * | var_name, | ||
const char * | file_name, | ||
int | line_num | ||
) |
Allocate memory for ni elements of size bytes.
This function calls malloc(), but adds tracing capabilities, and automatically calls the bft_error() errorhandler if it fails to allocate the required memory.
Allocation couting and logging to trace file will be done if both required by the bft_mem_init options and if file_name != nullptr. If required but file_name == nullptr, it must be handled by the caller, using bft_mem_log_mem_op.
[in] | ni | number of elements. |
[in] | size | element size. |
[in] | var_name | allocated variable name string. |
[in] | file_name | name of calling source file. |
[in] | line_num | line number in calling source file. |
void* bft_mem_memalign | ( | size_t | alignment, |
size_t | ni, | ||
size_t | size, | ||
const char * | var_name, | ||
const char * | file_name, | ||
int | line_num | ||
) |
Allocate aligned memory for ni elements of size bytes.
This function calls posix_memalign() if available, but adds tracing capabilities, and automatically calls the bft_error() errorhandler if it fails to allocate the required memory.
The associated function bft_mem_have_memalign() indicates if this type of allocation may be used on this system.
[in] | alignment | alignment. |
[in] | ni | number of elements. |
[in] | size | element size. |
[in] | var_name | allocated variable name string. |
[in] | file_name | name of calling source file. |
[in] | line_num | line number in calling source file. |
void* bft_mem_realloc | ( | void * | ptr, |
size_t | ni, | ||
size_t | size, | ||
const char * | var_name, | ||
const char * | file_name, | ||
int | line_num | ||
) |
Reallocate memory for ni elements of size bytes.
This function calls realloc(), but adds tracing capabilities, and automatically calls the bft_error() errorhandler if it fails to allocate the required memory.
[in] | ptr | pointer to previous memory location (if NULL, bft_alloc() called). |
[in] | ni | number of elements. |
[in] | size | element size. |
[in] | var_name | allocated variable name string. |
[in] | file_name | name of calling source file. |
[in] | line_num | line number in calling source file. |
size_t bft_mem_size_current | ( | void | ) |
Return current theoretical dynamic memory allocated.
size_t bft_mem_size_max | ( | void | ) |
Return maximum theoretical dynamic memory allocated.
void bft_mem_update_block_info | ( | const char * | var_name, |
const char * | file_name, | ||
int | line_num, | ||
const cs_mem_block_t * | old_block, | ||
const cs_mem_block_t * | new_block | ||
) |
Log matching memory operation if logging is enabled.
[in] | var_name | allocated variable name string. |
[in] | file_name | name of calling source file. |
[in] | line_num | line number in calling source file. |
[in] | old_block | pointer to old block info, if present |
[in] | new_block | pointer to new block info, if present |