VirtualBox

Ignore:
Timestamp:
Oct 15, 2010 6:16:59 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
66703
Message:

SUPDrv,SUPLib: Expose the high resolution event semaphore APIs.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/testcase/tstSupSem.cpp

    r33033 r33167  
    7070int main(int argc, char **argv)
    7171{
     72    bool fSys = true;
     73    bool fGip = false;
     74#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
     75    fGip = true;
     76#endif
     77
    7278    /*
    7379     * Init.
     
    283289#endif /* !OS2 && !WINDOWS */
    284290
    285     if (RTTestErrorCount(hTest) == 0)
    286291    {
    287         RTTestSub(hTest, "SRE Timeout Accuracy");
    288         RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
    289 
    290292        static unsigned const s_acMsIntervals[] = { 0, 1, 2, 3, 4, 8, 10, 16, 32 };
    291         for (unsigned i = 0; i < RT_ELEMENTS(s_acMsIntervals); i++)
    292         {
    293             uint64_t cMs        = s_acMsIntervals[i];
    294             uint64_t cNsMinSys  = UINT64_MAX;
    295             uint64_t cNsMin     = UINT64_MAX;
    296             uint64_t cNsTotalSys= 0;
    297             uint64_t cNsTotal   = 0;
    298             for (unsigned j = 0; j < 10; j++)
     293        if (RTTestErrorCount(hTest) == 0)
     294        {
     295            RTTestSub(hTest, "SRE Timeout Accuracy (ms)");
     296            RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
     297
     298            for (unsigned i = 0; i < RT_ELEMENTS(s_acMsIntervals); i++)
    299299            {
    300                 uint64_t u64StartSys = RTTimeSystemNanoTS();
    301                 uint64_t u64Start    = RTTimeNanoTS();
    302                 int rcX = SUPSemEventWaitNoResume(pSession, hEvent, cMs);
    303                 if (rc == VERR_TIMEOUT)
    304                     RTTestFailed(hTest, "%Rrc j=%u cMs=%u", rcX, j, cMs);
    305                 uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
    306                 uint64_t cNsElapsed    = RTTimeNanoTS()       - u64Start;
    307                 if (cNsElapsedSys < cNsMinSys)
    308                     cNsMinSys = cNsElapsedSys;
    309                 if (cNsElapsed < cNsMin)
    310                     cNsMin = cNsElapsed;
    311                 cNsTotalSys += cNsElapsedSys;
    312                 cNsTotal    += cNsElapsed;
     300                uint64_t cMs        = s_acMsIntervals[i];
     301                uint64_t cNsMinSys  = UINT64_MAX;
     302                uint64_t cNsMin     = UINT64_MAX;
     303                uint64_t cNsTotalSys= 0;
     304                uint64_t cNsTotal   = 0;
     305                for (unsigned j = 0; j < 10; j++)
     306                {
     307                    uint64_t u64StartSys = RTTimeSystemNanoTS();
     308                    uint64_t u64Start    = RTTimeNanoTS();
     309                    int rcX = SUPSemEventWaitNoResume(pSession, hEvent, cMs);
     310                    if (rc == VERR_TIMEOUT)
     311                        RTTestFailed(hTest, "%Rrc j=%u cMs=%u", rcX, j, cMs);
     312                    uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
     313                    uint64_t cNsElapsed    = RTTimeNanoTS()       - u64Start;
     314                    if (cNsElapsedSys < cNsMinSys)
     315                        cNsMinSys = cNsElapsedSys;
     316                    if (cNsElapsed < cNsMin)
     317                        cNsMin = cNsElapsed;
     318                    cNsTotalSys += cNsElapsedSys;
     319                    cNsTotal    += cNsElapsed;
     320                }
     321                if (fSys)
     322                {
     323                    RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS,        "%u ms min (clock=sys)", cMs);
     324                    RTTestValueF(hTest, cNsTotalSys / 10, RTTESTUNIT_NS, "%u ms avg (clock=sys)", cMs);
     325                }
     326                if (fGip)
     327                {
     328                    RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS,           "%u ms min (clock=gip)", cMs);
     329                    RTTestValueF(hTest, cNsTotal / 10, RTTESTUNIT_NS,    "%u ms avg (clock=gip)", cMs);
     330                }
    313331            }
    314             RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS, "%u ms min (clock=sys)", cMs);
    315             RTTestValueF(hTest, cNsTotalSys / 10, RTTESTUNIT_NS, "%u ms avg - (clock=sys)", cMs);
    316             RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS, "%u ms min (clock=gip)", cMs);
    317             RTTestValueF(hTest, cNsTotal / 10, RTTESTUNIT_NS, "%u ms avg - (clock=gip)", cMs);
     332
     333            RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
    318334        }
    319335
    320         RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
     336        if (RTTestErrorCount(hTest) == 0)
     337        {
     338            RTTestSub(hTest, "MRE Timeout Accuracy (ms)");
     339            RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEvent), VINF_SUCCESS);
     340
     341            for (unsigned i = 0; i < RT_ELEMENTS(s_acMsIntervals); i++)
     342            {
     343                uint64_t cMs        = s_acMsIntervals[i];
     344                uint64_t cNsMinSys  = UINT64_MAX;
     345                uint64_t cNsMin     = UINT64_MAX;
     346                uint64_t cNsTotalSys= 0;
     347                uint64_t cNsTotal   = 0;
     348                for (unsigned j = 0; j < 10; j++)
     349                {
     350                    uint64_t u64StartSys = RTTimeSystemNanoTS();
     351                    uint64_t u64Start    = RTTimeNanoTS();
     352                    int rcX = SUPSemEventMultiWaitNoResume(pSession, hEvent, cMs);
     353                    if (rc == VERR_TIMEOUT)
     354                        RTTestFailed(hTest, "%Rrc j=%u cMs=%u", rcX, j, cMs);
     355                    uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
     356                    uint64_t cNsElapsed    = RTTimeNanoTS()       - u64Start;
     357                    if (cNsElapsedSys < cNsMinSys)
     358                        cNsMinSys = cNsElapsedSys;
     359                    if (cNsElapsed < cNsMin)
     360                        cNsMin = cNsElapsed;
     361                    cNsTotalSys += cNsElapsedSys;
     362                    cNsTotal    += cNsElapsed;
     363                }
     364                if (fSys)
     365                {
     366                    RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS,        "%u ms min (clock=sys)", cMs);
     367                    RTTestValueF(hTest, cNsTotalSys / 10, RTTESTUNIT_NS, "%u ms avg (clock=sys)", cMs);
     368                }
     369                if (fGip)
     370                {
     371                    RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS,           "%u ms min (clock=gip)", cMs);
     372                    RTTestValueF(hTest, cNsTotal / 10, RTTESTUNIT_NS,    "%u ms avg (clock=gip)", cMs);
     373                }
     374            }
     375
     376            RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
     377        }
    321378    }
    322379
    323     if (RTTestErrorCount(hTest) == 0)
    324380    {
    325         RTTestSub(hTest, "MRE Timeout Accuracy");
    326         RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEvent), VINF_SUCCESS);
    327 
    328         static unsigned const s_acMsIntervals[] = { 0, 1, 2, 3, 4, 8, 10, 16, 32 };
    329         for (unsigned i = 0; i < RT_ELEMENTS(s_acMsIntervals); i++)
    330         {
    331             uint64_t cMs        = s_acMsIntervals[i];
    332             uint64_t cNsMinSys  = UINT64_MAX;
    333             uint64_t cNsMin     = UINT64_MAX;
    334             uint64_t cNsTotalSys= 0;
    335             uint64_t cNsTotal   = 0;
    336             for (unsigned j = 0; j < 10; j++)
     381        static uint32_t const s_acNsIntervals[] =
     382        {
     383            0, 1000, 5000, 15000, 30000, 50000, 100000, 250000, 500000, 750000, 900000, 1500000, 2200000
     384        };
     385
     386        if (RTTestErrorCount(hTest) == 0)
     387        {
     388            RTTestSub(hTest, "SUPSemEventWaitNsRelIntr Accuracy");
     389            RTTestValueF(hTest, SUPSemEventGetResolution(pSession), RTTESTUNIT_NS, "SRE resolution");
     390            RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
     391
     392            for (unsigned i = 0; i < RT_ELEMENTS(s_acNsIntervals); i++)
    337393            {
    338                 uint64_t u64StartSys = RTTimeSystemNanoTS();
    339                 uint64_t u64Start    = RTTimeNanoTS();
    340                 int rcX = SUPSemEventMultiWaitNoResume(pSession, hEvent, cMs);
    341                 if (rc == VERR_TIMEOUT)
    342                     RTTestFailed(hTest, "%Rrc j=%u cMs=%u", rcX, j, cMs);
    343                 uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
    344                 uint64_t cNsElapsed    = RTTimeNanoTS()       - u64Start;
    345                 if (cNsElapsedSys < cNsMinSys)
    346                     cNsMinSys = cNsElapsedSys;
    347                 if (cNsElapsed < cNsMin)
    348                     cNsMin = cNsElapsed;
    349                 cNsTotalSys += cNsElapsedSys;
    350                 cNsTotal    += cNsElapsed;
     394                uint64_t cNs        = s_acNsIntervals[i];
     395                uint64_t cNsMinSys  = UINT64_MAX;
     396                uint64_t cNsMin     = UINT64_MAX;
     397                uint64_t cNsTotalSys= 0;
     398                uint64_t cNsTotal   = 0;
     399                for (unsigned j = 0; j < 10; j++)
     400                {
     401                    uint64_t u64StartSys = RTTimeSystemNanoTS();
     402                    uint64_t u64Start    = RTTimeNanoTS();
     403                    int rcX = SUPSemEventWaitNsRelIntr(pSession, hEvent, cNs);
     404                    if (rc == VERR_TIMEOUT)
     405                        RTTestFailed(hTest, "%Rrc j=%u cNs=%u", rcX, j, cNs);
     406                    uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
     407                    uint64_t cNsElapsed    = RTTimeNanoTS()       - u64Start;
     408                    if (cNsElapsedSys < cNsMinSys)
     409                        cNsMinSys = cNsElapsedSys;
     410                    if (cNsElapsed < cNsMin)
     411                        cNsMin = cNsElapsed;
     412                    cNsTotalSys += cNsElapsedSys;
     413                    cNsTotal    += cNsElapsed;
     414                }
     415                if (fSys)
     416                {
     417                    RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS,        "%'u ns min (clock=sys)", cNs);
     418                    RTTestValueF(hTest, cNsTotalSys / 10, RTTESTUNIT_NS, "%'u ns avg (clock=sys)", cNs);
     419                }
     420                if (fGip)
     421                {
     422                    RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS,           "%'u ns min (clock=gip)", cNs);
     423                    RTTestValueF(hTest, cNsTotal / 10, RTTESTUNIT_NS,    "%'u ns avg (clock=gip)", cNs);
     424                }
    351425            }
    352             RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS, "%u ms min (clock=sys)", cMs);
    353             RTTestValueF(hTest, cNsTotalSys / 10, RTTESTUNIT_NS, "%u ms avg - (clock=sys)", cMs);
    354             RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS, "%u ms min (clock=gip)", cMs);
    355             RTTestValueF(hTest, cNsTotal / 10, RTTESTUNIT_NS, "%u ms avg - (clock=gip)", cMs);
     426
     427            RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
    356428        }
    357429
    358         RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
     430        if (RTTestErrorCount(hTest) == 0)
     431        {
     432            RTTestSub(hTest, "SUPSemEventMultiWaitNsRelIntr Accuracy");
     433            RTTestValueF(hTest, SUPSemEventMultiGetResolution(pSession), RTTESTUNIT_NS, "MRE resolution");
     434            RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEvent), VINF_SUCCESS);
     435
     436            for (unsigned i = 0; i < RT_ELEMENTS(s_acNsIntervals); i++)
     437            {
     438                uint64_t cNs        = s_acNsIntervals[i];
     439                uint64_t cNsMinSys  = UINT64_MAX;
     440                uint64_t cNsMin     = UINT64_MAX;
     441                uint64_t cNsTotalSys= 0;
     442                uint64_t cNsTotal   = 0;
     443                for (unsigned j = 0; j < 10; j++)
     444                {
     445                    uint64_t u64StartSys = RTTimeSystemNanoTS();
     446                    uint64_t u64Start    = RTTimeNanoTS();
     447                    int rcX = SUPSemEventMultiWaitNsRelIntr(pSession, hEvent, cNs);
     448                    if (rc == VERR_TIMEOUT)
     449                        RTTestFailed(hTest, "%Rrc j=%u cNs=%u", rcX, j, cNs);
     450                    uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
     451                    uint64_t cNsElapsed    = RTTimeNanoTS()       - u64Start;
     452                    if (cNsElapsedSys < cNsMinSys)
     453                        cNsMinSys = cNsElapsedSys;
     454                    if (cNsElapsed < cNsMin)
     455                        cNsMin = cNsElapsed;
     456                    cNsTotalSys += cNsElapsedSys;
     457                    cNsTotal    += cNsElapsed;
     458                }
     459                if (fSys)
     460                {
     461                    RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS,        "%'u ns min (clock=sys)", cNs);
     462                    RTTestValueF(hTest, cNsTotalSys / 10, RTTESTUNIT_NS, "%'u ns avg (clock=sys)", cNs);
     463                }
     464                if (fGip)
     465                {
     466                    RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS,           "%'u ns min (clock=gip)", cNs);
     467                    RTTestValueF(hTest, cNsTotal / 10, RTTESTUNIT_NS,    "%'u ns avg (clock=gip)", cNs);
     468                }
     469            }
     470
     471            RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
     472        }
     473
     474        if (RTTestErrorCount(hTest) == 0)
     475        {
     476            RTTestSub(hTest, "SUPSemEventWaitNsAbsIntr Accuracy");
     477            RTTestValueF(hTest, SUPSemEventGetResolution(pSession), RTTESTUNIT_NS, "MRE resolution");
     478            RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
     479
     480            for (unsigned i = 0; i < RT_ELEMENTS(s_acNsIntervals); i++)
     481            {
     482                uint64_t cNs        = s_acNsIntervals[i];
     483                uint64_t cNsMinSys  = UINT64_MAX;
     484                uint64_t cNsMin     = UINT64_MAX;
     485                uint64_t cNsTotalSys= 0;
     486                uint64_t cNsTotal   = 0;
     487                for (unsigned j = 0; j < 10; j++)
     488                {
     489                    uint64_t u64StartSys   = RTTimeSystemNanoTS();
     490                    uint64_t u64Start      = RTTimeNanoTS();
     491                    uint64_t uAbsDeadline  = (fGip ? u64Start : u64StartSys) + cNs;
     492                    int rcX = SUPSemEventWaitNsAbsIntr(pSession, hEvent, uAbsDeadline);
     493                    if (rc == VERR_TIMEOUT)
     494                        RTTestFailed(hTest, "%Rrc j=%u cNs=%u", rcX, j, cNs);
     495                    uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
     496                    uint64_t cNsElapsed    = RTTimeNanoTS()       - u64Start;
     497                    if (cNsElapsedSys < cNsMinSys)
     498                        cNsMinSys = cNsElapsedSys;
     499                    if (cNsElapsed < cNsMin)
     500                        cNsMin = cNsElapsed;
     501                    cNsTotalSys += cNsElapsedSys;
     502                    cNsTotal    += cNsElapsed;
     503                }
     504                if (fSys)
     505                {
     506                    RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS,        "%'u ns min (clock=sys)", cNs);
     507                    RTTestValueF(hTest, cNsTotalSys / 10, RTTESTUNIT_NS, "%'u ns avg (clock=sys)", cNs);
     508                }
     509                if (fGip)
     510                {
     511                    RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS,           "%'u ns min (clock=gip)", cNs);
     512                    RTTestValueF(hTest, cNsTotal / 10, RTTESTUNIT_NS,    "%'u ns avg (clock=gip)", cNs);
     513                }
     514            }
     515
     516            RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
     517        }
     518
     519
     520        if (RTTestErrorCount(hTest) == 0)
     521        {
     522            RTTestSub(hTest, "SUPSemEventMultiWaitNsAbsIntr Accuracy");
     523            RTTestValueF(hTest, SUPSemEventMultiGetResolution(pSession), RTTESTUNIT_NS, "MRE resolution");
     524            RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEvent), VINF_SUCCESS);
     525
     526            for (unsigned i = 0; i < RT_ELEMENTS(s_acNsIntervals); i++)
     527            {
     528                uint64_t cNs        = s_acNsIntervals[i];
     529                uint64_t cNsMinSys  = UINT64_MAX;
     530                uint64_t cNsMin     = UINT64_MAX;
     531                uint64_t cNsTotalSys= 0;
     532                uint64_t cNsTotal   = 0;
     533                for (unsigned j = 0; j < 10; j++)
     534                {
     535                    uint64_t u64StartSys   = RTTimeSystemNanoTS();
     536                    uint64_t u64Start      = RTTimeNanoTS();
     537                    uint64_t uAbsDeadline  = (fGip ? u64Start : u64StartSys) + cNs;
     538                    int rcX = SUPSemEventMultiWaitNsAbsIntr(pSession, hEvent, uAbsDeadline);
     539                    if (rc == VERR_TIMEOUT)
     540                        RTTestFailed(hTest, "%Rrc j=%u cNs=%u", rcX, j, cNs);
     541                    uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
     542                    uint64_t cNsElapsed    = RTTimeNanoTS()       - u64Start;
     543                    if (cNsElapsedSys < cNsMinSys)
     544                        cNsMinSys = cNsElapsedSys;
     545                    if (cNsElapsed < cNsMin)
     546                        cNsMin = cNsElapsed;
     547                    cNsTotalSys += cNsElapsedSys;
     548                    cNsTotal    += cNsElapsed;
     549                }
     550                if (fSys)
     551                {
     552                    RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS,        "%'u ns min (clock=sys)", cNs);
     553                    RTTestValueF(hTest, cNsTotalSys / 10, RTTESTUNIT_NS, "%'u ns avg (clock=sys)", cNs);
     554                }
     555                if (fGip)
     556                {
     557                    RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS,           "%'u ns min (clock=gip)", cNs);
     558                    RTTestValueF(hTest, cNsTotal / 10, RTTESTUNIT_NS,    "%'u ns avg (clock=gip)", cNs);
     559                }
     560            }
     561
     562            RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
     563        }
     564
    359565    }
    360566
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