mirror of
https://github.com/nasa/trick.git
synced 2024-12-20 21:53:10 +00:00
846 lines
38 KiB
C++
846 lines
38 KiB
C++
/*
|
|
PURPOSE:
|
|
(Memory Manager.)
|
|
*/
|
|
|
|
#ifndef MEMORYMANAGEMENT_HH
|
|
#define MEMORYMANAGEMENT_HH
|
|
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <set>
|
|
#include <iostream>
|
|
#include <stdexcept>
|
|
#include <pthread.h>
|
|
#include <functional>
|
|
|
|
#include "trick/attributes.h"
|
|
#include "trick/reference.h"
|
|
#include "trick/parameter_types.h"
|
|
#include "trick/io_alloc.h"
|
|
#include "trick/mm_error.h"
|
|
#include "trick/var.h"
|
|
|
|
#include "trick/CheckPointAgent.hh"
|
|
|
|
// forward declare the units converter types used by ref_assignment
|
|
union cv_converter ;
|
|
struct ut_system ;
|
|
|
|
namespace Trick {
|
|
|
|
typedef std::map<void*, ALLOC_INFO*, std::greater<void*> > ALLOC_INFO_MAP;
|
|
typedef std::map<void*, ALLOC_INFO*, std::greater<void*> >::const_iterator ALLOC_INFO_MAP_ITER ;
|
|
typedef std::map<std::string, ALLOC_INFO*> VARIABLE_MAP;
|
|
typedef std::map<std::string, ALLOC_INFO*>::const_iterator VARIABLE_MAP_ITER ;
|
|
typedef std::map<std::string, ENUM_ATTR*> ENUMERATION_MAP;
|
|
|
|
/**
|
|
The Memory Manager provides memory-resource administration services.
|
|
To provide these services, it tracks information about chunks of memory.
|
|
|
|
These chunks of memory can come from one of two places:
|
|
@li You can ask the Memory Manager to allocate memory according a
|
|
declaration [using declare_var()].
|
|
@li You can provide an address to memory that you've somehow acquired,
|
|
together with a declaration of what's at that address
|
|
[using declare_extern_var()].
|
|
|
|
By tracking the address and declaration information, the Memory Manager
|
|
it is able, on request, to write a human-readable representation of those memory
|
|
resources to a file [using write_checkpoint()]. The memory resources can be later
|
|
restored from this checkpoint file using read_checkpoint() or init_from_checkpoint().
|
|
|
|
It can also return addresses of named subcomponents of memory resources.
|
|
|
|
*/
|
|
class MemoryManager {
|
|
|
|
public:
|
|
|
|
/**
|
|
Memory Manager constructor.
|
|
@par NOTE:
|
|
Only one instance of the MemoryManager is allowed to exist per process.
|
|
*/
|
|
MemoryManager() ;
|
|
|
|
/**
|
|
Memory Manager destructor.
|
|
*/
|
|
~MemoryManager();
|
|
|
|
/**
|
|
Allocate a contiguous region of memory as specified by an
|
|
@subpage ADEF_Syntax "allocation declaration string."
|
|
|
|
@param declaration - a \ref definition_of_type_specifier "type specifier"
|
|
followed by zero or more asterisks, followed by an optional name,
|
|
followed by zero or more bracketed integers.
|
|
|
|
@return - an address to the allocated memory or NULL on failure.
|
|
|
|
*/
|
|
void* declare_var( const char* declaration);
|
|
|
|
/**
|
|
Allocate an anonymous, one dimensional array. The elements of the array are specified by the
|
|
enhanced-type-specifier. The length of the array is specified by @b n_elems.
|
|
|
|
@param enh_type_spec - type specifier followed by zero or more asterisks.
|
|
@param n_elems - The number of items of the given type to allocate.
|
|
@return - an address to the allocated memory or NULL on failure.
|
|
*/
|
|
void* declare_var( const char* enh_type_spec, int n_elems);
|
|
|
|
/**
|
|
This is the general version of declare_var(), which allocates a contiguous
|
|
region of memory, for a (named or anonymous) variable, of the specified type
|
|
and dimension.
|
|
|
|
@par NOTE:
|
|
An allocation (variable) may by named (@b var_name != "") or anonymous
|
|
(@b var_name == ""). Named allocations are checkpointed using their given name.
|
|
Anonymous allocations are checkpointed with generated names of the form:
|
|
@c trick_temp_#, where @c # is an integer.
|
|
|
|
@param type - TRICK_TYPE.
|
|
@param class_name - class or struct name if @b type is TRICK_STRUCTURED,
|
|
otherwise @b class_name should be "".
|
|
@param n_stars - number of asterisks in the variable declaration.
|
|
@param var_name - (optional) name of the allocation. ="" for anonymous allocations.
|
|
@param n_cdims - number of constrained/fixed dimensions. =0 for unarrayed variables.
|
|
@param cdims - array of dimension sizes.
|
|
@return - an address to the allocated memory or NULL on failure.
|
|
*/
|
|
void* declare_var(TRICK_TYPE type, std::string class_name, int n_stars, std::string var_name, int n_cdims, int *cdims);
|
|
|
|
/**
|
|
Alex's desecration of the cathedral.
|
|
This is the version of declare_var() used when we override a class specific new/delete.
|
|
It allocates the number of bytes requested by new, and tracks an anonymous allocation
|
|
corresponding to this memory.
|
|
|
|
@param class_name - class or struct name if @b type is TRICK_STRUCTURED,
|
|
otherwise @b class_name should be "".
|
|
@param alloc_size - number of bytes requested by new
|
|
@param element_size - size of underlying class
|
|
@return - an address to the allocated memory or NULL on failure.
|
|
*/
|
|
void* declare_operatornew_var( std::string class_name , unsigned int alloc_size , unsigned int element_size );
|
|
|
|
/**
|
|
This is a convenience version of declare_extern_var(), that declares an external variable
|
|
as specified by an @subpage ADEF_Syntax "allocation declaration string."
|
|
|
|
@param declaration - a type_specifier followed by zero or more asterisks, followed by an
|
|
optional name, followed by zero or more bracketed integers.
|
|
|
|
@return - an address to the declared object or NULL on failure.
|
|
*/
|
|
void* declare_extern_var( void* address, const char * declaration);
|
|
|
|
/**
|
|
This is a convenience version of declare_extern_var(), that declares a
|
|
one dimensional array. The elements of the array are specified by a
|
|
type-specifier followed by zero or more asterisks. The length of the array
|
|
is specified by @b n_elems.
|
|
|
|
@param address - address of the external object.
|
|
@param element_definition - type specifier followed by zero or more asterisks, followed by an
|
|
optional name, followed by zero or more bracketed integers.
|
|
@param n_elems - number of items of the given type to allocate.
|
|
@return - an address to the declared object or NULL on failure.
|
|
*/
|
|
void* declare_extern_var( void* address, const char *element_definition, int n_elems);
|
|
|
|
/**
|
|
Tell the Memory Manager about a memory object that it did not allocate.
|
|
This makes it possible for the Memory Manager to dump (checkpoint) the object's contents.
|
|
|
|
@param address - The address of the external object.
|
|
@param type - TRICK_TYPE.
|
|
@param class_name - class or struct name if @b type is TRICK_STRUCTURED,
|
|
otherwise @b class_name should be "".
|
|
@param n_stars - number of asterisks in the variable declaration.
|
|
@param var_name - name of the declared object.
|
|
@param n_cdims - number of constrained/fixed dimensions. =0 for unarrayed variables.
|
|
@param cdims - array of dimension sizes.
|
|
@return - an address to the declared object or NULL on failure.
|
|
|
|
@attention
|
|
The checkpoint is restorable if and only if:
|
|
- the @b name used in the checkpoint file is that of a declared variable.
|
|
- the io specification in the underlying ATTRIBUTES allows it.
|
|
*/
|
|
void* declare_extern_var( void* address,
|
|
TRICK_TYPE type,
|
|
std::string class_name,
|
|
int n_stars,
|
|
std::string var_name,
|
|
int n_cdims,
|
|
int *cdims);
|
|
|
|
/**
|
|
Resize multi-dimensional array by address.
|
|
@param address - address of array to be resized.
|
|
@param n_cdims - number of constrained dimensions. This must match the number
|
|
of "fixed" dimensions of the existing array.
|
|
@param cdims - array of new dimension sizes.
|
|
@return - a pointer to the resized array or NULL on failure.
|
|
*/
|
|
void* resize_array( void *address, int n_cdims, int *cdims);
|
|
|
|
/**
|
|
Resize one-dimensional array by address.
|
|
@param address - address of array to be resized.
|
|
@param num - number of elements in 1 dimensional array.
|
|
@return - a pointer to the resized array or NULL on failure.
|
|
*/
|
|
void* resize_array( void* address, int num);
|
|
|
|
/**
|
|
Resize multi-dimensional array by name.
|
|
@param name - name of array to be resized.
|
|
@param n_cdims - number of constrained dimensions. This must match the number
|
|
of "fixed" dimensions of the existing array.
|
|
@param cdims - array of new dimension sizes.
|
|
@return - a pointer to the resized array or NULL on failure.
|
|
*/
|
|
void* resize_array( const char* name, int n_cdims, int *cdims);
|
|
|
|
/**
|
|
Resize one-dimensional array by name.
|
|
@param name - name of array to be resized.
|
|
@param num - number of elements in 1 dimensional array.
|
|
@return - a pointer to the resized array or NULL on failure.
|
|
*/
|
|
void* resize_array( const char* name, int num);
|
|
|
|
/**
|
|
Duplicate the given character string.
|
|
@param s - character string to be duplicated.
|
|
@return a duplicate character string.
|
|
@todo Could this be made more general to duplicate a variable?
|
|
*/
|
|
char* mm_strdup( const char* s);
|
|
|
|
/**
|
|
Test whether the given variable_name is in use .
|
|
@return 0 = FALSE, 1 = TRUE.
|
|
*/
|
|
int var_exists(std::string var_name);
|
|
|
|
/**
|
|
Determine the size of the given declaration.
|
|
@param declaration - a \ref definition_of_type_specifier "type specifier"
|
|
followed by zero or more asterisks, followed by an optional name,
|
|
followed by zero or more bracketed integers.
|
|
|
|
@return - the size in bytes of the memory that would be allocated by the by the given declaration or 0 on failure.
|
|
*/
|
|
size_t sizeof_type( const char* declaration);
|
|
|
|
/**
|
|
Test whether the given address is in Trick managed memory.
|
|
@param address - The address to be tested.
|
|
@return 0 = FALSE, 1 = TRUE.
|
|
*/
|
|
int is_alloced( void* address);
|
|
|
|
/**
|
|
Set the verbosity of MemoryManager debug messages.
|
|
@param level - 0 = No debug messages. > 0 print debug messages.
|
|
*/
|
|
void set_debug_level( int level);
|
|
|
|
/**
|
|
Indicate whether a checkpoint should represent arrays and their values as one
|
|
assignment or as individual assignments to each of its elements.
|
|
@param flag - true: Arrays and their values are represented as multiple assignments, one for each array element.
|
|
false: (default) Arrays and their values are compactly represented as one assignment.
|
|
*/
|
|
void set_expanded_arrays( bool flag);
|
|
|
|
/**
|
|
Indicate whether a checkpoint should include assignments to variables whose values are 0.
|
|
@param flag - true: (default) Assignments are created only for non zero-valued variables.
|
|
false: Assignments are created for all variables, regardless of their value.
|
|
*/
|
|
void set_reduced_checkpoint( bool flag);
|
|
|
|
/**
|
|
Indicate whether a checkpoint should represent floating point values as "hexfloat" values.
|
|
Hexfloat format preserves the precision of floating point values, but isn't readable by
|
|
sane human beings.
|
|
@param flag - false: Assignments are created for all variables, regardless of their value.
|
|
true: Assignments are created only for non zero-valued variables.
|
|
*/
|
|
void set_hexfloat_checkpoint( bool flag);
|
|
|
|
/**
|
|
Set the value(s) of the variable at the given address to 0, 0.0, NULL, false or "", as appropriate for the type.
|
|
@param address - The address of the variable to be cleared.
|
|
*/
|
|
void clear_var( void* address);
|
|
|
|
/**
|
|
Set the value(s) of the variable with the given name to 0, 0.0, NULL, false or "", as appropriate for the type.
|
|
@param var_name - The name of the variable to be cleared.
|
|
*/
|
|
void clear_var( const char* var_name);
|
|
|
|
/**
|
|
Set the value(s) of all variables to 0, 0.0, NULL, false or "", as appropriate for the type.
|
|
*/
|
|
void clear_all_vars();
|
|
|
|
/**
|
|
Forget about the variable at the given address and deallocate the memory associated with it.
|
|
@param address - the address of the variable.
|
|
@return 0 = SUCCESS, 1 = FAILURE
|
|
*/
|
|
int delete_var(void* address, bool destroy = true);
|
|
|
|
/**
|
|
Forget about the variable with the given name and deallocate the memory associated with it.
|
|
@param var_name - the address of the variable.
|
|
@return 0 = SUCCESS, 1 = FAILURE
|
|
*/
|
|
int delete_var(const char* var_name);
|
|
|
|
/**
|
|
Forget about the external variable at the given address. DOES NOT attempt to deallocate the
|
|
memory at the given address.
|
|
@param address - the address of the external variable.
|
|
@return 0 = SUCCESS, 1 = FAILURE
|
|
*/
|
|
int delete_extern_var(void* address);
|
|
|
|
/**
|
|
Forget about the external variable with the given name. DOES NOT attempt to deallocate the
|
|
memory at the given address.
|
|
@param var_name - the address of the external variable.
|
|
@return 0 = SUCCESS, 1 = FAILURE
|
|
*/
|
|
int delete_extern_var(const char* var_name);
|
|
|
|
/**
|
|
Checkpoint all allocations known to the MemoryManager to the given stream.
|
|
@param out_s output stream.
|
|
*/
|
|
void write_checkpoint( std::ostream& out_s);
|
|
|
|
/**
|
|
Checkpoint all allocations known to the MemoryManager to a file.
|
|
@param filename Name of file to be written.
|
|
*/
|
|
void write_checkpoint( const char* filename);
|
|
|
|
/**
|
|
Checkpoint the named variable (allocation) and it dependencies to the given stream.
|
|
@param out_s output stream.
|
|
@param var_name Variable name.
|
|
*/
|
|
void write_checkpoint( std::ostream& out_s, const char* var_name);
|
|
|
|
/**
|
|
Checkpoint the named variable (allocation) and it dependencies to a file.
|
|
@param filename Checkpoint file.
|
|
@param var_name Variable name.
|
|
*/
|
|
void write_checkpoint( const char* filename, const char* var_name);
|
|
|
|
/**
|
|
Checkpoint the named variables and their dependencies to a stream.
|
|
@param out_s output stream.
|
|
@param var_name_list List of variable names.
|
|
*/
|
|
void write_checkpoint( std::ostream& out_s, std::vector<const char*>& var_name_list);
|
|
|
|
/**
|
|
Checkpoint the named variables and their dependencies to a file.
|
|
@param filename output file name.
|
|
@param var_name_list List of variable names.
|
|
*/
|
|
void write_checkpoint( const char* filename, std::vector<const char*>& var_name_list);
|
|
|
|
/**
|
|
Restore a checkpoint from the given stream.
|
|
@param in_s - input stream.
|
|
*/
|
|
int read_checkpoint( std::istream* in_s, bool do_restore_stls=false);
|
|
|
|
/**
|
|
Read a checkpoint from the file of the given name.
|
|
@param filename - name of the checkpoint file to be read.
|
|
*/
|
|
int read_checkpoint( const char* filename);
|
|
|
|
/**
|
|
Read a checkpoint from the given string.
|
|
@param s - string containing the checkpoint info.
|
|
*/
|
|
int read_checkpoint_from_string( const char* s );
|
|
|
|
/**
|
|
Delete all TRICK_LOCAL variables and clear all TRICK_EXTERN variables. Then read
|
|
and restore the checkpoint from the given stream.
|
|
@param in_s - input stream.
|
|
*/
|
|
int init_from_checkpoint( std::istream* in_s);
|
|
|
|
/**
|
|
Delete all TRICK_LOCAL variables and clear all TRICK_EXTERN variables. Then read
|
|
and restore the checkpoint of the given filename.
|
|
*/
|
|
int init_from_checkpoint( const char* filename);
|
|
|
|
/**
|
|
Deallocate the memory for all TRICK_LOCAL variables and then forget about them.
|
|
Clear the memory for all TRICK_EXTERN variables.
|
|
Does not attempt to deallocate external memory.
|
|
*/
|
|
void reset_memory();
|
|
|
|
/**
|
|
Find and initialize the ATTRIBUTES of the named type. Then assign these
|
|
(child) ATTRIBUTES to the attr field of the given (parent) ATTRIBUTES structure.
|
|
@param type_name - user defined type name.
|
|
@param attr - pointer to parent attributes structure.
|
|
@return 0 on success, otherwise failure.
|
|
*/
|
|
int add_attr_info(const std::string& type_name , ATTRIBUTES* attr , const char * file_name = "None" , unsigned int line_num = 0 ) ;
|
|
|
|
/**
|
|
Adds a template name translation to our map. The base template type is mangled to the io_src name
|
|
@param template_name - base template type name
|
|
@param attr_name - mangled attribute name
|
|
@return 0 on success, otherwise failure.
|
|
*/
|
|
int add_template_name_trans(std::string template_name , std::string attr_name) ;
|
|
|
|
/**
|
|
Add a variable.
|
|
|
|
@param type - TRICK_TYPE.
|
|
@param class_name - name of class or struct, if type == TRICK_STRUCTURED.
|
|
@param var_declare - variable declarator.
|
|
@param units - units associated with the variable.
|
|
|
|
@todo this needs a better description.
|
|
@todo get rid of the units arg. It belongs as an assignment arg.
|
|
*/
|
|
void* add_var( TRICK_TYPE type,
|
|
const char* class_name,
|
|
VAR_DECLARE* var_declare,
|
|
char* units);
|
|
|
|
/**
|
|
Add a list of variables.
|
|
@param type - TRICK_TYPE.
|
|
@param class_name - name of class or struct, if type == TRICK_STRUCTURED.
|
|
@param var_list - variable declaration.
|
|
@param units - units associated with the variable.
|
|
@todo get rid of the units arg. It belongs as an assignment arg.
|
|
*/
|
|
int add_vars( TRICK_TYPE type,
|
|
const char* class_name,
|
|
VAR_LIST* var_list,
|
|
char* units);
|
|
|
|
/**
|
|
Allocates memory for the variable specified by R. Note that R->address
|
|
contains an address of (pointer to) a pointer variable and R-attr contains
|
|
the ATTRIBUTES of the variable to which the pointer variable points. If size
|
|
is 0 then num items of the size specified by R->attr->size will be allocated.
|
|
If the size is not 0, the num items of the size sizeof( void*) will be allocated.
|
|
@param R Parameter reference attributes.
|
|
@param num Number of items to allocate.
|
|
@return 0 on success, otherwise failure.
|
|
*/
|
|
int ref_allocate( REF2* R, int num ) ;
|
|
|
|
/**
|
|
Generate and return a REF2 reference object for the named variable.
|
|
Caller is responsible for freeing the returned REF2 object (using free() from stdlib.h ).
|
|
@param name - fully qualified variable name.
|
|
@return pointer to REF2 object, or NULL on failure.
|
|
*/
|
|
REF2 *ref_attributes( const char* name);
|
|
|
|
/**
|
|
@param address - Address for which a name reference is needed.
|
|
@return a name reference for the given address.
|
|
*/
|
|
std::string ref_name_from_address (void *address) ;
|
|
|
|
/**
|
|
Assigns values from the given value list to the memory locations
|
|
referenced by R.
|
|
@param R Reference to the variable to which values are to be assigned.
|
|
@param V Tree of values to be assigned to the variable referenced by R.
|
|
@return 0 on success, otherwise failure.
|
|
*/
|
|
int ref_assignment( REF2* R, V_TREE* V);
|
|
|
|
/**
|
|
Populate the REF2 object pointed to by R with the attributes and address
|
|
of the named variable.
|
|
@param R - pointer to the REF2 object to be populated.
|
|
@param name - variable name.
|
|
@return 0 on success, otherwise failure.
|
|
@todo rename to ref_base.
|
|
*/
|
|
int ref_var( REF2* R, char* name);
|
|
|
|
/**
|
|
Updates R, a reference to an arrayed object, to a reference
|
|
to the indexed sub-element of that arrayed object.
|
|
@param R reference to the arrayed object of which V identifies a sub-element.
|
|
@param V index of a sub-element the structured object referenced by R.
|
|
@todo V_DATA arg needs to be changed to an int.
|
|
*/
|
|
int ref_dim( REF2* R, V_DATA* V);
|
|
|
|
/**
|
|
Updates R, a reference to a structured object, to a reference
|
|
to the named sub-element of that structured object.
|
|
@param R reference to the structured object of which @b name names a sub-element.
|
|
@param name name of a sub-element the structured object referenced by R.
|
|
*/
|
|
int ref_name(REF2 * R, char *name);
|
|
|
|
/**
|
|
Return the value associated with the name.
|
|
@param name - name of enumeration value.
|
|
@param v_data - value associated with the name.
|
|
*/
|
|
int get_enumerated(const char* name, V_DATA* v_data);
|
|
|
|
/**
|
|
Return the number of array elements in the allocation.
|
|
@param addr Address.
|
|
*/
|
|
int get_size(void *addr);
|
|
|
|
/**
|
|
Return the number of array elements in the allocation following ptr.
|
|
@param addr Address.
|
|
*/
|
|
int get_truncated_size(void *addr);
|
|
|
|
/**
|
|
@todo does this work?
|
|
*/
|
|
int io_get_fixed_truncated_size(char *ptr, ATTRIBUTES * A, char *str, int dims, ATTRIBUTES * left_type);
|
|
|
|
/**
|
|
Get information for the allocation containing the specified address.
|
|
@param addr The Address.
|
|
*/
|
|
ALLOC_INFO* get_alloc_info_of( void* addr);
|
|
|
|
/**
|
|
Get information for the allocation starting at the specified address.
|
|
@param addr The Address.
|
|
*/
|
|
ALLOC_INFO* get_alloc_info_at( void* addr);
|
|
|
|
/**
|
|
Names an allocation in the ALLOC_INFO map to the incoming name.
|
|
@param addr The Address.
|
|
@param name The Name.
|
|
*/
|
|
int set_name_at( void* addr, const char * name);
|
|
|
|
/**
|
|
Adds a name of an allocation to the dependency list of allocations that are to be checkpointed.
|
|
This call is used by standard template library functions that create new allocations and
|
|
dependencies during the checkpoint process.
|
|
@param name The name of the allocation.
|
|
*/
|
|
void add_checkpoint_alloc_dependency(const char * name);
|
|
|
|
/**
|
|
Opens a handle to the shared library file. The handles are used to look for io_src functions.
|
|
@param file_name The name of the file to open.
|
|
*/
|
|
int add_shared_library_symbols( const char * file_name );
|
|
|
|
|
|
std::vector<void*> dlhandles ; /**< ** dynamic loader handle left open for all dl (dlsym) calls */
|
|
|
|
/**
|
|
Get the current MemoryManager's CheckPointAgent
|
|
*/
|
|
CheckPointAgent * get_CheckPointAgent();
|
|
|
|
/**
|
|
Set the MemoryManager's CheckPointAgent to a user-specified CheckPointAgent.
|
|
@param agent pointer to the user-specified CheckPointAgent.
|
|
*/
|
|
void set_CheckPointAgent( CheckPointAgent* agent);
|
|
|
|
/**
|
|
Set the MemoryManager's CheckPointAgent to the default, "Classic" CheckPointAgent.
|
|
*/
|
|
void reset_CheckPointAgent();
|
|
|
|
/**
|
|
Write the contents of the variable at the given address, as described by the
|
|
given attributes to the given stream.
|
|
@param out_s - output stream.
|
|
@param address - address of the variable.
|
|
@param attr - data type attributes of the variable.
|
|
*/
|
|
void write_var( std::ostream& out_s, void* address, ATTRIBUTES* attr);
|
|
|
|
/**
|
|
Write the contents of the variable at the given address, as described by the
|
|
given attributes to the given stream.
|
|
@param out_s - output stream.
|
|
@param alloc_info - pointer to the ALLOC_INFO record for this variable.
|
|
*/
|
|
void write_var( std::ostream& out_s, ALLOC_INFO* alloc_info );
|
|
|
|
/**
|
|
Write the contents of the variable with the given name to the given stream.
|
|
In other words, checkpoint a single variable to a file.
|
|
@param out_s - output stream.
|
|
@param var_name - Name of the variable.
|
|
*/
|
|
void write_var( std::ostream& out_s, const char* var_name );
|
|
|
|
/**
|
|
Write the contents of the variable at the given address to the given stream.
|
|
In other words, checkpoint a single variable to a file.
|
|
@param out_s - output stream.
|
|
@param address - address of the variable.
|
|
*/
|
|
void write_var( std::ostream& out_s, void* address );
|
|
|
|
/**
|
|
@attention This function is not meant for general use. Use write_var or write_checkpoint instead.
|
|
|
|
Write the contents of the composite variable (struct|union|class) at the given address to the given stream.
|
|
*/
|
|
void write_composite_var( std::ostream& out_s, void* address, ATTRIBUTES* attr_list);
|
|
|
|
/**
|
|
@attention This function is not meant for general use. Use write_var or write_checkpoint instead.
|
|
|
|
Write the contents of the arrayed variable at the given address to the given stream.
|
|
*/
|
|
void write_array_var( std::ostream& out_s, void* address, ATTRIBUTES* attr, int curr_dim, int offset);
|
|
|
|
/**
|
|
Make a string representation of a declaration.
|
|
*/
|
|
std::string make_decl_string(TRICK_TYPE type, std::string class_name, int n_stars, std::string var_name, int n_cdims, int *cdims);
|
|
|
|
/**
|
|
Return the size of the specified user-defined type.
|
|
@param user_type_name The name of a user-defined type.
|
|
@return The the size (in bytes) of the user-defined type.
|
|
*/
|
|
size_t io_src_sizeof_user_type(const char* user_type_name);
|
|
|
|
ALLOC_INFO_MAP_ITER alloc_info_map_begin() { return alloc_info_map.begin() ; } ;
|
|
ALLOC_INFO_MAP_ITER alloc_info_map_end() { return alloc_info_map.end() ; } ;
|
|
|
|
VARIABLE_MAP_ITER variable_map_begin() { return variable_map.begin() ; } ;
|
|
VARIABLE_MAP_ITER variable_map_end() { return variable_map.end() ; } ;
|
|
|
|
int debug_level; /**< -- Debug level */
|
|
static void emitMessage( std::string s);
|
|
static void emitError( std::string s);
|
|
static void emitWarning( std::string s);
|
|
|
|
void write_JSON_alloc_info( std::ostream& s, ALLOC_INFO *alloc_info) ;
|
|
void write_JSON_alloc_list( std::ostream& s, int start_ix, int num) ;
|
|
|
|
private:
|
|
|
|
static int instance_count; /**< -- Number of instances of MemoryManager. Not allowed to exceed 1.*/
|
|
const char* local_anon_var_prefix; /**< -- Temporary-variable-name prefix. */
|
|
const char* extern_anon_var_prefix; /**< -- Temporary-variable-name prefix. */
|
|
CheckPointAgent* currentCheckPointAgent; /**< ** currently active Check point agent. */
|
|
CheckPointAgent* defaultCheckPointAgent; /**< ** the classic Check point agent. */
|
|
|
|
bool reduced_checkpoint; /**< -- true = Don't write zero valued variables in the checkpoint. false= Write all values. */
|
|
bool hexfloat_checkpoint; /**< -- true = Represent floating point values as hexidecimal to preserve precision. false= Normal. */
|
|
bool expanded_arrays; /**< -- true = array element values are set in separate assignments. */
|
|
|
|
ALLOC_INFO_MAP alloc_info_map; /**< ** Map of <address, ALLOC_INFO*> key-value pairs for each of the managed allocations. */
|
|
VARIABLE_MAP variable_map; /**< ** Map of <name, ALLOC_INFO*> key-value pairs for each named-allocations. */
|
|
ENUMERATION_MAP enumeration_map; /**< ** Enumeration map. */
|
|
pthread_mutex_t mm_mutex; /**< ** Mutex to control access to memory manager maps */
|
|
|
|
int alloc_info_map_counter ; /**< ** counter to assign unique ids to allocations as they are added to map */
|
|
int extern_alloc_info_map_counter ; /**< ** counter to assign unique ids to allocations as they are added to map */
|
|
|
|
std::vector<ALLOC_INFO*> dependencies; /**< ** list of allocations used in a checkpoint. */
|
|
std::vector<ALLOC_INFO*> stl_dependencies; /**< ** list of allocations known to be STL checkpoint allocations */
|
|
|
|
void execute_checkpoint( std::ostream& out_s );
|
|
|
|
/**
|
|
Walks through allocation and allocates space for STLs
|
|
FIXME: I NEED DOCUMENTATION!
|
|
*/
|
|
void get_stl_dependencies( ALLOC_INFO* alloc_info );
|
|
void get_stl_dependencies_in_class( std::string name, char* address, ATTRIBUTES* attr) ;
|
|
void get_stl_dependencies_in_arrayed_class( std::string name,
|
|
char* address, ATTRIBUTES* attr, int curr_dim, int offset) ;
|
|
void get_stl_dependencies_in_intrinsic( std::string name,
|
|
void* address, ATTRIBUTES* attr, int curr_dim, int offset) ;
|
|
|
|
/**
|
|
Walks through allocations and restores STLs
|
|
FIXME: I NEED DOCUMENTATION!
|
|
*/
|
|
void restore_stls( ALLOC_INFO* alloc_info );
|
|
void restore_stls_in_class( std::string name, char* address, ATTRIBUTES* attr) ;
|
|
void restore_stls_in_arrayed_class( std::string name,
|
|
char* address, ATTRIBUTES* attr, int curr_dim, int offset) ;
|
|
void restore_stls_in_intrinsic( std::string name,
|
|
void* address, ATTRIBUTES* attr, int curr_dim, int offset) ;
|
|
|
|
/**
|
|
FIXME: I NEED DOCUMENTATION!
|
|
*/
|
|
void get_alloc_deps_in_allocation( ALLOC_INFO* alloc_info );
|
|
/**
|
|
FIXME: I NEED DOCUMENTATION!
|
|
*/
|
|
void get_alloc_deps_in_allocation( const char* var_name );
|
|
/**
|
|
FIXME: I NEED DOCUMENTATION!
|
|
*/
|
|
void get_alloc_deps_in_class( char* address, ATTRIBUTES* attr);
|
|
/**
|
|
FIXME: I NEED DOCUMENTATION!
|
|
*/
|
|
void get_alloc_deps_in_arrayed_class( char* address, ATTRIBUTES* attr, int curr_dim, int offset);
|
|
/**
|
|
FIXME: I NEED DOCUMENTATION!
|
|
*/
|
|
void get_alloc_deps_in_intrinsic( void* address, ATTRIBUTES* attr, int curr_dim, int offset);
|
|
|
|
std::set< std::string > primitive_types ; /**< ** Names of primitive types. Used in add_attr_info */
|
|
std::map< std::string , std::string > template_name_map ; /**< ** Templates names => mangled attr names */
|
|
|
|
/**
|
|
Assign the value(s) in v_tree to the variable at the given address.
|
|
The object at the address may be a singleton or an array of up to
|
|
eight dimensions. If v_tree is NULL, then assign nil values.
|
|
|
|
@param base_addr - Base address of the variable in which data is being assigned.
|
|
@param attr - Attributes of the variable.
|
|
@param curr_dim - The dimension of interest in the variable.
|
|
@param offset - Offset to one of the elements in the dimension of interest.
|
|
@param v_tree - RHS data to be assigned.
|
|
@param cf - units conversion function.
|
|
*/
|
|
int assign_recursive(void* base_addr, ATTRIBUTES* attr, int curr_dim, int offset, V_TREE* v_tree, cv_converter * cf);
|
|
|
|
/**
|
|
Copy the common elements from one array to another. The arrays must be of the same dimension,
|
|
but may be different sizes in one or more of those dimensions. Said another way, we are copying
|
|
"overlapping" array elements.
|
|
|
|
@param s_base - source base address.
|
|
@param d_base - destination base address.
|
|
@param s_cdims - sizes of constrained dimensions of the source array.
|
|
@param d_cdims - sizes of constrained dimensions of the destination array.
|
|
@param size - sizeof an individual array element.
|
|
@param n - number of array dimensions. s_cdims and d_cdims are both this size.
|
|
@param cur - current dimension.
|
|
@param s_off - source offset in the current dimension.
|
|
@param d_off - destination offset in the current dimension.
|
|
*/
|
|
void recursive_array_copy( void* s_base, void* d_base, int* s_cdims, int* d_cdims, size_t size, int n, int cur, int s_off, int d_off);
|
|
|
|
/**
|
|
Convenience version of recursive_array_copy.
|
|
|
|
@param s_base - source base address.
|
|
@param d_base - destination base address.
|
|
@param s_cdims - sizes of constrained dimensions of the source array.
|
|
@param d_cdims - sizes of constrained dimensions of the destination array.
|
|
@param size - sizeof an individual array element.
|
|
@param n - number of array dimensions. s_cdims and d_cdims are both this size.
|
|
*/
|
|
void array_copy( void* s_base, void* d_base, int* s_cdims, int* d_cdims, size_t size, int n);
|
|
|
|
/**
|
|
{Trick_type, class_name, n_stars} ==> {sub_attr, size}
|
|
*/
|
|
int get_type_attributes( TRICK_TYPE& type, std::string user_type_name, int n_stars, ATTRIBUTES*& sub_attr, int& size);
|
|
|
|
/**
|
|
Create reference attributes from the the given ALLOC_INFO record.
|
|
@param alloc_info pointer to the ALLOC_INFO record.
|
|
*/
|
|
ATTRIBUTES* make_reference_attr( ALLOC_INFO* alloc_info);
|
|
|
|
/**
|
|
Delete/free the given reference attributes.
|
|
*/
|
|
void free_reference_attr( ATTRIBUTES* reference_attr);
|
|
|
|
/**
|
|
Allocate one or more instances of the named class.
|
|
@param class_name The name of the class to allocate.
|
|
@param num The number of instances to allocate.
|
|
@return The address of the allocation, or NULL on failure.
|
|
*/
|
|
void* io_src_allocate_class(const char* class_name, int num);
|
|
|
|
/**
|
|
Call the default destructor for one or more instances of the named class.
|
|
@param alloc_info The alloc_info struct that contains the address and type to delete.
|
|
*/
|
|
void io_src_destruct_class(ALLOC_INFO * alloc_info);
|
|
|
|
/**
|
|
Call the proper class/struct delete for the address given in the ALLOC_INFO struct.
|
|
@param alloc_info The alloc_info struct that contains the address and type to delete.
|
|
*/
|
|
void io_src_delete_class(ALLOC_INFO * alloc_info);
|
|
|
|
/**
|
|
FIXME: I NEED DOCUMENTATION!
|
|
*/
|
|
void clear_rvalue( void* base_address, ATTRIBUTES* attr, int curr_dim, int offset);
|
|
/**
|
|
FIXME: I NEED DOCUMENTATION!
|
|
*/
|
|
void clear_class( char *address, ATTRIBUTES * A);
|
|
/**
|
|
FIXME: I NEED DOCUMENTATION!
|
|
*/
|
|
void clear_arrayed_class( char* address, ATTRIBUTES* A, int curr_dim, int offset);
|
|
/**
|
|
FIXME: I NEED DOCUMENTATION!
|
|
*/
|
|
void debug_write_alloc_info( ALLOC_INFO *alloc_info);
|
|
|
|
/**
|
|
Returns a pointer to the udunits system we are using.
|
|
*/
|
|
ut_system * get_unit_system() ;
|
|
|
|
}; // endof class MemoryManager
|
|
|
|
} // endof namespace Trick
|
|
|
|
#ifndef SWIG
|
|
extern Trick::MemoryManager* trick_MM;
|
|
#endif
|
|
|
|
#endif
|
|
|