VirtualBox

Changeset 20443 in vbox for trunk/src


Ignore:
Timestamp:
Jun 9, 2009 3:00:20 PM (16 years ago)
Author:
vboxsync
Message:

Runtime: testcase for RW semaphores

Location:
trunk/src/VBox/Runtime/testcase
Files:
1 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/testcase/Makefile.kmk

    r20111 r20443  
    114114        tstInlineAsmPIC \
    115115        tstInlineAsmPIC3 \
    116         tstSemMutex
     116        tstSemMutex \
     117        tstSemRW
    117118PROGRAMS.l4 += \
    118119        tstIoCtl
     
    337338tstSemMutex_SOURCES = tstSemMutex.cpp
    338339
     340tstSemRW_SOURCES = tstSemRW.cpp
     341
    339342tstSemPingPong_SOURCES = tstSemPingPong.cpp
    340343
  • trunk/src/VBox/Runtime/testcase/tstSemRW.cpp

    r20412 r20443  
    11/* $Id$ */
    22/** @file
    3  * IPRT Testcase - Simple Semaphore Smoke Test.
     3 * IPRT Testcase - Reader/Writer Semaphore Test.
    44 */
    55
    66/*
    7  * Copyright (C) 2006-2007 Sun Microsystems, Inc.
     7 * Copyright (C) 2009 Sun Microsystems, Inc.
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    3838#include <iprt/time.h>
    3939#include <iprt/initterm.h>
     40#include <iprt/rand.h>
    4041#include <iprt/asm.h>
    4142#include <iprt/assert.h>
     
    4546*   Global Variables                                                           *
    4647*******************************************************************************/
    47 static RTSEMMUTEX           g_hMutex = NIL_RTSEMMUTEX;
     48static RTSEMRW              g_hSemRW = NIL_RTSEMRW;
    4849static bool volatile        g_fTerminate;
    4950static bool                 g_fYield;
    5051static bool                 g_fQuiet;
    51 static uint32_t volatile    g_cbConcurrent;
     52static unsigned             g_uWritePercent;
     53static uint32_t volatile    g_cbConcurrentWrite;
     54static uint32_t volatile    g_cbConcurrentRead;
    5255static uint32_t volatile    g_cErrors;
    5356
     
    5760    ASMAtomicIncU32(&g_cErrors);
    5861
    59     RTPrintf("tstSemMutex: FAILURE - ");
     62    RTPrintf("tstSemRW: FAILURE - ");
    6063    va_list va;
    6164    va_start(va, pszFormat);
     
    6972int ThreadTest1(RTTHREAD ThreadSelf, void *pvUser)
    7073{
     74    // Use randomization to get a little more variation of the sync pattern
     75    unsigned c100 = RTRandU32Ex(0, 99);
    7176    uint64_t *pu64 = (uint64_t *)pvUser;
     77    bool fWrite;
    7278    for (;;)
    7379    {
    74         int rc = RTSemMutexRequestNoResume(g_hMutex, RT_INDEFINITE_WAIT);
    75         if (RT_FAILURE(rc))
     80        int rc;
     81        fWrite = (c100 < g_uWritePercent);
     82        if (fWrite)
    7683        {
    77             PrintError("%x: RTSemMutexRequestNoResume failed with %Rrc\n", rc);
    78             break;
     84            rc = RTSemRWRequestWriteNoResume(g_hSemRW, RT_INDEFINITE_WAIT);
     85            if (RT_FAILURE(rc))
     86            {
     87                PrintError("%x: RTSemRWRequestWriteNoResume failed with %Rrc\n", rc);
     88                break;
     89            }
     90            if (ASMAtomicIncU32(&g_cbConcurrentWrite) != 1)
     91            {
     92                PrintError("g_cbConcurrentWrite=%d after request!\n", g_cbConcurrentWrite);
     93                break;
     94            }
     95            if (g_cbConcurrentRead != 0)
     96            {
     97                PrintError("g_cbConcurrentRead=%d after request!\n", g_cbConcurrentRead);
     98                break;
     99            }
    79100        }
    80         if (ASMAtomicIncU32(&g_cbConcurrent) != 1)
     101        else
    81102        {
    82             PrintError("g_cbConcurrent=%d after request!\n", g_cbConcurrent);
    83             break;
     103            rc = RTSemRWRequestReadNoResume(g_hSemRW, RT_INDEFINITE_WAIT);
     104            if (RT_FAILURE(rc))
     105            {
     106                PrintError("%x: RTSemRWRequestReadNoResume failed with %Rrc\n", rc);
     107                break;
     108            }
     109            ASMAtomicIncU32(&g_cbConcurrentRead);
     110            if (g_cbConcurrentWrite != 0)
     111            {
     112                PrintError("g_cbConcurrentWrite=%d after request!\n", g_cbConcurrentWrite);
     113                break;
     114            }
    84115        }
    85116
     
    95126        if (g_fYield)
    96127            RTThreadYield();
    97         if (ASMAtomicDecU32(&g_cbConcurrent) != 0)
     128
     129        if (fWrite)
    98130        {
    99             PrintError("g_cbConcurrent=%d before release!\n", g_cbConcurrent);
    100             break;
     131            if (ASMAtomicDecU32(&g_cbConcurrentWrite) != 0)
     132            {
     133                PrintError("g_cbConcurrentWrite=%d before release!\n", g_cbConcurrentWrite);
     134                break;
     135            }
     136            if (g_cbConcurrentRead != 0)
     137            {
     138                PrintError("g_cbConcurrentRead=%d before release!\n", g_cbConcurrentRead);
     139                break;
     140            }
     141            rc = RTSemRWReleaseWrite(g_hSemRW);
     142            if (RT_FAILURE(rc))
     143            {
     144                PrintError("%x: RTSemRWReleaseWrite failed with %Rrc\n", rc);
     145                break;
     146            }
    101147        }
    102         rc = RTSemMutexRelease(g_hMutex);
    103         if (RT_FAILURE(rc))
     148        else
    104149        {
    105             PrintError("%x: RTSemMutexRelease failed with %Rrc\n", rc);
    106             break;
     150            if (g_cbConcurrentWrite != 0)
     151            {
     152                PrintError("g_cbConcurrentWrite=%d before release!\n", g_cbConcurrentWrite);
     153                break;
     154            }
     155            ASMAtomicDecU32(&g_cbConcurrentRead);
     156            rc = RTSemRWReleaseRead(g_hSemRW);
     157            if (RT_FAILURE(rc))
     158            {
     159                PrintError("%x: RTSemRWReleaseRead failed with %Rrc\n", rc);
     160                break;
     161            }
    107162        }
     163
    108164        if (g_fTerminate)
    109165            break;
     166
     167        c100++;
     168        c100 %= 100;
    110169    }
    111170    if (!g_fQuiet)
    112         RTPrintf("tstSemMutex: Thread %08x exited with %lld\n", ThreadSelf, *pu64);
     171        RTPrintf("tstSemRW: Thread %08x exited with %lld\n", ThreadSelf, *pu64);
    113172    return VINF_SUCCESS;
    114173}
    115174
    116175
    117 static int Test1(unsigned cThreads, unsigned cSeconds, bool fYield, bool fQuiet)
     176static int Test1(unsigned cThreads, unsigned cSeconds, unsigned uWritePercent, bool fYield, bool fQuiet)
    118177{
    119178    int rc;
     
    129188    g_fQuiet = fQuiet;
    130189    g_fTerminate = false;
    131 
    132     rc = RTSemMutexCreate(&g_hMutex);
    133     if (RT_FAILURE(rc))
    134         return PrintError("RTSemMutexCreate failed (rc=%Rrc)\n", rc);
     190    g_uWritePercent = uWritePercent;
     191    g_cbConcurrentWrite = 0;
     192    g_cbConcurrentRead = 0;
     193
     194    rc = RTSemRWCreate(&g_hSemRW);
     195    if (RT_FAILURE(rc))
     196        return PrintError("RTSemRWCreate failed (rc=%Rrc)\n", rc);
    135197
    136198    /*
    137      * Create the threads and let them block on the mutex.
     199     * Create the threads and let them block on the semrw.
    138200     */
    139     rc = RTSemMutexRequest(g_hMutex, RT_INDEFINITE_WAIT);
    140     if (RT_FAILURE(rc))
    141         return PrintError("RTSemMutexRequest failed (rc=%Rrc)\n", rc);
     201    rc = RTSemRWRequestWrite(g_hSemRW, RT_INDEFINITE_WAIT);
     202    if (RT_FAILURE(rc))
     203        return PrintError("RTSemRWRequestWrite failed (rc=%Rrc)\n", rc);
    142204
    143205    for (i = 0; i < cThreads; i++)
     
    150212
    151213    if (!fQuiet)
    152         RTPrintf("tstSemMutex: %zu Threads created. Racing them for %u seconds (%s) ...\n",
     214        RTPrintf("tstSemRW: %zu Threads created. Racing them for %u seconds (%s) ...\n",
    153215                 cThreads, cSeconds, g_fYield ? "yielding" : "no yielding");
    154216
    155217    uint64_t u64StartTS = RTTimeNanoTS();
    156     rc = RTSemMutexRelease(g_hMutex);
    157     if (RT_FAILURE(rc))
    158         PrintError("RTSemMutexRelease failed (rc=%Rrc)\n", rc);
     218    rc = RTSemRWReleaseWrite(g_hSemRW);
     219    if (RT_FAILURE(rc))
     220        PrintError("RTSemRWReleaseWrite failed (rc=%Rrc)\n", rc);
    159221    RTThreadSleep(cSeconds * 1000);
    160222    ASMAtomicXchgBool(&g_fTerminate, true);
     
    168230    }
    169231
    170     rc = RTSemMutexDestroy(g_hMutex);
    171     if (RT_FAILURE(rc))
    172         PrintError("RTSemMutexDestroy failed - %Rrc\n", rc);
    173     g_hMutex = NIL_RTSEMMUTEX;
     232    if (g_cbConcurrentWrite != 0)
     233        PrintError("g_cbConcurrentWrite=%d at end of test!\n", g_cbConcurrentWrite);
     234    if (g_cbConcurrentRead != 0)
     235        PrintError("g_cbConcurrentRead=%d at end of test!\n", g_cbConcurrentRead);
     236
     237    rc = RTSemRWDestroy(g_hSemRW);
     238    if (RT_FAILURE(rc))
     239        PrintError("RTSemRWDestroy failed - %Rrc\n", rc);
     240    g_hSemRW = NIL_RTSEMRW;
    174241    if (g_cErrors)
    175242        RTThreadSleep(100);
     
    183250
    184251    uint64_t Normal = Total / cThreads;
    185     uint64_t MaxDiviation = 0;
     252    uint64_t MaxDeviation = 0;
    186253    for (i = 0; i < cThreads; i++)
    187254    {
    188255        uint64_t Delta = RT_ABS((int64_t)(g_au64[i] - Normal));
    189256        if (Delta > Normal / 2)
    190             RTPrintf("tstSemMutex: Warning! Thread %d diviates by more than 50%% - %llu (it) vs. %llu (avg)\n",
     257            RTPrintf("tstSemRW: Warning! Thread %d deviates by more than 50%% - %llu (it) vs. %llu (avg)\n",
    191258                     i, g_au64[i], Normal);
    192         if (Delta > MaxDiviation)
    193             MaxDiviation = Delta;
    194 
    195     }
    196 
    197     RTPrintf("tstSemMutex: Threads: %u  Total: %llu  Per Sec: %llu  Avg: %llu ns  Max div: %llu%%\n",
     259        if (Delta > MaxDeviation)
     260            MaxDeviation = Delta;
     261
     262    }
     263
     264    RTPrintf("tstSemRW: Threads: %u  Total: %llu  Per Sec: %llu  Avg: %llu ns  Max dev: %llu%%\n",
    198265             cThreads,
    199266             Total,
    200267             Total / cSeconds,
    201268             ElapsedNS / Total,
    202              MaxDiviation * 100 / Normal
     269             MaxDeviation * 100 / Normal
    203270             );
    204271    return 0;
     
    211278    if (RT_FAILURE(rc))
    212279    {
    213         RTPrintf("tstSemMutex: RTR3Init failed (rc=%Rrc)\n", rc);
     280        RTPrintf("tstSemRW: RTR3Init failed (rc=%Rrc)\n", rc);
    214281        return 1;
    215282    }
    216     RTPrintf("tstSemMutex: TESTING...\n");
     283    RTPrintf("tstSemRW: TESTING...\n");
    217284
    218285    if (argc == 1)
    219286    {
    220         /*    threads, seconds,  yield,  quiet */
    221         Test1(      1,       1,   true,  false);
    222         Test1(      2,       1,   true,  false);
    223         Test1(     10,       1,   true,  false);
    224         Test1(     10,      10,  false,  false);
    225 
    226         RTPrintf("tstSemMutex: benchmarking...\n");
     287        /*    threads, seconds, writePercent,  yield,  quiet */
     288        Test1(      1,       1,            0,   true,  false);
     289        Test1(      1,       1,            1,   true,  false);
     290        Test1(      1,       1,            5,   true,  false);
     291        Test1(      2,       1,            3,   true,  false);
     292        Test1(     10,       1,            5,   true,  false);
     293        Test1(     10,      10,           10,  false,  false);
     294
     295        RTPrintf("tstSemRW: benchmarking...\n");
    227296        for (unsigned cThreads = 1; cThreads < 32; cThreads++)
    228             Test1(cThreads,  2,  false,   true);
     297            Test1(cThreads,  2,            1,  false,   true);
    229298
    230299        /** @todo add a testcase where some stuff times out. */
     
    232301    else
    233302    {
    234         /*    threads, seconds, yield,  quiet */
    235         RTPrintf("tstSemMutex: benchmarking...\n");
    236         Test1(      1,       3,  false,   true);
    237         Test1(      1,       3,  false,   true);
    238         Test1(      1,       3,  false,   true);
    239         Test1(      2,       3,  false,   true);
    240         Test1(      2,       3,  false,   true);
    241         Test1(      2,       3,  false,   true);
    242         Test1(      3,       3,  false,   true);
    243         Test1(      3,       3,  false,   true);
    244         Test1(      3,       3,  false,   true);
     303        /*    threads, seconds, writePercent, yield,  quiet */
     304        RTPrintf("tstSemRW: benchmarking...\n");
     305        Test1(      1,       3,            1,  false,   true);
     306        Test1(      1,       3,            1,  false,   true);
     307        Test1(      1,       3,            1,  false,   true);
     308        Test1(      2,       3,            1,  false,   true);
     309        Test1(      2,       3,            1,  false,   true);
     310        Test1(      2,       3,            1,  false,   true);
     311        Test1(      3,       3,            1,  false,   true);
     312        Test1(      3,       3,            1,  false,   true);
     313        Test1(      3,       3,            1,  false,   true);
    245314    }
    246315
    247316    if (!g_cErrors)
    248         RTPrintf("tstSemMutex: SUCCESS\n");
     317        RTPrintf("tstSemRW: SUCCESS\n");
    249318    else
    250         RTPrintf("tstSemMutex: FAILURE - %u errors\n", g_cErrors);
     319        RTPrintf("tstSemRW: FAILURE - %u errors\n", g_cErrors);
    251320    return g_cErrors != 0;
    252321}
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