Skip to content
Snippets Groups Projects
Commit 18cad2e7 authored by Pietro Incardona's avatar Pietro Incardona
Browse files

Memleak_check move

parent 55db8122
No related branches found
No related tags found
No related merge requests found
......@@ -8,17 +8,17 @@ else
endif
noinst_PROGRAMS = mem
mem_SOURCES = main.cpp memory/HeapMemory.cpp $(CUDA_SOURCES)
mem_SOURCES = main.cpp memory/HeapMemory.cpp $(CUDA_SOURCES) Memleak_check.cpp
mem_CXXFLAGS = $(INCLUDES_PATH) $(BOOST_CPPFLAGS) -I/usr/local/include
mem_CFLAGS =
mem_LDADD = $(LINKLIBS) -L/usr/lib64/nvidia-bumblebee/
lib_LIBRARIES = libofpmmemory.a
libofpmmemory_a_SOURCES = memory/HeapMemory.cpp $(CUDA_SOURCES) memory/PtrMemory.cpp
libofpmmemory_a_SOURCES = memory/HeapMemory.cpp $(CUDA_SOURCES) memory/PtrMemory.cpp Memleak_check.cpp
libofpmmemory_a_CXXFLAGS = $(INCLUDES_PATH) $(BOOST_CPPFLAGS) -I/usr/local/include
libofpmmemory_a_CFLAGS =
nobase_include_HEADERS = memory/ExtPreAlloc.hpp memory/HeapMemory.hpp memory/memory.hpp memory/PreAllocHeapMemory.hpp memory/PtrMemory.hpp
nobase_include_HEADERS = memory/ExtPreAlloc.hpp memory/HeapMemory.hpp memory/memory.hpp memory/PreAllocHeapMemory.hpp memory/PtrMemory.hpp Memleak_check.hpp
.cu.o :
$(NVCC) $(NVCCFLAGS) -I. $(INCLUDES_PATH) -o $@ -c $<
#include "config.h"
#include "Memleak_check.hpp"
#ifdef SE_CLASS2
// counter for allocation of new memory
size_t new_data;
// counter to delete memory
size_t delete_data;
// structure that store all the active pointer
std::map<byte_ptr, size_t> active_ptr;
// Running process id
long int process_v_cl;
// Process to print
long int process_to_print = 0;
#endif
#include "config.h"
#include <iostream>
#include <map>
#ifndef MEMLEAK_CHECK_HPP
#define MEMLEAK_CHECK_HPP
typedef unsigned char * byte_ptr;
#ifdef SE_CLASS2
#include "util/se_util.hpp"
#define MEM_ERROR 1300lu
extern size_t new_data;
extern size_t delete_data;
extern std::map<byte_ptr,size_t> active_ptr;
extern long int process_v_cl;
extern long int process_to_print;
/*! \brief Check and remove the active pointer
*
* Check and remove the pointer from the active list
*
* \param pointer to check and remove
*
* \return true if the operation succeded, false if the pointer does not exist
*
*/
static bool remove_ptr(const void * ptr)
{
// Check if the pointer exist
std::map<byte_ptr, size_t>::iterator it = active_ptr.find((byte_ptr)ptr);
// if the element does not exist, print that something wrong happened and return
if ( it == active_ptr.end() )
{
std::cout << "Error pointer not found " << ptr << "\n";
ACTION_ON_ERROR(MEM_ERROR);
return false;
}
// erase the pointer
active_ptr.erase((byte_ptr)ptr);
return true;
}
/*! \brief Print all active pointer
*
* Print all active pointer
*
*/
static void print_unalloc()
{
for (std::map<byte_ptr,size_t>::iterator it = active_ptr.begin(); it != active_ptr.end(); ++it)
{
std::cout << "Unallocated memory " << it->first << " size " << it->second << "\n";
}
}
/*! \brief Add the new allocated active pointer
*
* Add the new allocated active pointer
*
* \param new data active pointer
* \param sz size of the new allocated memory
*
*/
static bool check_new(const void * data, size_t sz)
{
// Add a new pointer
new_data++;
active_ptr[(byte_ptr)data] = sz;
#ifdef SE_CLASS2_VERBOSE
if (process_to_print < 0 || process_to_print == process_v_cl)
std::cout << "New data: " << new_data << " " << data << "\n";
#endif
return true;
}
/*! \brief check and delete a pointer
*
* check and delete a pointer from the list of active pointers
*
* \param pointer data
* \return true if the operation to delete succeed
*
*/
static bool check_delete(const void * data)
{
if (data == NULL) return true;
// Delete the pointer
delete_data++;
bool result = remove_ptr(data);
#ifdef SE_CLASS2_VERBOSE
if (process_to_print < 0 || process_to_print == process_v_cl)
std::cout << "Delete data: " << delete_data << " " << data << "\n";
#endif
return result;
}
/*! \brief check if the access is valid
*
* check if the access is valid
*
* \param ptr pointer we are going to access
* \param size_access is the size in byte of the data we are fetching
*
* \return true if the pointer is valid
*
*/
static bool check_valid(const void * ptr, size_t size_access)
{
// get the lower bound
std::map<byte_ptr, size_t>::iterator l_b = active_ptr.upper_bound((byte_ptr)ptr);
if (active_ptr.size() == 0)
{
std::cout << "Error invalid pointer: " << __FILE__ << ":" << __LINE__ << " " << ptr << "\n";
ACTION_ON_ERROR(MEM_ERROR);
return false;
}
//! subtract one
l_b--;
// if there is no memory that satisfy the request
if (l_b == active_ptr.end())
{
if (process_to_print < 0 || process_to_print == process_v_cl)
{
std::cout << "Error invalid pointer: " << __FILE__ << ":" << __LINE__ << " " << ptr << "\n";
ACTION_ON_ERROR(MEM_ERROR);
}
return false;
}
// check if ptr is in the range
size_t sz = l_b->second;
if (((unsigned char *)l_b->first) + sz < ((unsigned char *)ptr) + size_access)
{
if (process_to_print < 0 || process_to_print == process_v_cl)
{
std::cout << "Error invalid pointer: " << __FILE__ << ":" << __LINE__ << " " << ptr << "\n";
ACTION_ON_ERROR(MEM_ERROR);
return false;
}
}
return true;
}
/*! \brief In case of Parallel application it set the process that print the
*
* \param p_to_print is < 0 (Mean all)
*
*/
static void set_process_to_print(long int p_to_print)
{
process_to_print = p_to_print;
}
#else
#endif
#endif
......@@ -104,28 +104,15 @@ public:
// Default constructor
PtrMemory():spm(0),dm(NULL),sz(0),ref_cnt(0)
{
#ifdef SE_CLASS2
if (process_to_print == process_v_cl)
std::cout << "Creating PtrMemory: " << this << "\n";
#endif
};
//! Constructor, we choose a default alignment of 32 for avx
PtrMemory(void * ptr, size_t sz):spm(sz),dm(ptr),sz(0),ref_cnt(0)
{
#ifdef SE_CLASS2
if (process_to_print == process_v_cl)
std::cout << "Creating PtrMemory: " << this << "\n";
#endif
};
~PtrMemory()
{
#ifdef SE_CLASS2
if (process_to_print == process_v_cl)
std::cout << "Delete PtrMemory: " << this << "\n";
#endif
if(ref_cnt == 0)
destroy();
else
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment