Changeset 46739 in vbox for trunk/src/VBox/Runtime/r3/generic
- Timestamp:
- Jun 23, 2013 4:10:25 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 86665
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r3/generic/allocex-r3-generic.cpp
r46568 r46739 1 1 /* $Id$ */ 2 2 /** @file 3 * IPRT - Memory Allocation, Extended Alloc and Free Functions for Ring-3, generic.3 * IPRT - Memory Allocation, Extended Alloc Workers, generic. 4 4 */ 5 5 … … 34 34 35 35 #include <iprt/assert.h> 36 #include <iprt/string.h> 37 #include "internal/magics.h" 38 39 40 /******************************************************************************* 41 * Structures and Typedefs * 42 *******************************************************************************/ 43 /** 44 * Heading for extended memory allocations in ring-3. 45 */ 46 typedef struct RTMEMHDRR3 47 { 48 /** Magic (RTMEMHDR_MAGIC). */ 49 uint32_t u32Magic; 50 /** Block flags (RTMEMALLOCEX_FLAGS_*). */ 51 uint32_t fFlags; 52 /** The actual size of the block, header not included. */ 53 uint32_t cb; 54 /** The requested allocation size. */ 55 uint32_t cbReq; 56 } RTMEMHDRR3; 57 /** Pointer to a ring-3 extended memory header. */ 58 typedef RTMEMHDRR3 *PRTMEMHDRR3; 36 #include "../allocex-r3.h" 59 37 60 38 61 39 62 RTDECL(int) RTMemAllocExTag(size_t cb, size_t cbAlignment, uint32_t fFlags, const char *pszTag, void **ppv) RT_NO_THROW 40 DECLHIDDEN(int) rtMemAllocEx16BitReach(size_t cbAlloc, uint32_t fFlags, void **ppv) 63 41 { 64 /* 65 * Validate and adjust input. 66 */ 67 AssertMsgReturn(!(fFlags & ~RTMEMALLOCEX_FLAGS_VALID_MASK), ("%#x\n", fFlags), VERR_INVALID_PARAMETER); 68 AssertReturn(cb > 0, VERR_INVALID_PARAMETER); 69 AssertReturn(RT_IS_POWER_OF_TWO(cbAlignment), VERR_INVALID_PARAMETER); 70 AssertMsgReturn(cbAlignment <= sizeof(void *), ("%zu (%#x)\n", cbAlignment, cbAlignment), VERR_UNSUPPORTED_ALIGNMENT); 71 72 if (fFlags & (RTMEMALLOCEX_FLAGS_16BIT_REACH | RTMEMALLOCEX_FLAGS_32BIT_REACH | RTMEMALLOCEX_FLAGS_ANY_CTX)) 73 return VERR_NOT_SUPPORTED; 74 75 /* 76 * Align the request. 77 */ 78 size_t cbAligned = cb; 79 if (cbAlignment) 80 cbAligned = RT_ALIGN_Z(cb, cbAlignment); 81 else 82 cbAligned = RT_ALIGN_Z(cb, sizeof(uint64_t)); 83 AssertMsgReturn(cbAligned >= cb && cbAligned <= ~(size_t)0, ("cbAligned=%#zx cb=%#zx", cbAligned, cb), 84 VERR_INVALID_PARAMETER); 85 86 /* 87 * Allocate the requested memory. 88 */ 89 void *pv; 90 if (fFlags & RTMEMALLOCEX_FLAGS_EXEC) 91 { 92 pv = RTMemExecAlloc(cbAligned + sizeof(RTMEMHDRR3)); 93 if ((fFlags & RTMEMALLOCEX_FLAGS_ZEROED) && pv) 94 RT_BZERO(pv, cbAligned + sizeof(RTMEMHDRR3)); 95 } 96 else if (fFlags & RTMEMALLOCEX_FLAGS_ZEROED) 97 pv = RTMemAllocZ(cbAligned + sizeof(RTMEMHDRR3)); 98 else 99 pv = RTMemAlloc(cbAligned + sizeof(RTMEMHDRR3)); 100 if (!pv) 101 return VERR_NO_MEMORY; 102 103 /* 104 * Fill in the header and return. 105 */ 106 PRTMEMHDRR3 pHdr = (PRTMEMHDRR3)pv; 107 pHdr->u32Magic = RTMEMHDR_MAGIC; 108 pHdr->fFlags = fFlags; 109 pHdr->cb = (uint32_t)cbAligned; 110 pHdr->cbReq = (uint32_t)cb; 111 112 *ppv = pHdr + 1; 113 return VINF_SUCCESS; 42 return VERR_NOT_SUPPORTED; 114 43 } 115 RT_EXPORT_SYMBOL(RTMemAllocExTag);116 44 117 45 118 RTDECL(void) RTMemFreeEx(void *pv, size_t cb) RT_NO_THROW 46 DECLHIDDEN(int) rtMemAllocEx32BitReach(size_t cbAlloc, uint32_t fFlags, void **ppv) 119 47 { 120 if (!pv) 121 return; 122 AssertPtr(pv); 48 return VERR_NOT_SUPPORTED; 49 } 123 50 124 PRTMEMHDRR3 pHdr = (PRTMEMHDRR3)pv - 1;125 AssertMsg(pHdr->u32Magic == RTMEMHDR_MAGIC, ("pHdr->u32Magic=%RX32 pv=%p cb=%#x\n", pHdr->u32Magic, pv, cb));126 pHdr->u32Magic = RTMEMHDR_MAGIC_DEAD;127 Assert(pHdr->cbReq == cb);128 51 129 if (pHdr->fFlags & RTMEMALLOCEX_FLAGS_EXEC) 130 RTMemExecFree(pHdr, pHdr->cb + sizeof(*pHdr)); 131 else 132 RTMemFree(pHdr); 52 DECLHIDDEN(void) rtMemFreeExYyBitReach(void *pv, size_t cb, uint32_t fFlags) 53 { 54 AssertFailed(); 133 55 } 134 RT_EXPORT_SYMBOL(RTMemFreeEx);135 56
Note:
See TracChangeset
for help on using the changeset viewer.