VirtualBox

source: vbox/trunk/include/iprt/memtracker.h@ 94219

Last change on this file since 94219 was 93115, checked in by vboxsync, 3 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.2 KB
Line 
1/** @file
2 * IPRT - Memory Tracker.
3 */
4
5/*
6 * Copyright (C) 2010-2022 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef IPRT_INCLUDED_memtracker_h
27#define IPRT_INCLUDED_memtracker_h
28#ifndef RT_WITHOUT_PRAGMA_ONCE
29# pragma once
30#endif
31
32#include <iprt/cdefs.h>
33#include <iprt/types.h>
34#include <iprt/list.h>
35
36RT_C_DECLS_BEGIN
37
38/** @defgroup grp_rt_memtracker RTMemTracker - Memory Allocation Tracker.
39 * @ingroup grp_rt
40 * @{
41 */
42
43/**
44 * The allocation/free method.
45 */
46typedef enum RTMEMTRACKERMETHOD
47{
48 RTMEMTRACKERMETHOD_INVALID = 0,
49 RTMEMTRACKERMETHOD_ALLOC,
50 RTMEMTRACKERMETHOD_ALLOCZ,
51 RTMEMTRACKERMETHOD_REALLOC_PREP, /**< Internal, don't use. */
52 RTMEMTRACKERMETHOD_REALLOC_DONE, /**< Internal, don't use. */
53 RTMEMTRACKERMETHOD_REALLOC_FAILED, /**< Internal, don't use. */
54 RTMEMTRACKERMETHOD_FREE,
55
56 RTMEMTRACKERMETHOD_NEW,
57 RTMEMTRACKERMETHOD_NEW_ARRAY,
58 RTMEMTRACKERMETHOD_DELETE,
59 RTMEMTRACKERMETHOD_DELETE_ARRAY,
60 RTMEMTRACKERMETHOD_END,
61 RTMEMTRACKERMETHOD_32BIT_HACK = 0x7fffffff
62} RTMEMTRACKERMETHOD;
63
64/** Pointer to a tag structure. */
65typedef struct RTMEMTRACKERTAG *PRTMEMTRACKERTAG;
66
67/** Pointer to a user structure. */
68typedef struct RTMEMTRACKERUSER *PRTMEMTRACKERUSER;
69
70/**
71 * Memory Tracking Header for use with RTMemTrackerHdrAlloc,
72 * RTMemTrackerHdrReallocPrep, RTMemTrackerHdrReallocDone and
73 * RTMemTrackerHdrFree.
74 */
75typedef struct RTMEMTRACKERHDR
76{
77 /** Magic value / eye catcher (RTMEMTRACKERHDR_MAGIC). */
78 size_t uMagic;
79 /** The allocation size, user data only. */
80 size_t cbUser;
81 /** The list entry. */
82 RTLISTNODE ListEntry;
83 /** Pointer to the user structure where this header is linked. */
84 PRTMEMTRACKERUSER pUser;
85 /** Pointer to the per-tag structure. */
86 PRTMEMTRACKERTAG pTag;
87 /** The tag string. */
88 const char *pszTag;
89 /** The caller address. */
90 void *pvCaller;
91 /** Pointer to the user data we're tracking. */
92 void *pvUser;
93 /** Alignment padding. */
94 size_t uReserved;
95} RTMEMTRACKERHDR;
96/** Pointer to a memory tracker header. */
97typedef RTMEMTRACKERHDR *PRTMEMTRACKERHDR;
98/** Pointer to a const memory tracker header. */
99typedef RTMEMTRACKERHDR *PPRTMEMTRACKERHDR;
100
101/** Magic value for RTMEMTRACKERHDR::uMagic (Kelly Link). */
102#if ARCH_BITS == 64
103# define RTMEMTRACKERHDR_MAGIC UINT64_C(0x1907691919690719)
104#else
105# define RTMEMTRACKERHDR_MAGIC UINT32_C(0x19690719)
106#endif
107/** Magic number used when reallocated. */
108#if ARCH_BITS == 64
109# define RTMEMTRACKERHDR_MAGIC_REALLOC UINT64_C(0x0000691919690000)
110#else
111# define RTMEMTRACKERHDR_MAGIC_REALLOC UINT32_C(0x19690000)
112#endif
113/** Magic number used when freed. */
114#define RTMEMTRACKERHDR_MAGIC_FREE (~RTMEMTRACKERHDR_MAGIC)
115
116
117/**
118 * Initializes the allocation header and links it to the relevant tag.
119 *
120 * @returns Pointer to the user data part.
121 * @param pv The header + user data block. This must be at
122 * least @a cb + sizeof(RTMEMTRACKERHDR).
123 * @param cbUser The user data size (bytes).
124 * @param pszTag The tag string.
125 * @param pvCaller The return address.
126 * @param enmMethod The method that the user called.
127 */
128RTDECL(void *) RTMemTrackerHdrAlloc(void *pv, size_t cbUser, const char *pszTag, void *pvCaller, RTMEMTRACKERMETHOD enmMethod);
129
130/**
131 * Prepares for a realloc, i.e. invalidates the header.
132 *
133 * @returns Pointer to the user data part.
134 * @param pvOldUser Pointer to the old user data.
135 * @param cbOldUser The size of the old user data, 0 if not
136 * known.
137 * @param pszTag The tag string.
138 * @param pvCaller The return address.
139 */
140RTDECL(void *) RTMemTrackerHdrReallocPrep(void *pvOldUser, size_t cbOldUser, const char *pszTag, void *pvCaller);
141
142/**
143 * Initializes the allocation header and links it to the relevant tag.
144 *
145 * @returns Pointer to the user data part.
146 * @param pvNew The new header + user data block. This must be
147 * at least @a cb + sizeof(RTMEMTRACKERHDR). If
148 * this is NULL, we assume the realloc() call
149 * failed.
150 * @param cbNewUser The user data size (bytes).
151 * @param pvOldUser Pointer to the old user data. This is only
152 * valid on failure of course and used to bail out
153 * in that case. Should not be NULL.
154 * @param pszTag The tag string.
155 * @param pvCaller The return address.
156 */
157RTDECL(void *) RTMemTrackerHdrReallocDone(void *pvNew, size_t cbNewUser, void *pvOldUser, const char *pszTag, void *pvCaller);
158
159
160/**
161 * Do the accounting on free.
162 *
163 * @returns @a pv.
164 * @param pvUser Pointer to the user data.
165 * @param cbUser The size of the user data, 0 if not known.
166 * @param pszTag The tag string.
167 * @param pvCaller The return address.
168 * @param enmMethod The method that the user called.
169 */
170RTDECL(void *) RTMemTrackerHdrFree(void *pvUser, size_t cbUser, const char *pszTag, void *pvCaller, RTMEMTRACKERMETHOD enmMethod);
171
172
173/**
174 * Dumps all the allocations and tag statistics to the log.
175 */
176RTDECL(void) RTMemTrackerDumpAllToLog(void);
177
178/**
179 * Dumps all the allocations and tag statistics to the release log.
180 */
181RTDECL(void) RTMemTrackerDumpAllToLogRel(void);
182
183/**
184 * Dumps all the allocations and tag statistics to standard out.
185 */
186RTDECL(void) RTMemTrackerDumpAllToStdOut(void);
187
188/**
189 * Dumps all the allocations and tag statistics to standard err.
190 */
191RTDECL(void) RTMemTrackerDumpAllToStdErr(void);
192
193/**
194 * Dumps all the allocations and tag statistics to the specified filename.
195 */
196RTDECL(void) RTMemTrackerDumpAllToFile(const char *pszFilename);
197
198
199/**
200 * Dumps all the tag statistics to the log.
201 *
202 * @param fVerbose Whether to print all the stats or just the ones
203 * relevant to hunting leaks.
204 */
205RTDECL(void) RTMemTrackerDumpStatsToLog(bool fVerbose);
206
207/**
208 * Dumps all the tag statistics to the release log.
209 *
210 * @param fVerbose Whether to print all the stats or just the ones
211 * relevant to hunting leaks.
212 */
213RTDECL(void) RTMemTrackerDumpStatsToLogRel(bool fVerbose);
214
215/**
216 * Dumps all the tag statistics to standard out.
217 *
218 * @param fVerbose Whether to print all the stats or just the ones
219 * relevant to hunting leaks.
220 */
221RTDECL(void) RTMemTrackerDumpStatsToStdOut(bool fVerbose);
222
223/**
224 * Dumps all the tag statistics to standard err.
225 *
226 * @param fVerbose Whether to print all the stats or just the ones
227 * relevant to hunting leaks.
228 */
229RTDECL(void) RTMemTrackerDumpStatsToStdErr(bool fVerbose);
230
231/**
232 * Dumps all the tag statistics to the specified filename.
233 *
234 * @param fVerbose Whether to print all the stats or just the ones
235 * relevant to hunting leaks.
236 * @param pszFilename The name of the file to dump to.
237 */
238RTDECL(void) RTMemTrackerDumpStatsToFile(bool fVerbose, const char *pszFilename);
239
240
241
242/** @} */
243
244RT_C_DECLS_END
245
246#endif /* !IPRT_INCLUDED_memtracker_h */
247
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette