VirtualBox

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


Ignore:
Timestamp:
May 14, 2015 6:29:34 PM (10 years ago)
Author:
vboxsync
Message:

IPRT,SUPDrv,VMM: Revised the context switching hook interface. Do less work when enabling the hook (formerly 'registration'). Drop the reference counting (kept internally for solaris) as it complicates restrictions wrt destroying enabled hooks. Bumped support driver version.

File:
1 edited

Legend:

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

    r54453 r55863  
    4949    RTCPUID             uSourceCpuId;
    5050    RTNATIVETHREAD      hSourceThread;
    51     RTTHREADCTX         hThreadCtx;
    5251
    5352    /* For RTTHREADCTXEVENT_PREEMPTING. */
     
    8281    switch (enmEvent)
    8382    {
    84         case RTTHREADCTXEVENT_PREEMPTING:
     83        case RTTHREADCTXEVENT_OUT:
    8584        {
    8685            ASMAtomicWriteBool(&pData->fPreemptingInvoked, true);
     
    119118        }
    120119
    121         case RTTHREADCTXEVENT_RESUMED:
     120        case RTTHREADCTXEVENT_IN:
    122121        {
    123122            ASMAtomicWriteBool(&pData->fResumedInvoked, true);
     
    302301            }
    303302
    304             bool fRegistered = RTThreadCtxHooksAreRegistered(NIL_RTTHREADCTX);
     303            bool fRegistered = RTThreadCtxHookIsEnabled(NIL_RTTHREADCTXHOOK);
    305304            if (fRegistered)
    306305            {
    307                 RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHooksAreRegistered returns true before creating any hooks");
    308                 break;
    309             }
    310 
    311             RTTHREADCTX hThreadCtx;
    312             int rc = RTThreadCtxHooksCreate(&hThreadCtx);
    313             if (RT_FAILURE(rc))
    314             {
    315                 if (rc == VERR_NOT_SUPPORTED)
    316                     RTStrPrintf(pszErr, cchErr, "RTThreadCtxHooksCreate returns VERR_NOT_SUPPORTED");
    317                 else
    318                     RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHooksCreate returns %Rrc", rc);
    319                 break;
    320             }
    321 
    322             fRegistered = RTThreadCtxHooksAreRegistered(hThreadCtx);
    323             if (fRegistered)
    324             {
    325                 RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHooksAreRegistered returns true before registering any hooks");
    326                 RTThreadCtxHooksRelease(hThreadCtx);
     306                RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHookIsEnabled returns true before creating any hooks");
    327307                break;
    328308            }
     
    331311            AssertReturn(pCtxData, VERR_NO_MEMORY);
    332312            pCtxData->u32Magic           = TSTRTR0THREADCTXDATA_MAGIC;
    333             pCtxData->hThreadCtx         = hThreadCtx;
    334313            pCtxData->fPreemptingSuccess = false;
    335314            pCtxData->fPreemptingInvoked = false;
     
    339318            RT_ZERO(pCtxData->achResult);
    340319
     320            RTTHREADCTXHOOK hThreadCtx;
     321            int rc = RTThreadCtxHookCreate(&hThreadCtx, 0, tstRTR0ThreadCtxHook, pCtxData);
     322            if (RT_FAILURE(rc))
     323            {
     324                if (rc == VERR_NOT_SUPPORTED)
     325                    RTStrPrintf(pszErr, cchErr, "RTThreadCtxHooksCreate returns VERR_NOT_SUPPORTED");
     326                else
     327                    RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHooksCreate returns %Rrc", rc);
     328                RTMemFree(pCtxData);
     329                break;
     330            }
     331
     332            fRegistered = RTThreadCtxHookIsEnabled(hThreadCtx);
     333            if (fRegistered)
     334            {
     335                RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHookIsEnabled returns true before registering any hooks");
     336                RTThreadCtxHookDestroy(hThreadCtx);
     337                break;
     338            }
     339
    341340            RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER;
    342341            RTThreadPreemptDisable(&PreemptState);
     
    345344            pCtxData->uSourceCpuId       = RTMpCpuId();
    346345
    347             rc = RTThreadCtxHooksRegister(hThreadCtx, &tstRTR0ThreadCtxHook, pCtxData);
     346            rc = RTThreadCtxHookEnable(hThreadCtx);
    348347            if (RT_FAILURE(rc))
    349348            {
    350349                RTThreadPreemptRestore(&PreemptState);
    351350                RTMemFree(pCtxData);
    352                 RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHooksRegister returns %Rrc", rc);
    353                 break;
    354             }
    355 
    356             fRegistered = RTThreadCtxHooksAreRegistered(hThreadCtx);
     351                RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHookEnable returns %Rrc", rc);
     352                break;
     353            }
     354
     355            fRegistered = RTThreadCtxHookIsEnabled(hThreadCtx);
    357356            if (!fRegistered)
    358357            {
    359358                RTThreadPreemptRestore(&PreemptState);
    360359                RTMemFree(pCtxData);
    361                 RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHooksAreRegistered return false when hooks are supposedly registered");
     360                RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHookIsEnabled return false when hooks are supposedly registered");
    362361                break;
    363362            }
     
    428427            }
    429428
    430             RTThreadCtxHooksDeregister(hThreadCtx);
    431 
    432             fRegistered = RTThreadCtxHooksAreRegistered(hThreadCtx);
     429            RTThreadCtxHookDisable(hThreadCtx);
     430
     431            fRegistered = RTThreadCtxHookIsEnabled(hThreadCtx);
    433432            if (fRegistered)
    434433            {
    435434                RTMemFree(pCtxData);
    436                 RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHooksAreRegistered return true when hooks are deregistered");
     435                RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHookIsEnabled return true when hooks are deregistered");
    437436                break;
    438437            }
    439438
    440439            Assert(RTThreadPreemptIsEnabled(NIL_RTTHREAD));
    441             uint32_t cRefs = RTThreadCtxHooksRelease(hThreadCtx);
    442             if (cRefs == UINT32_MAX)
    443                 RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHooksRelease returns invalid cRefs!");
     440            rc = RTThreadCtxHookDestroy(hThreadCtx);
     441            if (RT_FAILURE(rc))
     442                RTStrPrintf(pszErr, cchErr, "!RTThreadCtxHooksRelease returns %Rrc!", rc);
    444443
    445444            RTMemFree(pCtxData);
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