VirtualBox

source: vbox/trunk/include/iprt/mem.h@ 1

Last change on this file since 1 was 1, checked in by vboxsync, 55 years ago

import

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.5 KB
Line 
1/** @file
2 * InnoTek Portable Runtime - Memory Management and Manipulation.
3 */
4
5/*
6 * Copyright (C) 2006 InnoTek Systemberatung GmbH
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 as published by the Free Software Foundation,
12 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
13 * distribution. VirtualBox OSE is distributed in the hope that it will
14 * be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * If you received this file as part of a commercial VirtualBox
17 * distribution, then only the terms of your commercial VirtualBox
18 * license agreement apply instead of the previous paragraph.
19 */
20
21#ifndef __iprt_mem_h__
22#define __iprt_mem_h__
23
24
25#include <iprt/cdefs.h>
26#include <iprt/types.h>
27
28#ifdef IN_GC
29# error "There are no RTMem APIs available Guest Context!"
30#endif
31
32__BEGIN_DECLS
33
34/** @defgroup grp_rt_mem RTMem - Memory Management and Manipulation
35 * @ingroup grp_rt
36 * @{
37 */
38
39/** @def RTMEM_ALIGNMENT
40 * The alignment of the memory blocks returned by RTMemAlloc(), RTMemAllocZ(),
41 * RTMemRealloc(), RTMemTmpAlloc() and RTMemTmpAllocZ() for allocations greater
42 * than RTMEM_ALIGNMENT.
43 */
44#ifdef __L4ENV__
45# define RTMEM_ALIGNMENT 4 /**< @todo Michael, can you check that this is still true with ucLibc, please. */
46#else
47# define RTMEM_ALIGNMENT 8
48#endif
49
50/**
51 * Allocates temporary memory.
52 *
53 * Temporary memory blocks are used for not too large memory blocks which
54 * are believed not to stick around for too long. Using this API instead
55 * of RTMemAlloc() not only gives the heap manager room for optimization
56 * but makes the code easier to read.
57 *
58 * @returns Pointer to the allocated memory.
59 * @returns NULL on failure.
60 * @param cb Size in bytes of the memory block to allocated.
61 */
62RTDECL(void *) RTMemTmpAlloc(size_t cb);
63
64/**
65 * Allocates zero'ed temporary memory.
66 *
67 * Same as RTMemTmpAlloc() but the memory will be zero'ed.
68 *
69 * @returns Pointer to the allocated memory.
70 * @returns NULL on failure.
71 * @param cb Size in bytes of the memory block to allocated.
72 */
73RTDECL(void *) RTMemTmpAllocZ(size_t cb);
74
75/**
76 * Free temporary memory.
77 *
78 * @param pv Pointer to memory block.
79 */
80RTDECL(void) RTMemTmpFree(void *pv);
81
82
83/**
84 * Allocates memory.
85 *
86 * @returns Pointer to the allocated memory.
87 * @returns NULL on failure.
88 * @param cb Size in bytes of the memory block to allocated.
89 */
90RTDECL(void *) RTMemAlloc(size_t cb);
91
92/**
93 * Allocates zero'ed memory.
94 *
95 * Instead of memset(pv, 0, sizeof()) use this when you want zero'ed
96 * memory. This keeps the code smaller and the heap can skip the memset
97 * in about 0.42% of calls :-).
98 *
99 * @returns Pointer to the allocated memory.
100 * @returns NULL on failure.
101 * @param cb Size in bytes of the memory block to allocated.
102 */
103RTDECL(void *) RTMemAllocZ(size_t cb);
104
105/**
106 * Duplicates a chunk of memory into a new heap block.
107 *
108 * @returns New heap block with the duplicate data.
109 * @returns NULL if we're out of memory.
110 * @param pvSrc The memory to duplicate.
111 * @param cb The amount of memory to duplicate.
112 */
113RTDECL(void *) RTMemDup(const void *pvSrc, size_t cb);
114
115/**
116 * Duplicates a chunk of memory into a new heap block with some
117 * additional zeroed memory.
118 *
119 * @returns New heap block with the duplicate data.
120 * @returns NULL if we're out of memory.
121 * @param pvSrc The memory to duplicate.
122 * @param cbSrc The amount of memory to duplicate.
123 * @param cbExtra The amount of extra memory to allocate and zero.
124 */
125RTDECL(void *) RTMemDupEx(const void *pvSrc, size_t cbSrc, size_t cbExtra);
126
127/**
128 * Reallocates memory.
129 *
130 * @returns Pointer to the allocated memory.
131 * @returns NULL on failure.
132 * @param pvOld The memory block to reallocate.
133 * @param cbNew The new block size (in bytes).
134 */
135RTDECL(void *) RTMemRealloc(void *pvOld, size_t cbNew);
136
137/**
138 * Free memory related to an virtual machine
139 *
140 * @param pv Pointer to memory block.
141 */
142RTDECL(void) RTMemFree(void *pv);
143
144/**
145 * Allocates memory which may contain code.
146 *
147 * @returns Pointer to the allocated memory.
148 * @returns NULL on failure.
149 * @param cb Size in bytes of the memory block to allocate.
150 */
151RTDECL(void *) RTMemExecAlloc(size_t cb);
152
153/**
154 * Free executable/read/write memory allocated by RTMemExecAlloc().
155 *
156 * @param pv Pointer to memory block.
157 */
158RTDECL(void) RTMemExecFree(void *pv);
159
160/**
161 * Allocate page aligned memory.
162 *
163 * @returns Pointer to the allocated memory.
164 * @returns NULL if we're out of memory.
165 * @param cb Size of the memory block. Will be rounded up to page size.
166 */
167RTDECL(void *) RTMemPageAlloc(size_t cb);
168
169/**
170 * Allocate zero'ed page aligned memory.
171 *
172 * @returns Pointer to the allocated memory.
173 * @returns NULL if we're out of memory.
174 * @param cb Size of the memory block. Will be rounded up to page size.
175 */
176RTDECL(void *) RTMemPageAllocZ(size_t cb);
177
178/**
179 * Free a memory block allocated with RTMemPageAlloc() or RTMemPageAllocZ().
180 *
181 * @param pv Pointer to the block as it was returned by the allocation function.
182 * NULL will be ignored.
183 */
184RTDECL(void) RTMemPageFree(void *pv);
185
186/** Page level protection flags for RTMemProtect().
187 * @{
188 */
189/** Read access. */
190#define RTMEM_PROT_NONE 0
191/** Read access. */
192#define RTMEM_PROT_READ 1
193/** Write access. */
194#define RTMEM_PROT_WRITE 2
195/** Execute access. */
196#define RTMEM_PROT_EXEC 4
197/** @} */
198
199/**
200 * Change the page level protection of a memory region.
201 *
202 * @returns iprt status code.
203 * @param pv Start of the region. Will be rounded down to nearest page boundary.
204 * @param cb Size of the region. Will be rounded up to the nearest page boundary.
205 * @param fProtect The new protection, a combination of the RTMEM_PROT_* defines.
206 */
207RTDECL(int) RTMemProtect(void *pv, size_t cb, unsigned fProtect);
208
209
210#ifdef IN_RING0
211
212/**
213 * Allocates physical contiguous memory (below 4GB).
214 * The allocation is page aligned and the content is undefined.
215 *
216 * @returns Pointer to the memory block. This is page aligned.
217 * @param pPhys Where to store the physical address.
218 * @param cb The allocation size in bytes. This is always
219 * rounded up to PAGE_SIZE.
220 */
221RTR0DECL(void *) RTMemContAlloc(PRTCCPHYS pPhys, size_t cb);
222
223/**
224 * Frees memory allocated ysing RTMemContAlloc().
225 *
226 * @param pv Pointer to return from RTMemContAlloc().
227 * @param cb The cb parameter passed to RTMemContAlloc().
228 */
229RTR0DECL(void) RTMemContFree(void *pv, size_t cb);
230
231#endif
232
233
234/** @name Electrical Fence Version of some APIs.
235 * @{
236 */
237
238/**
239 * Same as RTMemTmpAlloc() except that it's fenced.
240 *
241 * @returns Pointer to the allocated memory.
242 * @returns NULL on failure.
243 * @param cb Size in bytes of the memory block to allocate.
244 */
245RTDECL(void *) RTMemEfTmpAlloc(size_t cb);
246
247/**
248 * Same as RTMemTmpAllocZ() except that it's fenced.
249 *
250 * @returns Pointer to the allocated memory.
251 * @returns NULL on failure.
252 * @param cb Size in bytes of the memory block to allocate.
253 */
254RTDECL(void *) RTMemEfTmpAllocZ(size_t cb);
255
256/**
257 * Same as RTMemTmpFree() except that it's for fenced memory.
258 *
259 * @param pv Pointer to memory block.
260 */
261RTDECL(void) RTMemEfTmpFree(void *pv);
262
263/**
264 * Same as RTMemAlloc() except that it's fenced.
265 *
266 * @returns Pointer to the allocated memory. Free with RTMemEfFree().
267 * @returns NULL on failure.
268 * @param cb Size in bytes of the memory block to allocate.
269 */
270RTDECL(void *) RTMemEfAlloc(size_t cb);
271
272/**
273 * Same as RTMemAllocZ() except that it's fenced.
274 *
275 * @returns Pointer to the allocated memory.
276 * @returns NULL on failure.
277 * @param cb Size in bytes of the memory block to allocate.
278 */
279RTDECL(void *) RTMemEfAllocZ(size_t cb);
280
281/**
282 * Same as RTMemRealloc() except that it's fenced.
283 *
284 * @returns Pointer to the allocated memory.
285 * @returns NULL on failure.
286 * @param pvOld The memory block to reallocate.
287 * @param cbNew The new block size (in bytes).
288 */
289RTDECL(void *) RTMemEfRealloc(void *pvOld, size_t cbNew);
290
291/**
292 * Free memory allocated by any of the RTMemEf* allocators.
293 *
294 * @param pv Pointer to memory block.
295 */
296RTDECL(void) RTMemEfFree(void *pv);
297
298/**
299 * Same as RTMemDup() except that it's fenced.
300 *
301 * @returns New heap block with the duplicate data.
302 * @returns NULL if we're out of memory.
303 * @param pvSrc The memory to duplicate.
304 * @param cb The amount of memory to duplicate.
305 */
306RTDECL(void *) RTMemEfDup(const void *pvSrc, size_t cb);
307
308/**
309 * Same as RTMemEfDupEx except that it's fenced.
310 *
311 * @returns New heap block with the duplicate data.
312 * @returns NULL if we're out of memory.
313 * @param pvSrc The memory to duplicate.
314 * @param cbSrc The amount of memory to duplicate.
315 * @param cbExtra The amount of extra memory to allocate and zero.
316 */
317RTDECL(void *) RTMemEfDupEx(const void *pvSrc, size_t cbSrc, size_t cbExtra);
318
319/** @def RTMEM_WRAP_TO_EF_APIS
320 * Define RTMEM_WRAP_TO_EF_APIS to wrap RTMem APIs to RTMemEf APIs.
321 */
322#ifdef RTMEM_WRAP_TO_EF_APIS
323# define RTMemTmpAlloc RTMemEfTmpAlloc
324# define RTMemTmpAllocZ RTMemEfTmpAllocZ
325# define RTMemTmpFree RTMemEfTmpFree
326# define RTMemAlloc RTMemEfAlloc
327# define RTMemAllocZ RTMemEfAllocZ
328# define RTMemRealloc RTMemEfRealloc
329# define RTMemFree RTMemEfFree
330# define RTMemDup RTMemEfDup
331# define RTMemDupEx RTMemEfDupEx
332#endif
333#ifdef __DOXYGEN__
334# define RTMEM_WRAP_TO_EF_APIS
335#endif
336
337/** @} */
338
339/** @} */
340
341__END_DECLS
342
343#endif
344
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