23 static pthread_mutex_t pmon_mem_lock
ATLAS_THREAD_SAFE = PTHREAD_MUTEX_INITIALIZER;
29 static void (*orig_free ATLAS_THREAD_SAFE) (
void* ptr,
const void* caller);
32 static void* pmon_mem_malloc (
size_t size,
const void* caller);
33 static void* pmon_mem_realloc(
void* ptr,
size_t size,
const void* caller);
34 static void pmon_mem_free (
void* ptr,
const void* caller);
39 unsigned long long PerfMon::MemStats::m_nbytes = 0;
40 unsigned long long PerfMon::MemStats::m_nmallocs = 0;
41 unsigned long long PerfMon::MemStats::m_nfrees = 0;
54 static void* pmon_mem_malloc(
size_t size,
const void* )
56 static void* pmon_mem_realloc(
void* ptr,
size_t size,
const void* )
57 {
return realloc(ptr,
size); }
58 static void pmon_mem_free(
void* ptr,
const void* )
65 # pragma GCC diagnostic push
66 # pragma GCC diagnostic ignored "-Wdeprecated-declarations"
72 if (0 != pthread_mutex_init(&pmon_mem_lock, NULL)) {
73 throw std::runtime_error(
"perfmon: could not initialize pthread mutex");
75 pthread_mutex_lock(&pmon_mem_lock);
81 pthread_mutex_unlock(&pmon_mem_lock);
95 if (0 != pthread_mutex_destroy(&pmon_mem_lock)) {
96 throw std::runtime_error(
"perfmon: could not destroy pthread mutex");
102 #if HAVE_MALLOC_HOOKS
103 __free_hook = pmon_mem_free;
104 __realloc_hook = pmon_mem_realloc;
105 __malloc_hook = pmon_mem_malloc;
107 pthread_mutex_unlock(&pmon_mem_lock);
112 pthread_mutex_lock(&pmon_mem_lock);
113 #if HAVE_MALLOC_HOOKS
114 __free_hook = orig_free;
115 __realloc_hook = orig_realloc;
116 __malloc_hook = orig_malloc;
122 #if HAVE_MALLOC_HOOKS
125 if ( __malloc_hook != pmon_mem_malloc ) {
126 orig_malloc = __malloc_hook;
129 if ( __realloc_hook != pmon_mem_realloc ) {
130 orig_realloc = __realloc_hook;
133 if ( __free_hook != pmon_mem_free ) {
134 orig_free = __free_hook;
142 #if HAVE_MALLOC_HOOKS
143 static void* pmon_mem_malloc(
size_t size,
const void* )
154 PerfMon::MemStats::m_nbytes +=
size;
155 PerfMon::MemStats::m_nmallocs += 1;
166 static void* pmon_mem_realloc(
void* ptr,
size_t size,
const void* )
177 PerfMon::MemStats::m_nbytes +=
size;
178 PerfMon::MemStats::m_nmallocs += 1;
189 static void pmon_mem_free(
void* ptr,
const void* )
198 PerfMon::MemStats::m_nfrees += 1;