VirtualBox

Changeset 20597 in vbox for trunk/src/VBox/Runtime/testcase


Ignore:
Timestamp:
Jun 15, 2009 5:54:06 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
48643
Message:

Runtime: improve SemRW testcase to also do recursion testing

File:
1 edited

Legend:

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

    r20443 r20597  
    7979    {
    8080        int rc;
     81        unsigned readrec = RTRandU32Ex(0, 3);
     82        unsigned writerec = RTRandU32Ex(0, 3);
     83        /* Don't overdo recursion testing. */
     84        if (readrec > 1)
     85            readrec--;
     86        if (writerec > 1)
     87            writerec--;
     88
    8189        fWrite = (c100 < g_uWritePercent);
    8290        if (fWrite)
    8391        {
    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             }
     92            for (unsigned i = 0; i <= writerec; i++)
     93            {
     94                rc = RTSemRWRequestWriteNoResume(g_hSemRW, RT_INDEFINITE_WAIT);
     95                if (RT_FAILURE(rc))
     96                {
     97                    PrintError("%x: RTSemRWRequestWriteNoResume failed with %Rrc\n", rc);
     98                    break;
     99                }
     100            }
     101            if (RT_FAILURE(rc))
     102                break;
    90103            if (ASMAtomicIncU32(&g_cbConcurrentWrite) != 1)
    91104            {
     
    114127            }
    115128        }
     129        for (unsigned i = 0; i < readrec; i++)
     130        {
     131            rc = RTSemRWRequestReadNoResume(g_hSemRW, RT_INDEFINITE_WAIT);
     132            if (RT_FAILURE(rc))
     133            {
     134                PrintError("%x: RTSemRWRequestReadNoResume failed with %Rrc\n", rc);
     135                break;
     136            }
     137        }
     138        if (RT_FAILURE(rc))
     139            break;
    116140
    117141        /*
     
    127151            RTThreadYield();
    128152
     153        for (unsigned i = 0; i < readrec; i++)
     154        {
     155            rc = RTSemRWReleaseRead(g_hSemRW);
     156            if (RT_FAILURE(rc))
     157            {
     158                PrintError("%x: RTSemRWReleaseRead failed with %Rrc\n", rc);
     159                break;
     160            }
     161        }
     162        if (RT_FAILURE(rc))
     163            break;
     164
    129165        if (fWrite)
    130166        {
     
    139175                break;
    140176            }
    141             rc = RTSemRWReleaseWrite(g_hSemRW);
    142             if (RT_FAILURE(rc))
    143             {
    144                 PrintError("%x: RTSemRWReleaseWrite failed with %Rrc\n", rc);
    145                 break;
     177            for (unsigned i = 0; i <= writerec; i++)
     178            {
     179                rc = RTSemRWReleaseWrite(g_hSemRW);
     180                if (RT_FAILURE(rc))
     181                {
     182                    PrintError("%x: RTSemRWReleaseWrite failed with %Rrc\n", rc);
     183                    break;
     184                }
    146185            }
    147186        }
Note: See TracChangeset for help on using the changeset viewer.

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