VirtualBox

Changeset 87814 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Feb 19, 2021 10:03:56 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
142875
Message:

VMM/TM: Eliminated the enmClock member from TMTIMER, we'll be using TMTIMERQUEUE::enmClock instead since the queue is always handy. bugref:9943

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/TMAll.cpp

    r87813 r87814  
    358358 * Schedule the queue which was changed.
    359359 */
    360 DECLINLINE(void) tmSchedule(PVMCC pVM, PTMTIMER pTimer)
    361 {
    362     TMCLOCK const           enmClock = pTimer->enmClock;
    363     AssertReturnVoid((unsigned)enmClock < TMCLOCK_MAX);
    364     PTMTIMERQUEUE const     pQueue   = &pVM->tm.s.aTimerQueues[enmClock];
    365     PTMTIMERQUEUECC const   pQueueCC = TM_GET_TIMER_QUEUE_CC(pVM, enmClock, pQueue);
    366 
     360DECLINLINE(void) tmSchedule(PVMCC pVM, PTMTIMERQUEUECC pQueueCC, PTMTIMERQUEUE pQueue, PTMTIMER pTimer)
     361{
    367362    if (VM_IS_EMT(pVM)) /** @todo drop EMT requirement here. */
    368363    {
     
    440435 *
    441436 * @returns Success indicator.
    442  * @param   pVM             The cross context VM structure.
    443  * @param   pTimer          Timer in question.
    444  * @param   enmStateNew     The new timer state.
    445  * @param   enmStateOld     The old timer state.
    446  */
    447 DECLINLINE(bool) tmTimerTryWithLink(PVMCC pVM, PTMTIMER pTimer, TMTIMERSTATE enmStateNew, TMTIMERSTATE enmStateOld)
    448 {
    449     TMCLOCK const enmClock = pTimer->enmClock;
    450     AssertReturn((unsigned)enmClock < TMCLOCK_MAX, false);
     437 * @param   pQueueCC    The current context queue (same as @a pQueue for
     438 *                      ring-3).
     439 * @param   pQueue      The shared queue data.
     440 * @param   pTimer      Timer in question.
     441 * @param   enmStateNew The new timer state.
     442 * @param   enmStateOld The old timer state.
     443 */
     444DECLINLINE(bool) tmTimerTryWithLink(PTMTIMERQUEUECC pQueueCC, PTMTIMERQUEUE pQueue, PTMTIMER pTimer,
     445                                    TMTIMERSTATE enmStateNew, TMTIMERSTATE enmStateOld)
     446{
    451447    if (tmTimerTry(pTimer, enmStateNew, enmStateOld))
    452448    {
    453         PTMTIMERQUEUE const pQueue = &pVM->tm.s.aTimerQueues[enmClock];
    454         tmTimerLinkSchedule(TM_GET_TIMER_QUEUE_CC(pVM, enmClock, pQueue), pQueue, pTimer);
     449        tmTimerLinkSchedule(pQueueCC, pQueue, pTimer);
    455450        return true;
    456451    }
     
    476471    Assert(pTimer->idxNext == UINT32_MAX);
    477472    Assert(pTimer->idxPrev == UINT32_MAX);
    478     Assert(pTimer->enmState == TMTIMERSTATE_ACTIVE || pTimer->enmClock != TMCLOCK_VIRTUAL_SYNC); /* (active is not a stable state) */
     473    Assert(pTimer->enmState == TMTIMERSTATE_ACTIVE || pQueue->enmClock != TMCLOCK_VIRTUAL_SYNC); /* (active is not a stable state) */
    479474    RT_NOREF(pVM);
    480475
     
    648643         */
    649644        Log2(("tmTimerQueueSchedule: %p:{.enmState=%s, .enmClock=%d, .enmType=%d, .szName=%s}\n",
    650               pTimer, tmTimerState(pTimer->enmState), pTimer->enmClock, pTimer->enmType, pTimer->szName));
     645              pTimer, tmTimerState(pTimer->enmState), pQueue->enmClock, pTimer->enmType, pTimer->szName));
    651646        tmTimerQueueScheduleOne(pVM, pQueueCC, pQueue, pTimer);
    652647        Log2(("tmTimerQueueSchedule: %p: new %s\n", pTimer, tmTimerState(pTimer->enmState)));
     
    683678                     pPrev = pCur, pCur = tmTimerGetNext(pQueueCC, pCur))
    684679                {
    685                     AssertMsg(pCur->enmClock == (TMCLOCK)idxQueue, ("%s: %d != %u\n", pszWhere, pCur->enmClock, idxQueue));
    686680                    AssertMsg(tmTimerGetPrev(pQueueCC, pCur) == pPrev, ("%s: %p != %p\n", pszWhere, tmTimerGetPrev(pQueueCC, pCur), pPrev));
    687681                    TMTIMERSTATE enmState = pCur->enmState;
     
    13771371            case TMTIMERSTATE_EXPIRED_DELIVER:
    13781372            case TMTIMERSTATE_STOPPED:
    1379                 if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState))
     1373                if (tmTimerTryWithLink(pQueueCC, pQueue, pTimer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState))
    13801374                {
    13811375                    Assert(pTimer->idxPrev == UINT32_MAX);
     
    13831377                    pTimer->u64Expire = u64Expire;
    13841378                    TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE);
    1385                     tmSchedule(pVM, pTimer);
     1379                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
    13861380                    STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
    13871381                    return VINF_SUCCESS;
     
    13951389                    pTimer->u64Expire = u64Expire;
    13961390                    TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE);
    1397                     tmSchedule(pVM, pTimer);
     1391                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
    13981392                    STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
    13991393                    return VINF_SUCCESS;
     
    14031397
    14041398            case TMTIMERSTATE_ACTIVE:
    1405                 if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState))
     1399                if (tmTimerTryWithLink(pQueueCC, pQueue, pTimer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState))
    14061400                {
    14071401                    pTimer->u64Expire = u64Expire;
    14081402                    TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE);
    1409                     tmSchedule(pVM, pTimer);
     1403                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
    14101404                    STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
    14111405                    return VINF_SUCCESS;
     
    14191413                    pTimer->u64Expire = u64Expire;
    14201414                    TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE);
    1421                     tmSchedule(pVM, pTimer);
     1415                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
    14221416                    STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
    14231417                    return VINF_SUCCESS;
     
    14981492 * @param   pu64Now         Where to return the current time stamp used.
    14991493 *                          Optional.
    1500  * @param   pQueue          Pointer to the shared timer queue data.
    1501  * @param   idxQueue        The queue index.
     1494 * @param   pQueueCC        The context specific queue data (same as @a pQueue
     1495 *                          for ring-3).
     1496 * @param   pQueue          The shared queue data.
    15021497 */
    15031498static int tmTimerSetRelativeOptimizedStart(PVMCC pVM, PTMTIMER pTimer, uint64_t cTicksToNext, uint64_t *pu64Now,
    1504                                             PTMTIMERQUEUE pQueue, uint32_t idxQueue)
     1499                                            PTMTIMERQUEUECC pQueueCC, PTMTIMERQUEUE pQueue)
    15051500{
    15061501    Assert(pTimer->idxPrev == UINT32_MAX);
     
    15191514     */
    15201515    DBGFTRACE_U64_TAG2(pVM, u64Expire, "tmTimerSetRelativeOptimizedStart", pTimer->szName);
    1521     tmTimerQueueLinkActive(pVM, TM_GET_TIMER_QUEUE_CC(pVM, idxQueue, pQueue), pQueue, pTimer, u64Expire);
     1516    tmTimerQueueLinkActive(pVM, pQueueCC, pQueue, pTimer, u64Expire);
    15221517
    15231518    STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeOpt);
    1524     RT_NOREF(idxQueue);
    15251519    return VINF_SUCCESS;
    15261520}
     
    16141608 * @param   pu64Now         Where to return the current time stamp used.
    16151609 *                          Optional.
     1610 * @param   pQueueCC        The context specific queue data (same as @a pQueue
     1611 *                          for ring-3).
     1612 * @param   pQueue          The shared queue data.
     1613 * @param   idxQueue        The queue index.
    16161614 */
    16171615static int tmTimerSetRelative(PVMCC pVM, PTMTIMER pTimer, uint64_t cTicksToNext, uint64_t *pu64Now,
    1618                               PTMTIMERQUEUE pQueue, uint32_t idxQueue)
     1616                              PTMTIMERQUEUECC pQueueCC, PTMTIMERQUEUE pQueue)
    16191617{
    16201618    STAM_COUNTER_INC(&pTimer->StatSetRelative);
    16211619
    16221620    /* Treat virtual sync timers specially. */
    1623     if (idxQueue == TMCLOCK_VIRTUAL_SYNC)
     1621    if (pQueue->enmClock == TMCLOCK_VIRTUAL_SYNC)
    16241622        return tmTimerVirtualSyncSetRelative(pVM, pTimer, cTicksToNext, pu64Now);
    16251623
     
    16711669                      && tmTimerTry(pTimer, TMTIMERSTATE_ACTIVE, enmState)))
    16721670        {
    1673             tmTimerSetRelativeOptimizedStart(pVM, pTimer, cTicksToNext, pu64Now, pQueue, idxQueue);
     1671            tmTimerSetRelativeOptimizedStart(pVM, pTimer, cTicksToNext, pu64Now, pQueueCC, pQueue);
    16741672            STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSetRelative), a);
    16751673            PDMCritSectLeave(&pQueue->TimerLock);
     
    17041702                RT_FALL_THRU();
    17051703            case TMTIMERSTATE_EXPIRED_DELIVER:
    1706                 if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState))
     1704                if (tmTimerTryWithLink(pQueueCC, pQueue, pTimer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState))
    17071705                {
    17081706                    Assert(pTimer->idxPrev == UINT32_MAX);
     
    17121710                          pTimer, tmTimerState(enmState), pTimer->szName, pTimer->u64Expire, cRetries));
    17131711                    TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE);
    1714                     tmSchedule(pVM, pTimer);
     1712                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
    17151713                    rc = VINF_SUCCESS;
    17161714                    break;
     
    17271725                          pTimer, tmTimerState(enmState), pTimer->szName, pTimer->u64Expire, cRetries));
    17281726                    TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE);
    1729                     tmSchedule(pVM, pTimer);
     1727                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
    17301728                    rc = VINF_SUCCESS;
    17311729                    break;
     
    17361734
    17371735            case TMTIMERSTATE_ACTIVE:
    1738                 if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState))
     1736                if (tmTimerTryWithLink(pQueueCC, pQueue, pTimer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState))
    17391737                {
    17401738                    pTimer->u64Expire = cTicksToNext + tmTimerSetRelativeNowWorker(pVM, pQueue->enmClock, pu64Now);
     
    17421740                          pTimer, tmTimerState(enmState), pTimer->szName, pTimer->u64Expire, cRetries));
    17431741                    TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE);
    1744                     tmSchedule(pVM, pTimer);
     1742                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
    17451743                    rc = VINF_SUCCESS;
    17461744                    break;
     
    17571755                          pTimer, tmTimerState(enmState), pTimer->szName, pTimer->u64Expire, cRetries));
    17581756                    TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE);
    1759                     tmSchedule(pVM, pTimer);
     1757                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
    17601758                    rc = VINF_SUCCESS;
    17611759                    break;
     
    18411839{
    18421840    TMTIMER_HANDLE_TO_VARS_RETURN(pVM, hTimer); /* => pTimer, pQueueCC, pQueue, idxTimer, idxQueue */
    1843     return tmTimerSetRelative(pVM, pTimer, cTicksToNext, pu64Now, pQueue, idxQueue);
     1841    return tmTimerSetRelative(pVM, pTimer, cTicksToNext, pu64Now, pQueueCC, pQueue);
    18441842}
    18451843
     
    20072005                if (tmTimerTry(pTimer, TMTIMERSTATE_PENDING_STOP_SCHEDULE, enmState))
    20082006                {
    2009                     tmSchedule(pVM, pTimer);
     2007                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
    20102008                    STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
    20112009                    return VINF_SUCCESS;
     
    20162014                if (tmTimerTry(pTimer, TMTIMERSTATE_PENDING_STOP, enmState))
    20172015                {
    2018                     tmSchedule(pVM, pTimer);
     2016                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
    20192017                    STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
    20202018                    return VINF_SUCCESS;
     
    20232021
    20242022            case TMTIMERSTATE_ACTIVE:
    2025                 if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_STOP, enmState))
     2023                if (tmTimerTryWithLink(pQueueCC, pQueue, pTimer, TMTIMERSTATE_PENDING_STOP, enmState))
    20262024                {
    2027                     tmSchedule(pVM, pTimer);
     2025                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
    20282026                    STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
    20292027                    return VINF_SUCCESS;
     
    22522250        case TMCLOCK_VIRTUAL:
    22532251            AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
    2254             return tmTimerSetRelative(pVM, pTimer, cMilliesToNext * UINT64_C(1000000), NULL, pQueue, idxQueue);
     2252            return tmTimerSetRelative(pVM, pTimer, cMilliesToNext * UINT64_C(1000000), NULL, pQueueCC, pQueue);
    22552253
    22562254        case TMCLOCK_VIRTUAL_SYNC:
    22572255            AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
    2258             return tmTimerSetRelative(pVM, pTimer, cMilliesToNext * UINT64_C(1000000), NULL, pQueue, idxQueue);
     2256            return tmTimerSetRelative(pVM, pTimer, cMilliesToNext * UINT64_C(1000000), NULL, pQueueCC, pQueue);
    22592257
    22602258        case TMCLOCK_REAL:
    22612259            AssertCompile(TMCLOCK_FREQ_REAL == 1000);
    2262             return tmTimerSetRelative(pVM, pTimer, cMilliesToNext, NULL, pQueue, idxQueue);
     2260            return tmTimerSetRelative(pVM, pTimer, cMilliesToNext, NULL, pQueueCC, pQueue);
    22632261
    22642262        default:
     
    22842282        case TMCLOCK_VIRTUAL:
    22852283            AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
    2286             return tmTimerSetRelative(pVM, pTimer, cMicrosToNext * 1000, NULL, pQueue, idxQueue);
     2284            return tmTimerSetRelative(pVM, pTimer, cMicrosToNext * 1000, NULL, pQueueCC, pQueue);
    22872285
    22882286        case TMCLOCK_VIRTUAL_SYNC:
    22892287            AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
    2290             return tmTimerSetRelative(pVM, pTimer, cMicrosToNext * 1000, NULL, pQueue, idxQueue);
     2288            return tmTimerSetRelative(pVM, pTimer, cMicrosToNext * 1000, NULL, pQueueCC, pQueue);
    22912289
    22922290        case TMCLOCK_REAL:
    22932291            AssertCompile(TMCLOCK_FREQ_REAL == 1000);
    2294             return tmTimerSetRelative(pVM, pTimer, cMicrosToNext / 1000, NULL, pQueue, idxQueue);
     2292            return tmTimerSetRelative(pVM, pTimer, cMicrosToNext / 1000, NULL, pQueueCC, pQueue);
    22952293
    22962294        default:
     
    23122310{
    23132311    TMTIMER_HANDLE_TO_VARS_RETURN(pVM, hTimer); /* => pTimer, pQueueCC, pQueue, idxTimer, idxQueue */
    2314     switch (pTimer->enmClock)
     2312    switch (pQueue->enmClock)
    23152313    {
    23162314        case TMCLOCK_VIRTUAL:
    23172315            AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
    2318             return tmTimerSetRelative(pVM, pTimer, cNanosToNext, NULL, pQueue, idxQueue);
     2316            return tmTimerSetRelative(pVM, pTimer, cNanosToNext, NULL, pQueueCC, pQueue);
    23192317
    23202318        case TMCLOCK_VIRTUAL_SYNC:
    23212319            AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
    2322             return tmTimerSetRelative(pVM, pTimer, cNanosToNext, NULL, pQueue, idxQueue);
     2320            return tmTimerSetRelative(pVM, pTimer, cNanosToNext, NULL, pQueueCC, pQueue);
    23232321
    23242322        case TMCLOCK_REAL:
    23252323            AssertCompile(TMCLOCK_FREQ_REAL == 1000);
    2326             return tmTimerSetRelative(pVM, pTimer, cNanosToNext / 1000000, NULL, pQueue, idxQueue);
     2324            return tmTimerSetRelative(pVM, pTimer, cNanosToNext / 1000000, NULL, pQueueCC, pQueue);
    23272325
    23282326        default:
    2329             AssertMsgFailed(("Invalid enmClock=%d\n", pTimer->enmClock));
     2327            AssertMsgFailed(("Invalid enmClock=%d\n", pQueue->enmClock));
    23302328            return VERR_TM_TIMER_BAD_CLOCK;
    23312329    }
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