Logo ROOT   6.18/05
Reference Guide
TMemStatHook.cxx
Go to the documentation of this file.
1// @(#)root/memstat:$Id$
2// Author: Anar Manafov (A.Manafov@gsi.de) 2008-03-02
3
4/*************************************************************************
5* Copyright (C) 1995-2010, Rene Brun and Fons Rademakers. *
6* All rights reserved. *
7* *
8* For the licensing terms see $ROOTSYS/LICENSE. *
9* For the list of contributors see $ROOTSYS/README/CREDITS. *
10*************************************************************************/
11//STD
12#include <iostream>
13// MemStat
14#include "TMemStatHook.h"
15#include <ROOT/RConfig.hxx>
16
17// TODO: move it to a separate file
18#if defined(__APPLE__)
19static malloc_zone_t original_zone;
20#ifndef __CINT__
21static void* profile_malloc(malloc_zone_t *zone, size_t size);
22static void* profile_calloc(malloc_zone_t *zone, size_t num_items, size_t size);
23static void* profile_valloc(malloc_zone_t *zone, size_t size);
24static void profile_free(malloc_zone_t *zone, void *ptr);
25#if defined(MAC_OS_X_VERSION_10_6)
26static void profile_free_definite_size(malloc_zone_t *zone, void *ptr, size_t size);
27#endif
28#endif
29
30static zoneMallocHookFunc_t m_pm;
31static zoneFreeHookFunc_t m_pf;
32#else
33#include <malloc.h>
34#endif
35
36#if defined(R__GNU) && (defined(R__LINUX) || defined(__APPLE__))
37#define SUPPORTS_MEMSTAT
38#endif
39
40
41using namespace std;
42
43#if !defined(__APPLE__)
44////////////////////////////////////////////////////////////////////////////////
45/// GetMallocHook - a static function
46/// malloc function getter
47
49{
50#if defined(SUPPORTS_MEMSTAT)
51 return __malloc_hook;
52#else
53 return 0;
54#endif
55}
56
57////////////////////////////////////////////////////////////////////////////////
58/// GetFreeHook - a static function
59/// free function getter
60
62{
63#if defined(SUPPORTS_MEMSTAT)
64 return __free_hook;
65#else
66 return 0;
67#endif
68}
69
70////////////////////////////////////////////////////////////////////////////////
71/// SetMallocHook - a static function
72/// Set pointer to function replacing alloc function
73
74void TMemStatHook::SetMallocHook(MallocHookFunc_t p)
75{
76#if defined(SUPPORTS_MEMSTAT)
77 __malloc_hook = p;
78#endif
79}
80
81////////////////////////////////////////////////////////////////////////////////
82/// SetFreeHook - a static function
83/// Set pointer to function replacing free function
84
85void TMemStatHook::SetFreeHook(FreeHookFunc_t p)
86{
87#if defined(SUPPORTS_MEMSTAT)
88 __free_hook = p;
89#endif
90}
91#endif // !defined(__APPLE__)
92
93////////////////////////////////////////////////////////////////////////////////
94/// tracZoneMalloc - a static function
95/// override the default Mac OS X memory zone
96
97#if defined (__APPLE__)
98void TMemStatHook::trackZoneMalloc(zoneMallocHookFunc_t pm,
99 zoneFreeHookFunc_t pf)
100{
101 malloc_zone_t* zone = malloc_default_zone();
102 if (!zone) {
103 cerr << "Error: Can't get malloc_default_zone" << endl;
104 return;
105 }
106 m_pm = pm;
107 m_pf = pf;
108
109 original_zone = *zone;
110 zone->malloc = &profile_malloc;
111 zone->calloc = &profile_calloc;
112 zone->valloc = &profile_valloc;
113 zone->free = &profile_free;
114#if defined(MAC_OS_X_VERSION_10_6)
115 if (zone->version >= 6 && zone->free_definite_size)
116 zone->free_definite_size = &profile_free_definite_size;
117#endif
118}
119////////////////////////////////////////////////////////////////////////////////
120/// untrackZoneMalloc - a static function
121/// set the default Mac OS X memory zone to original
122
123void TMemStatHook::untrackZoneMalloc()
124{
125 malloc_zone_t* zone = malloc_default_zone();
126 if (!zone) {
127 cerr << "Error: Can't get malloc_default_zone" << endl;
128 return;
129 }
130 *zone = original_zone;
131}
132////////////////////////////////////////////////////////////////////////////////
133/// Mac OS X profiler of malloc calls
134
135void* profile_malloc(malloc_zone_t *zone, size_t size)
136{
137 void* ptr = (*original_zone.malloc)(zone, size);
138 m_pm(ptr, size);
139 return ptr;
140}
141
142////////////////////////////////////////////////////////////////////////////////
143/// Mac OS X profiler of calloc calls
144
145void* profile_calloc(malloc_zone_t *zone, size_t num_items, size_t size)
146{
147 void* ptr = (*original_zone.calloc)(zone, num_items, size);
148 m_pm(ptr, size);
149 return ptr;
150}
151
152////////////////////////////////////////////////////////////////////////////////
153/// Mac OS X profiler of valloc calls
154
155void* profile_valloc(malloc_zone_t *zone, size_t size)
156{
157 void* ptr = (*original_zone.valloc)(zone, size);
158 m_pm(ptr, size);
159 return ptr;
160}
161
162////////////////////////////////////////////////////////////////////////////////
163/// Mac OS X profiler of free calls
164
165void profile_free(malloc_zone_t *zone, void *ptr)
166{
167 (*original_zone.free)(zone, ptr);
168 m_pf(ptr);
169}
170
171////////////////////////////////////////////////////////////////////////////////
172/// Mac OS X profiler of free_definite_size calls
173
174#if defined(MAC_OS_X_VERSION_10_6)
175void profile_free_definite_size(malloc_zone_t *zone, void *ptr, size_t size)
176{
177 (*original_zone.free_definite_size)(zone, ptr, size);
178 m_pf(ptr);
179}
180#endif // defined(MAC_OS_X_VERSION_10_6)
181#endif // defined(__APPLE__)
static MallocHookFunc_t GetMallocHook()
GetMallocHook - a static function malloc function getter.
static void SetMallocHook(MallocHookFunc_t p)
SetMallocHook - a static function Set pointer to function replacing alloc function.
void(* FreeHookFunc_t)(void *ptr, const void *caller)
Definition: TMemStatHook.h:36
void *(* MallocHookFunc_t)(size_t size, const void *caller)
Definition: TMemStatHook.h:35
static FreeHookFunc_t GetFreeHook()
GetFreeHook - a static function free function getter.
static void SetFreeHook(FreeHookFunc_t p)
SetFreeHook - a static function Set pointer to function replacing free function.