VirtualBox

Changeset 44903 in vbox


Ignore:
Timestamp:
Mar 3, 2013 11:34:09 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
84073
Message:

Guest::updateStats: Don't divide by zero.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/GuestImpl.cpp

    r44528 r44903  
    264264        /*
    265265         * There is no point in collecting VM shared memory if other memory
    266          * statistics are not available yet. Or is it?
     266         * statistics are not available yet. Or is there?
    267267         */
    268268        if (validStats)
     
    272272            rc = PGMR3QueryMemoryStats(ptrVM.rawUVM(), &cbTotalMemIgn, &cbPrivateMemIgn, &cbSharedMem, &cbZeroMemIgn);
    273273            if (rc == VINF_SUCCESS)
    274             {
    275274                validStats |= pm::VMSTATMASK_GUEST_MEMSHARED;
    276             }
    277275        }
    278276
     
    282280            AssertRC(rc);
    283281            if (rc == VINF_SUCCESS)
    284             {
    285                 validStats |=
    286                     pm::VMSTATMASK_VMM_ALLOC  | pm::VMSTATMASK_VMM_FREE |
    287                     pm::VMSTATMASK_VMM_BALOON | pm::VMSTATMASK_VMM_SHARED;
    288             }
     282                validStats |= pm::VMSTATMASK_VMM_ALLOC  | pm::VMSTATMASK_VMM_FREE
     283                           |  pm::VMSTATMASK_VMM_BALOON | pm::VMSTATMASK_VMM_SHARED;
    289284        }
    290285
     
    293288        mNetStatRx = mNetStatTx = 0;
    294289        rc = STAMR3Enum(ptrVM.rawUVM(), "*/ReceiveBytes|*/TransmitBytes", staticEnumStatsCallback, this);
     290        AssertRC(rc);
     291
    295292        uint64_t uTsNow = RTTimeNanoTS();
    296         uint64_t uTimePassed = uTsNow - mNetStatLastTs;
    297         mNetStatLastTs = uTsNow;
    298         uNetStatRx = (ULONG)((mNetStatRx - uRxPrev) * 1000000 / (uTimePassed / 1000)); /* in bytes per second */
    299         uNetStatTx = (ULONG)((mNetStatTx - uTxPrev) * 1000000 / (uTimePassed / 1000)); /* in bytes per second */
    300         LogFlowThisFunc(("Net Rx=%llu Tx=%llu Ts=%llu Delta=%llu\n", mNetStatRx, mNetStatTx, uTsNow, uTimePassed));
    301         AssertRC(rc);
    302         validStats |= pm::VMSTATMASK_NET_RX | pm::VMSTATMASK_NET_TX;
     293        uint64_t cNsPassed = uTsNow - mNetStatLastTs;
     294        if (cNsPassed >= 1000)
     295        {
     296            mNetStatLastTs = uTsNow;
     297
     298            uNetStatRx = (ULONG)((mNetStatRx - uRxPrev) * 1000000 / (cNsPassed / 1000)); /* in bytes per second */
     299            uNetStatTx = (ULONG)((mNetStatTx - uTxPrev) * 1000000 / (cNsPassed / 1000)); /* in bytes per second */
     300            validStats |= pm::VMSTATMASK_NET_RX | pm::VMSTATMASK_NET_TX;
     301            LogFlowThisFunc(("Net Rx=%llu Tx=%llu Ts=%llu Delta=%llu\n", mNetStatRx, mNetStatTx, uTsNow, cNsPassed));
     302        }
     303        else
     304        {
     305            /* Can happen on resume or if we're using a non-monotonic clock
     306               source for the timer and the time is adjusted. */
     307            mNetStatRx = uRxPrev;
     308            mNetStatTx = uTxPrev;
     309            LogThisFunc(("Net Ts=%llu cNsPassed=%llu - too small interval\n", uTsNow, cNsPassed));
     310        }
    303311    }
    304312
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