Changeset 25059 in vbox for trunk/src/VBox/Runtime/testcase
- Timestamp:
- Nov 27, 2009 6:17:44 PM (15 years ago)
- Location:
- trunk/src/VBox/Runtime/testcase
- Files:
-
- 2 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/testcase/Makefile.kmk
r25057 r25059 68 68 tstGetOpt \ 69 69 tstHandleTable \ 70 tstRTHeapOffset \ 70 71 tstRTHeapSimple \ 71 72 tstInlineAsm \ … … 201 202 tstHandleTable_SOURCES = tstHandleTable.cpp 202 203 204 tstRTHeapOffset_TEMPLATE = VBOXR3TSTEXE 205 tstRTHeapOffset_SOURCES = tstRTHeapOffset.cpp 206 203 207 tstRTHeapSimple_TEMPLATE = VBOXR3TSTEXE 204 208 tstRTHeapSimple_SOURCES = tstRTHeapSimple.cpp -
trunk/src/VBox/Runtime/testcase/tstRTHeapOffset.cpp
r25057 r25059 1 1 /* $Id$ */ 2 2 /** @file 3 * IPRT Testcase - SimpleHeap.3 * IPRT Testcase - Offset Based Heap. 4 4 */ 5 5 6 6 /* 7 * Copyright (C) 2006-200 7Sun Microsystems, Inc.7 * Copyright (C) 2006-2009 Sun Microsystems, Inc. 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 49 49 */ 50 50 RTTEST hTest; 51 int rc = RTTestInitAndCreate("tstRTHeap Simple", &hTest);51 int rc = RTTestInitAndCreate("tstRTHeapOffset", &hTest); 52 52 if (rc) 53 53 return rc; … … 59 59 RTTestSub(hTest, "Basics"); 60 60 static uint8_t s_abMem[128*1024]; 61 RTHEAP SIMPLEHeap;62 RTTESTI_CHECK_RC(rc = RTHeap SimpleInit(&Heap, &s_abMem[1], sizeof(s_abMem) - 1), VINF_SUCCESS);63 if (RT_FAILURE(rc)) 61 RTHEAPOFFSET Heap; 62 RTTESTI_CHECK_RC(rc = RTHeapOffsetInit(&Heap, &s_abMem[1], sizeof(s_abMem) - 1), VINF_SUCCESS); 63 if (RT_FAILURE(rc)) 64 64 return RTTestSummaryAndDestroy(hTest); 65 65 … … 67 67 * Try allocate. 68 68 */ 69 static struct TstHeap SimpleOps69 static struct TstHeapOffsetOps 70 70 { 71 71 size_t cb; … … 98 98 { 16, 0, NULL, 7 }, 99 99 }; 100 unsigned i; 101 RTHeap SimpleDump(Heap, (PFNRTHEAPSIMPLEPRINTF)RTPrintf); /** @todo Add some detail info output with a signature identical to RTPrintf. */102 size_t cbBefore = RTHeap SimpleGetFreeSize(Heap);100 unsigned i; 101 RTHeapOffsetDump(Heap, (PFNRTHEAPOFFSETPRINTF)RTPrintf); /** @todo Add some detail info output with a signature identical to RTPrintf. */ 102 size_t cbBefore = RTHeapOffsetGetFreeSize(Heap); 103 103 static char szFill[] = "01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 104 104 … … 106 106 for (i = 0; i < RT_ELEMENTS(s_aOps); i++) 107 107 { 108 s_aOps[i].pvAlloc = RTHeap SimpleAlloc(Heap, s_aOps[i].cb, s_aOps[i].uAlignment);109 RTTESTI_CHECK_MSG(s_aOps[i].pvAlloc, ("RTHeap SimpleAlloc(%p, %#x, %#x,) -> NULL i=%d\n", (void *)Heap, s_aOps[i].cb, s_aOps[i].uAlignment, i));108 s_aOps[i].pvAlloc = RTHeapOffsetAlloc(Heap, s_aOps[i].cb, s_aOps[i].uAlignment); 109 RTTESTI_CHECK_MSG(s_aOps[i].pvAlloc, ("RTHeapOffsetAlloc(%p, %#x, %#x,) -> NULL i=%d\n", (void *)Heap, s_aOps[i].cb, s_aOps[i].uAlignment, i)); 110 110 if (!s_aOps[i].pvAlloc) 111 111 return RTTestSummaryAndDestroy(hTest); … … 113 113 memset(s_aOps[i].pvAlloc, szFill[i], s_aOps[i].cb); 114 114 RTTESTI_CHECK_MSG(RT_ALIGN_P(s_aOps[i].pvAlloc, (s_aOps[i].uAlignment ? s_aOps[i].uAlignment : 8)) == s_aOps[i].pvAlloc, 115 ("RTHeap SimpleAlloc(%p, %#x, %#x,) -> %p\n", (void *)Heap, s_aOps[i].cb, s_aOps[i].uAlignment, i));115 ("RTHeapOffsetAlloc(%p, %#x, %#x,) -> %p\n", (void *)Heap, s_aOps[i].cb, s_aOps[i].uAlignment, i)); 116 116 if (!s_aOps[i].pvAlloc) 117 117 return RTTestSummaryAndDestroy(hTest); … … 124 124 continue; 125 125 //RTPrintf("debug: i=%d pv=%#x cb=%#zx align=%#zx cbReal=%#zx\n", i, s_aOps[i].pvAlloc, 126 // s_aOps[i].cb, s_aOps[i].uAlignment, RTHeap SimpleSize(Heap, s_aOps[i].pvAlloc));127 size_t cbBeforeSub = RTHeap SimpleGetFreeSize(Heap);128 RTHeap SimpleFree(Heap, s_aOps[i].pvAlloc);129 size_t cbAfterSubFree = RTHeap SimpleGetFreeSize(Heap);126 // s_aOps[i].cb, s_aOps[i].uAlignment, RTHeapOffsetSize(Heap, s_aOps[i].pvAlloc)); 127 size_t cbBeforeSub = RTHeapOffsetGetFreeSize(Heap); 128 RTHeapOffsetFree(Heap, s_aOps[i].pvAlloc); 129 size_t cbAfterSubFree = RTHeapOffsetGetFreeSize(Heap); 130 130 131 131 void *pv; 132 pv = RTHeap SimpleAlloc(Heap, s_aOps[i].cb, s_aOps[i].uAlignment);133 RTTESTI_CHECK_MSG(pv, ("RTHeap SimpleAlloc(%p, %#x, %#x,) -> NULL i=%d\n", (void *)Heap, s_aOps[i].cb, s_aOps[i].uAlignment, i));132 pv = RTHeapOffsetAlloc(Heap, s_aOps[i].cb, s_aOps[i].uAlignment); 133 RTTESTI_CHECK_MSG(pv, ("RTHeapOffsetAlloc(%p, %#x, %#x,) -> NULL i=%d\n", (void *)Heap, s_aOps[i].cb, s_aOps[i].uAlignment, i)); 134 134 if (!pv) 135 135 return RTTestSummaryAndDestroy(hTest); 136 //RTPrintf("debug: i=%d pv=%p cbReal=%#zx cbBeforeSub=%#zx cbAfterSubFree=%#zx cbAfterSubAlloc=%#zx \n", i, pv, RTHeapSimpleSize(Heap, pv), 137 // cbBeforeSub, cbAfterSubFree, RTHeapSimpleGetFreeSize(Heap)); 136 //RTPrintf("debug: i=%d pv=%p cbReal=%#zx cbBeforeSub=%#zx cbAfterSubFree=%#zx cbAfterSubAlloc=%#zx \n", i, pv, RTHeapOffsetSize(Heap, pv), 137 // cbBeforeSub, cbAfterSubFree, RTHeapOffsetGetFreeSize(Heap)); 138 138 139 if (pv != s_aOps[i].pvAlloc) 139 140 RTTestIPrintf(RTTESTLVL_ALWAYS, "Warning: Free+Alloc returned different address. new=%p old=%p i=%d\n", pv, s_aOps[i].pvAlloc, i); 140 141 s_aOps[i].pvAlloc = pv; 141 size_t cbAfterSubAlloc = RTHeap SimpleGetFreeSize(Heap);142 size_t cbAfterSubAlloc = RTHeapOffsetGetFreeSize(Heap); 142 143 if (cbBeforeSub != cbAfterSubAlloc) 143 144 { … … 147 148 } 148 149 } 149 150 150 151 /* make a copy of the heap and the to-be-freed list. */ 151 152 static uint8_t s_abMemCopy[sizeof(s_abMem)]; 152 153 memcpy(s_abMemCopy, s_abMem, sizeof(s_abMem)); 153 154 uintptr_t offDelta = (uintptr_t)&s_abMemCopy[0] - (uintptr_t)&s_abMem[0]; 154 RTHEAP SIMPLE hHeapCopy = (RTHEAPSIMPLE)((uintptr_t)Heap + offDelta);155 static struct TstHeap SimpleOps s_aOpsCopy[RT_ELEMENTS(s_aOps)];155 RTHEAPOFFSET hHeapCopy = (RTHEAPOFFSET)((uintptr_t)Heap + offDelta); 156 static struct TstHeapOffsetOps s_aOpsCopy[RT_ELEMENTS(s_aOps)]; 156 157 memcpy(&s_aOpsCopy[0], &s_aOps[0], sizeof(s_aOps)); 157 158 … … 166 167 || !s_aOps[j].pvAlloc) 167 168 continue; 168 //RTPrintf("j=%d i=%d free=%d cb=%d pv=%p\n", j, i, RTHeap SimpleGetFreeSize(Heap), s_aOps[j].cb, s_aOps[j].pvAlloc);169 RTHeap SimpleFree(Heap, s_aOps[j].pvAlloc);169 //RTPrintf("j=%d i=%d free=%d cb=%d pv=%p\n", j, i, RTHeapOffsetGetFreeSize(Heap), s_aOps[j].cb, s_aOps[j].pvAlloc); 170 RTHeapOffsetFree(Heap, s_aOps[j].pvAlloc); 170 171 s_aOps[j].pvAlloc = NULL; 171 172 cFreed++; … … 173 174 } 174 175 RTTESTI_CHECK(cFreed == RT_ELEMENTS(s_aOps)); 175 RTTestIPrintf(RTTESTLVL_ALWAYS, "i=done free=%d\n", RTHeap SimpleGetFreeSize(Heap));176 RTTestIPrintf(RTTESTLVL_ALWAYS, "i=done free=%d\n", RTHeapOffsetGetFreeSize(Heap)); 176 177 177 178 /* check that we're back at the right amount of free memory. */ 178 size_t cbAfter = RTHeap SimpleGetFreeSize(Heap);179 size_t cbAfter = RTHeapOffsetGetFreeSize(Heap); 179 180 if (cbBefore != cbAfter) 180 181 { 181 RTTestIPrintf(RTTESTLVL_ALWAYS, 182 RTTestIPrintf(RTTESTLVL_ALWAYS, 182 183 "Warning: Either we've split out an alignment chunk at the start, or we've got\n" 183 184 " an alloc/free accounting bug: cbBefore=%d cbAfter=%d\n", cbBefore, cbAfter); 184 RTHeap SimpleDump(Heap, (PFNRTHEAPSIMPLEPRINTF)RTPrintf);185 RTHeapOffsetDump(Heap, (PFNRTHEAPOFFSETPRINTF)RTPrintf); 185 186 } 186 187 187 188 /* relocate and free the bits in heap2 now. */ 188 RTTestSub(hTest, "RTHeapSimpleRelocate"); 189 rc = RTHeapSimpleRelocate(hHeapCopy, offDelta); 190 RTTESTI_CHECK_RC(rc, VINF_SUCCESS); 191 if (RT_FAILURE(rc)) 192 { 193 /* free it in a specific order. */ 194 int cFreed2 = 0; 195 for (i = 0; i < RT_ELEMENTS(s_aOpsCopy); i++) 189 RTTestSub(hTest, "Relocated Heap"); 190 /* free it in a specific order. */ 191 int cFreed2 = 0; 192 for (i = 0; i < RT_ELEMENTS(s_aOpsCopy); i++) 193 { 194 unsigned j; 195 for (j = 0; j < RT_ELEMENTS(s_aOpsCopy); j++) 196 196 { 197 unsigned j; 198 for (j = 0; j < RT_ELEMENTS(s_aOpsCopy); j++) 199 { 200 if ( s_aOpsCopy[j].iFreeOrder != i 201 || !s_aOpsCopy[j].pvAlloc) 202 continue; 203 //RTPrintf("j=%d i=%d free=%d cb=%d pv=%p\n", j, i, RTHeapSimpleGetFreeSize(hHeapCopy), s_aOpsCopy[j].cb, s_aOpsCopy[j].pvAlloc); 204 RTHeapSimpleFree(hHeapCopy, (uint8_t *)s_aOpsCopy[j].pvAlloc + offDelta); 205 s_aOpsCopy[j].pvAlloc = NULL; 206 cFreed++; 207 } 197 if ( s_aOpsCopy[j].iFreeOrder != i 198 || !s_aOpsCopy[j].pvAlloc) 199 continue; 200 //RTPrintf("j=%d i=%d free=%d cb=%d pv=%p\n", j, i, RTHeapOffsetGetFreeSize(hHeapCopy), s_aOpsCopy[j].cb, s_aOpsCopy[j].pvAlloc); 201 RTHeapOffsetFree(hHeapCopy, (uint8_t *)s_aOpsCopy[j].pvAlloc + offDelta); 202 s_aOpsCopy[j].pvAlloc = NULL; 203 cFreed2++; 208 204 } 209 RTTESTI_CHECK(cFreed == RT_ELEMENTS(s_aOpsCopy));210 211 /* check that we're back at the right amount of free memory. */ 212 size_t cbAfterCopy = RTHeapSimpleGetFreeSize(hHeapCopy);213 RTTESTI_CHECK_MSG(cbAfterCopy == cbAfter, ("cbAfterCopy=%zu cbAfter=%zu\n", cbAfterCopy, cbAfter));214 }205 } 206 RTTESTI_CHECK(cFreed2 == RT_ELEMENTS(s_aOpsCopy)); 207 208 /* check that we're back at the right amount of free memory. */ 209 size_t cbAfterCopy = RTHeapOffsetGetFreeSize(hHeapCopy); 210 RTTESTI_CHECK_MSG(cbAfterCopy == cbAfter, ("cbAfterCopy=%zu cbAfter=%zu\n", cbAfterCopy, cbAfter)); 215 211 216 212 -
trunk/src/VBox/Runtime/testcase/tstRTHeapSimple.cpp
r25057 r25059 61 61 RTHEAPSIMPLE Heap; 62 62 RTTESTI_CHECK_RC(rc = RTHeapSimpleInit(&Heap, &s_abMem[1], sizeof(s_abMem) - 1), VINF_SUCCESS); 63 if (RT_FAILURE(rc)) 63 if (RT_FAILURE(rc)) 64 64 return RTTestSummaryAndDestroy(hTest); 65 65 … … 98 98 { 16, 0, NULL, 7 }, 99 99 }; 100 unsigned i; 100 unsigned i; 101 101 RTHeapSimpleDump(Heap, (PFNRTHEAPSIMPLEPRINTF)RTPrintf); /** @todo Add some detail info output with a signature identical to RTPrintf. */ 102 102 size_t cbBefore = RTHeapSimpleGetFreeSize(Heap); … … 147 147 } 148 148 } 149 149 150 150 /* make a copy of the heap and the to-be-freed list. */ 151 151 static uint8_t s_abMemCopy[sizeof(s_abMem)]; … … 179 179 if (cbBefore != cbAfter) 180 180 { 181 RTTestIPrintf(RTTESTLVL_ALWAYS, 181 RTTestIPrintf(RTTESTLVL_ALWAYS, 182 182 "Warning: Either we've split out an alignment chunk at the start, or we've got\n" 183 183 " an alloc/free accounting bug: cbBefore=%d cbAfter=%d\n", cbBefore, cbAfter); … … 189 189 rc = RTHeapSimpleRelocate(hHeapCopy, offDelta); 190 190 RTTESTI_CHECK_RC(rc, VINF_SUCCESS); 191 if (RT_ FAILURE(rc))191 if (RT_SUCCESS(rc)) 192 192 { 193 193 /* free it in a specific order. */ … … 204 204 RTHeapSimpleFree(hHeapCopy, (uint8_t *)s_aOpsCopy[j].pvAlloc + offDelta); 205 205 s_aOpsCopy[j].pvAlloc = NULL; 206 cFreed ++;206 cFreed2++; 207 207 } 208 208 } 209 RTTESTI_CHECK(cFreed == RT_ELEMENTS(s_aOpsCopy));210 209 RTTESTI_CHECK(cFreed2 == RT_ELEMENTS(s_aOpsCopy)); 210 211 211 /* check that we're back at the right amount of free memory. */ 212 212 size_t cbAfterCopy = RTHeapSimpleGetFreeSize(hHeapCopy);
Note:
See TracChangeset
for help on using the changeset viewer.