diff options
Diffstat (limited to 'src/VBox/Runtime/r0drv/alloc-r0drv.cpp')
-rw-r--r-- | src/VBox/Runtime/r0drv/alloc-r0drv.cpp | 97 |
1 files changed, 59 insertions, 38 deletions
diff --git a/src/VBox/Runtime/r0drv/alloc-r0drv.cpp b/src/VBox/Runtime/r0drv/alloc-r0drv.cpp index 17b9e8bcf..fe626d1fa 100644 --- a/src/VBox/Runtime/r0drv/alloc-r0drv.cpp +++ b/src/VBox/Runtime/r0drv/alloc-r0drv.cpp @@ -1,4 +1,4 @@ -/* $Id: alloc-r0drv.cpp $ */ +/* $Id: alloc-r0drv.cpp 37672 2011-06-28 19:48:17Z vboxsync $ */ /** @file * IPRT - Memory Allocation, Ring-0 Driver. */ @@ -179,43 +179,64 @@ RT_EXPORT_SYMBOL(RTMemAllocZVarTag); RTDECL(void *) RTMemReallocTag(void *pvOld, size_t cbNew, const char *pszTag) RT_NO_THROW { - if (!cbNew) + PRTMEMHDR pHdrOld; + + /* Free. */ + if (!cbNew && pvOld) + { RTMemFree(pvOld); - else if (!pvOld) + return NULL; + } + + /* Alloc. */ + if (!pvOld) return RTMemAllocTag(cbNew, pszTag); - else + + /* + * Realloc. + */ + pHdrOld = (PRTMEMHDR)pvOld - 1; + RT_ASSERT_PREEMPTIBLE(); + + if (pHdrOld->u32Magic == RTMEMHDR_MAGIC) { - PRTMEMHDR pHdrOld = (PRTMEMHDR)pvOld - 1; - RT_ASSERT_PREEMPTIBLE(); + PRTMEMHDR pHdrNew; + + /* If there is sufficient space in the old block and we don't cause + substantial internal fragmentation, reuse the old block. */ + if ( pHdrOld->cb >= cbNew + RTR0MEM_FENCE_EXTRA + && pHdrOld->cb - (cbNew + RTR0MEM_FENCE_EXTRA) <= 128) + { + pHdrOld->cbReq = (uint32_t)cbNew; Assert(pHdrOld->cbReq == cbNew); +#ifdef RTR0MEM_STRICT + memcpy((uint8_t *)(pHdrOld + 1) + cbNew, &g_abFence[0], RTR0MEM_FENCE_EXTRA); +#endif + return pvOld; + } - if (pHdrOld->u32Magic == RTMEMHDR_MAGIC) + /* Allocate a new block and copy over the content. */ + pHdrNew = rtR0MemAlloc(cbNew + RTR0MEM_FENCE_EXTRA, 0); + if (pHdrNew) { - PRTMEMHDR pHdrNew; - if (pHdrOld->cb >= cbNew && pHdrOld->cb - cbNew <= 128) - return pvOld; - pHdrNew = rtR0MemAlloc(cbNew + RTR0MEM_FENCE_EXTRA, 0); - if (pHdrNew) - { - size_t cbCopy = RT_MIN(pHdrOld->cb, pHdrNew->cb); - memcpy(pHdrNew + 1, pvOld, cbCopy); + size_t cbCopy = RT_MIN(pHdrOld->cb, pHdrNew->cb); + memcpy(pHdrNew + 1, pvOld, cbCopy); #ifdef RTR0MEM_STRICT - pHdrNew->cbReq = (uint32_t)cbNew; Assert(pHdrNew->cbReq == cbNew); - memcpy((uint8_t *)(pHdrNew + 1) + cbNew, &g_abFence[0], RTR0MEM_FENCE_EXTRA); - AssertReleaseMsg(!memcmp((uint8_t *)(pHdrOld + 1) + pHdrOld->cbReq, &g_abFence[0], RTR0MEM_FENCE_EXTRA), - ("pHdr=%p pvOld=%p cb=%zu cbNew=%zu\n" - "fence: %.*Rhxs\n" - "expected: %.*Rhxs\n", - pHdrOld, pvOld, pHdrOld->cb, cbNew, - RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdrOld + 1) + pHdrOld->cb, - RTR0MEM_FENCE_EXTRA, &g_abFence[0])); + pHdrNew->cbReq = (uint32_t)cbNew; Assert(pHdrNew->cbReq == cbNew); + memcpy((uint8_t *)(pHdrNew + 1) + cbNew, &g_abFence[0], RTR0MEM_FENCE_EXTRA); + AssertReleaseMsg(!memcmp((uint8_t *)(pHdrOld + 1) + pHdrOld->cbReq, &g_abFence[0], RTR0MEM_FENCE_EXTRA), + ("pHdr=%p pvOld=%p cbReq=%u cb=%u cbNew=%zu fFlags=%#x\n" + "fence: %.*Rhxs\n" + "expected: %.*Rhxs\n", + pHdrOld, pvOld, pHdrOld->cbReq, pHdrOld->cb, cbNew, pHdrOld->fFlags, + RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdrOld + 1) + pHdrOld->cbReq, + RTR0MEM_FENCE_EXTRA, &g_abFence[0])); #endif - rtR0MemFree(pHdrOld); - return pHdrNew + 1; - } + rtR0MemFree(pHdrOld); + return pHdrNew + 1; } - else - AssertMsgFailed(("pHdrOld->u32Magic=%RX32 pvOld=%p cbNew=%#zx\n", pHdrOld->u32Magic, pvOld, cbNew)); } + else + AssertMsgFailed(("pHdrOld->u32Magic=%RX32 pvOld=%p cbNew=%#zx\n", pHdrOld->u32Magic, pvOld, cbNew)); return NULL; } @@ -236,11 +257,11 @@ RTDECL(void) RTMemFree(void *pv) RT_NO_THROW Assert(!(pHdr->fFlags & RTMEMHDR_FLAG_EXEC)); #ifdef RTR0MEM_STRICT AssertReleaseMsg(!memcmp((uint8_t *)(pHdr + 1) + pHdr->cbReq, &g_abFence[0], RTR0MEM_FENCE_EXTRA), - ("pHdr=%p pv=%p cb=%zu\n" + ("pHdr=%p pv=%p cbReq=%u cb=%u fFlags=%#x\n" "fence: %.*Rhxs\n" "expected: %.*Rhxs\n", - pHdr, pv, pHdr->cb, - RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cb, + pHdr, pv, pHdr->cbReq, pHdr->cb, pHdr->fFlags, + RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cbReq, RTR0MEM_FENCE_EXTRA, &g_abFence[0])); #endif rtR0MemFree(pHdr); @@ -291,11 +312,11 @@ RTDECL(void) RTMemExecFree(void *pv, size_t cb) RT_NO_THROW Assert(!(pHdr->fFlags & RTMEMHDR_FLAG_ALLOC_EX)); #ifdef RTR0MEM_STRICT AssertReleaseMsg(!memcmp((uint8_t *)(pHdr + 1) + pHdr->cbReq, &g_abFence[0], RTR0MEM_FENCE_EXTRA), - ("pHdr=%p pv=%p cb=%zu\n" + ("pHdr=%p pv=%p cbReq=%u cb=%u fFlags=%#x\n" "fence: %.*Rhxs\n" "expected: %.*Rhxs\n", - pHdr, pv, pHdr->cb, - RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cb, + pHdr, pv, pHdr->cbReq, pHdr->cb, pHdr->fFlags, + RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cbReq, RTR0MEM_FENCE_EXTRA, &g_abFence[0])); #endif rtR0MemFree(pHdr); @@ -392,11 +413,11 @@ RTDECL(void) RTMemFreeEx(void *pv, size_t cb) RT_NO_THROW #ifdef RTR0MEM_STRICT AssertReleaseMsg(!memcmp((uint8_t *)(pHdr + 1) + pHdr->cbReq, &g_abFence[0], RTR0MEM_FENCE_EXTRA), - ("pHdr=%p pv=%p cb=%zu\n" + ("pHdr=%p pv=%p cbReq=%u cb=%u fFlags=%#x\n" "fence: %.*Rhxs\n" "expected: %.*Rhxs\n", - pHdr, pv, pHdr->cb, - RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cb, + pHdr, pv, pHdr->cbReq, pHdr->cb, pHdr->fFlags, + RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cbReq, RTR0MEM_FENCE_EXTRA, &g_abFence[0])); #endif rtR0MemFree(pHdr); |