VirtualBox

Changeset 18367 in vbox for trunk/src


Ignore:
Timestamp:
Mar 27, 2009 3:19:09 AM (16 years ago)
Author:
vboxsync
Message:

tstBitOperations: Another testcase (left over from debugging a silly problem).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/testcase/tstBitOperations.cpp

    r18365 r18367  
    4141
    4242
     43/*
     44 * Test 2 - ID allocation using a bitmap.
     45 */
     46
     47#define NIL_TEST2_ID    0
     48#define TEST2_ID_LAST   (RT_BIT_32(28) - 1 >> 8)
     49
     50struct TestMap2
     51{
     52    uint32_t    idNil;
     53    uint32_t    idLast;
     54    uint32_t    idChunkPrev;
     55    uint32_t    bmChunkId[(TEST2_ID_LAST + 1 + 31) / 32];
     56};
     57
     58static uint32_t test2AllocId(struct TestMap2 *p2)
     59{
     60    /*
     61     * Scan sequentially from the last one + 1.
     62     */
     63    int32_t idChunk = ++p2->idChunkPrev;
     64    if (    (uint32_t)idChunk < TEST2_ID_LAST
     65        &&  idChunk > NIL_TEST2_ID)
     66    {
     67        idChunk = ASMBitNextClear(&p2->bmChunkId[0], TEST2_ID_LAST + 1, idChunk);
     68        if (idChunk > NIL_TEST2_ID)
     69        {
     70            if (ASMAtomicBitTestAndSet(&p2->bmChunkId[0], idChunk))
     71            {
     72                RTTestFailed(NIL_RTTEST, "line %d: idChunk=%#x", __LINE__, idChunk);
     73                return NIL_TEST2_ID;
     74            }
     75            return p2->idChunkPrev = idChunk;
     76        }
     77    }
     78
     79    /*
     80     * Ok, scan from the start.
     81     */
     82    idChunk = ASMBitFirstClear(&p2->bmChunkId[0], TEST2_ID_LAST + 1);
     83    if (idChunk <= NIL_TEST2_ID)
     84    {
     85        RTTestFailed(NIL_RTTEST, "line %d: idChunk=%#x", __LINE__, idChunk);
     86        return NIL_TEST2_ID;
     87    }
     88    if (ASMAtomicBitTestAndSet(&p2->bmChunkId[0], idChunk))
     89    {
     90        RTTestFailed(NIL_RTTEST, "line %d: idChunk=%#x", __LINE__, idChunk);
     91        return NIL_TEST2_ID;
     92    }
     93
     94    return p2->idChunkPrev = idChunk;
     95}
     96
     97
     98static void test2(RTTEST hTest)
     99{
     100    struct TestMap2 *p2 = (struct TestMap2 *)RTTestGuardedAllocTail(hTest, sizeof(TestMap2));
     101    p2->idNil  = NIL_TEST2_ID;
     102    p2->idLast = TEST2_ID_LAST;
     103
     104    /* Some simple tests first. */
     105    memset(&p2->bmChunkId[0],    0, sizeof(p2->bmChunkId));
     106    RTTEST_CHECK(hTest, ASMBitFirstSet(&p2->bmChunkId[0], TEST2_ID_LAST + 1) == -1);
     107    for (uint32_t iBit = 0; iBit <= TEST2_ID_LAST; iBit++)
     108        RTTEST_CHECK(hTest, !ASMBitTest(&p2->bmChunkId[0], iBit));
     109
     110    memset(&p2->bmChunkId[0], 0xff, sizeof(p2->bmChunkId));
     111    RTTEST_CHECK(hTest, ASMBitFirstClear(&p2->bmChunkId[0], TEST2_ID_LAST + 1) == -1);
     112    for (uint32_t iBit = 0; iBit <= TEST2_ID_LAST; iBit++)
     113        RTTEST_CHECK(hTest, ASMBitTest(&p2->bmChunkId[0], iBit));
     114
     115    /* The real test. */
     116    p2->idChunkPrev = 0;
     117    memset(&p2->bmChunkId[0],    0, sizeof(p2->bmChunkId));
     118    ASMBitSet(p2->bmChunkId, NIL_TEST2_ID);
     119    uint32_t cLeft = TEST2_ID_LAST;
     120    while (cLeft-- > 0)
     121        test2AllocId(p2);
     122
     123    RTTEST_CHECK(hTest, ASMBitFirstClear(&p2->bmChunkId[0], TEST2_ID_LAST + 1) == -1);
     124}
     125
     126
    43127int main()
    44128{
     
    318402
    319403    /*
     404     * Special tests.
     405     */
     406    test2(hTest);
     407
     408    /*
    320409     * Summary
    321410     */
    322411    return RTTestSummaryAndDestroy(hTest);
    323412}
     413
Note: See TracChangeset for help on using the changeset viewer.

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