// MEMBER FUNCTION void Trick::MemoryManager::clear_var( void* address) { ATTRIBUTES* reference_attr; ALLOC_INFO* alloc_info; pthread_mutex_lock(&mm_mutex); alloc_info = get_alloc_info_at( address); if (alloc_info != NULL) { reference_attr = make_reference_attr( alloc_info); if (alloc_info->type == TRICK_STRUCTURED ) { if (alloc_info->num_index != 0) { clear_arrayed_class( (char*)(alloc_info->start), reference_attr, 0, 0) ; } else { clear_class( (char*)(alloc_info->start), alloc_info->attr) ; } } else { clear_rvalue( alloc_info->start, reference_attr, 0, 0 ); } free_reference_attr( reference_attr); } else { std::stringstream message; message << "Cannot clear the variable at address " << address << "because memory manager knows nothing about it." ; emitError(message.str()); } pthread_mutex_unlock(&mm_mutex); }
int Trick::MemoryManager::ref_var( REF2* R, char* name) { ALLOC_INFO *alloc_info; VARIABLE_MAP::iterator pos; pthread_mutex_lock(&mm_mutex); pos = variable_map.find( name); if (pos != variable_map.end()) { alloc_info = pos->second; R->attr = make_reference_attr( alloc_info); R->address = alloc_info->start; if ( R->create_add_path ) { ADDRESS_NODE * address_node ; address_node = new ADDRESS_NODE ; address_node->operator_ = AO_ADDRESS ; address_node->operand.address = R->address ; DLL_AddTail(address_node , R->address_path) ; } pthread_mutex_unlock(&mm_mutex); return (MM_OK); } else { // ERROR. } pthread_mutex_unlock(&mm_mutex); return (MM_UNDEFINED_REFERENCE); }
// MEMBER FUNCTION void Trick::MemoryManager::restore_stls( ALLOC_INFO* alloc_info ) { ATTRIBUTES* reference_attr; if (debug_level > 1) { std::cout << "DEBUG: Entered function:" << __FUNCTION__ << std::endl; } if (alloc_info == NULL) { std::cout << "ERROR: Trick::MemoryManager::restore_stls called with alloc_info == NULL." << std::endl; std::cout.flush(); return; } // If there is no name associated with this alloc_info, we won't be able to find any stls associated with it. if (alloc_info->name == NULL) { return; } if (debug_level) { std::cout << __FUNCTION__ << ": Begin scan of allocation @" << (void*)alloc_info->start << " for dependencies." << std::endl; } reference_attr = make_reference_attr( alloc_info ); // Get the dependencies of the allocation if (alloc_info->type == TRICK_STRUCTURED) { if (reference_attr->num_index > 0) { restore_stls_in_arrayed_class(alloc_info->name, (char*)(alloc_info->start), reference_attr, 0, 0) ; } else { restore_stls_in_class(alloc_info->name, (char*)(alloc_info->start), alloc_info->attr) ; } } else { restore_stls_in_intrinsic(alloc_info->name, alloc_info->start, reference_attr, 0, 0 ); } if (debug_level) { std::cout << __FUNCTION__ << ": End scan of allocation @" << (void*)alloc_info->start << "." << std::endl; } free_reference_attr( reference_attr ); }