VirtualBox

Changeset 93691 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 11, 2022 10:10:12 AM (3 years ago)
Author:
vboxsync
Message:

IPRT/tstRTAvl: Fixed broke TrackerFindRandom code causing random test failures. Added some counting and heigh checks.

File:
1 edited

Legend:

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

    r93684 r93691  
    3737#include <iprt/rand.h>
    3838#include <iprt/stdarg.h>
     39#include <iprt/stream.h>
    3940#include <iprt/string.h>
    4041#include <iprt/test.h>
     
    7576static PTRACKER TrackerCreate(uint32_t MaxKey)
    7677{
    77     uint32_t cbBitmap = (MaxKey + sizeof(uint32_t) * sizeof(uint8_t) - 1) / sizeof(uint8_t);
     78    uint32_t cbBitmap = RT_ALIGN_32(MaxKey, 64) / 8;
    7879    PTRACKER pTracker = (PTRACKER)RTMemAllocZ(RT_UOFFSETOF_DYN(TRACKER, abBitmap[cbBitmap]));
    7980    if (pTracker)
     
    254255        {
    255256            /* we're missing a ASMBitPrevSet function, so here's a quick replacement hack. */
    256             uint32_t *pu32Start = (uint32_t *)&pTracker->abBitmap[0];
    257             uint32_t *pu32Cur   = (uint32_t *)&pTracker->abBitmap[Key >> 8];
    258             while (pu32Cur >= pu32Start)
    259             {
    260                 if (*pu32Cur)
     257            uint32_t const *pu32Bitmap = (uint32_t const *)&pTracker->abBitmap[0];
     258            Key >>= 5;
     259            do
     260            {
     261                uint32_t u32;
     262                if ((u32 = pu32Bitmap[Key]) != 0)
    261263                {
    262                     *pKey = ASMBitLastSetU32(*pu32Cur) - 1 + (uint32_t)((pu32Cur - pu32Start) * 32);
     264                    *pKey = ASMBitLastSetU32(u32) - 1 + (Key << 5);
    263265                    return true;
    264266                }
    265                 pu32Cur--;
    266             }
     267            } while (Key-- > 0);
     268
    267269            Key2 = ASMBitFirstSet(pTracker->abBitmap, pTracker->MaxKey);
    268270            if (Key2 == -1)
     
    277279    *pKey = Key;
    278280    return true;
     281}
     282
     283
     284/**
     285 * Gets the number of keys in the tree.
     286 */
     287static uint32_t TrackerGetCount(PTRACKER pTracker)
     288{
     289    return pTracker->cSetBits;
    279290}
    280291
     
    538549
    539550
    540 int avlogcphysRand(unsigned cMax, unsigned cMax2)
     551static DECLCALLBACK(int) avlogcphysCallbackCounter(PAVLOGCPHYSNODECORE pNode, void *pvUser)
     552{
     553    RT_NOREF(pNode);
     554    *(uint32_t *)pvUser += 1;
     555    return 0;
     556}
     557
     558int avlogcphysRand(unsigned cMax, unsigned cMax2, uint32_t fCountMask)
    541559{
    542560    PAVLOGCPHYSTREE pTree = (PAVLOGCPHYSTREE)RTMemAllocZ(sizeof(*pTree));
     
    581599        }
    582600        TrackerInsert(pTracker, Key, Key);
     601
     602        if (!(i & fCountMask))
     603        {
     604            uint32_t cCount = 0;
     605            RTAvloGCPhysDoWithAll(pTree, i & 1, avlogcphysCallbackCounter, &cCount);
     606            if (cCount != TrackerGetCount(pTracker))
     607                RTTestIFailed("wrong tree count after random insert i=%d: %u, expected %u", i, cCount, TrackerGetCount(pTracker));
     608        }
     609    }
     610
     611    {
     612        uint32_t cCount = 0;
     613        RTAvloGCPhysDoWithAll(pTree, i & 1, avlogcphysCallbackCounter, &cCount);
     614        if (cCount != TrackerGetCount(pTracker))
     615            RTTestIFailed("wrong tree count after random insert i=%d: %u, expected %u", i, cCount, TrackerGetCount(pTracker));
    583616    }
    584617
     
    611644        memset(pNode, 0xdd, sizeof(*pNode));
    612645        RTMemFree(pNode);
     646
     647        if (!(i & fCountMask))
     648        {
     649            uint32_t cCount = 0;
     650            RTAvloGCPhysDoWithAll(pTree, i & 1, avlogcphysCallbackCounter, &cCount);
     651            if (cCount != TrackerGetCount(pTracker))
     652                RTTestIFailed("wrong tree count after random remove i=%d: %u, expected %u", i, cCount, TrackerGetCount(pTracker));
     653        }
     654    }
     655    {
     656        uint32_t cCount = 0;
     657        RTAvloGCPhysDoWithAll(pTree, i & 1, avlogcphysCallbackCounter, &cCount);
     658        if (cCount != TrackerGetCount(pTracker))
     659            RTTestIFailed("wrong tree count after random insert i=%d: %u, expected %u", i, cCount, TrackerGetCount(pTracker));
    613660    }
    614661    if (*pTree)
     
    937984     */
    938985    PAVLULNODECORE  pTree = 0;
    939     unsigned i;
     986    unsigned        cInserted = 0;
     987    unsigned        i;
     988
    940989    /* insert */
    941     for (i = 0; i < 65536; i++)
     990    for (i = 0; i < 65536; i++, cInserted++)
    942991    {
    943992        PAVLULNODECORE pNode = (PAVLULNODECORE)RTMemAlloc(sizeof(*pNode));
     
    948997            return 1;
    949998        }
     999
    9501000        /* negative. */
    9511001        AVLULNODECORE Node = *pNode;
     
    9551005            return 1;
    9561006        }
    957     }
    958 
    959     for (i = 0; i < 65536; i++)
     1007
     1008        /* check height */
     1009        uint8_t  const cHeight = pTree ? pTree->uchHeight : 0;
     1010        uint32_t const cMax    = cHeight > 0 ? RT_BIT_32(cHeight) : 1;
     1011        if (cInserted > cMax || cInserted < (cMax >> 2))
     1012            RTTestIFailed("bad tree height after linear insert i=%d: cMax=%#x, cInserted=%#x\n", i, cMax, cInserted);
     1013    }
     1014
     1015    for (i = 0; i < 65536; i++, cInserted--)
    9601016    {
    9611017        PAVLULNODECORE pNode = RTAvlULRemove(&pTree, i);
     
    9771033            return 1;
    9781034        }
     1035
     1036        /* check height */
     1037        uint8_t  const cHeight = pTree ? pTree->uchHeight : 0;
     1038        uint32_t const cMax    = cHeight > 0 ? RT_BIT_32(cHeight) : 1;
     1039        if (cInserted > cMax || cInserted < (cMax >> 2))
     1040            RTTestIFailed("bad tree height after linear removal i=%d: cMax=%#x, cInserted=%#x\n", i, cMax, cInserted);
    9791041    }
    9801042
     
    9821044     * Make a sparsely populated tree.
    9831045     */
    984     for (i = 0; i < 65536; i += 8)
     1046    for (i = 0; i < 65536; i += 8, cInserted++)
    9851047    {
    9861048        PAVLULNODECORE pNode = (PAVLULNODECORE)RTMemAlloc(sizeof(*pNode));
     
    9911053            return 1;
    9921054        }
     1055
    9931056        /* negative. */
    9941057        AVLULNODECORE Node = *pNode;
     
    9981061            return 1;
    9991062        }
     1063
     1064        /* check height */
     1065        uint8_t  const cHeight = pTree ? pTree->uchHeight : 0;
     1066        uint32_t const cMax    = cHeight > 0 ? RT_BIT_32(cHeight) : 1;
     1067        if (cInserted > cMax || cInserted < (cMax >> 2))
     1068            RTTestIFailed("bad tree height after sparse insert i=%d: cMax=%#x, cInserted=%#x\n", i, cMax, cInserted);
    10001069    }
    10011070
     
    10061075    for (j = 0; j < 4; j++)
    10071076    {
    1008         for (i = 0; i < 65536; i += 8 * 4)
     1077        for (i = 0; i < 65536; i += 8 * 4, cInserted--)
    10091078        {
    10101079            PAVLULNODECORE pNode = RTAvlULRemoveBestFit(&pTree, i, true);
     
    10191088            pNode->uchHeight = 'E';
    10201089            RTMemFree(pNode);
     1090
     1091            /* check height */
     1092            uint8_t  const cHeight = pTree ? pTree->uchHeight : 0;
     1093            uint32_t const cMax    = cHeight > 0 ? RT_BIT_32(cHeight) : 1;
     1094            if (cInserted > cMax || cInserted < (cMax >> 2))
     1095                RTTestIFailed("bad tree height after sparse removal i=%d: cMax=%#x, cInserted=%#x\n", i, cMax, cInserted);
    10211096        }
    10221097    }
     
    14451520     * Testing.
    14461521     */
     1522#if 0
    14471523    unsigned i;
    14481524    RTTestSub(hTest, "oGCPhys(32..2048)");
     
    14571533    RTTestISubF("oGCPhys(32..2048, *1K)");
    14581534    for (i = 32; i < 4096; i++)
    1459         if (avlogcphysRand(i, i + _1K))
     1535        if (avlogcphysRand(i, i + _1K, 0xff))
    14601536            break;
    14611537    for (; i <= _4M; i *= 2)
    1462         if (avlogcphysRand(i, i * 8))
     1538        if (avlogcphysRand(i, i * 8, i * 2 - 1))
    14631539            break;
    14641540
    14651541    avlrogcphys();
     1542#endif
    14661543    avlul();
    14671544
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