VirtualBox

Changeset 102625 in vbox for trunk/src/VBox/Frontends


Ignore:
Timestamp:
Dec 16, 2023 8:21:41 AM (14 months ago)
Author:
vboxsync
Message:

FE/Qt: bugref:10501. Caching disk write (read) until disk read (write) arrives.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitor.cpp

    r102611 r102625  
    11961196
    11971197        UIChart *pChart = new UIChart(this, &(m_metrics[strMetricName]), m_iMaximumQueueSize);
    1198         //pChart->installEventFilter(this);
    11991198        connect(pChart, &UIChart::sigExportMetricsToFile,
    12001199                this, &UIVMActivityMonitor::sltExportMetricsToFile);
     
    12511250void UIVMActivityMonitor::sltChatDataIndexUnderCursorChanged(int iIndex)
    12521251{
     1252    Q_UNUSED(iIndex);
     1253#if 0
    12531254    foreach (UIChart *chart, m_charts)
    12541255    {
     
    12591260
    12601261    }
     1262#endif
    12611263}
    12621264
     
    18641866    m_availableMetricTypes.clear();
    18651867    foreach (const QString &strName, metricNameList)
    1866     {
    1867         ///printf("%s\n", qPrintable(strName));
    18681868        m_availableMetricTypes << gpConverter->fromInternalString<KMetricType>(strName);
    1869     }
    18701869
    18711870    if (!m_availableMetricTypes.isEmpty())
     
    18921891        else if (enmMetricType == KMetricType_DiskBytesRead)
    18931892        {
    1894             //printf("diskread %s %s\n", qPrintable(data[i]), qPrintable(timeStamps[i]));
     1893            cacheDiskRead(timeStamps[i], data[i].toULongLong());
    18951894        }
    18961895        else if (enmMetricType == KMetricType_DiskBytesWritten)
    18971896        {
    1898             //printf("diskwrite %s %s\n", qPrintable(data[i]), qPrintable(timeStamps[i]));
     1897            //printf("write %s %f\n", qPrintable(data[i]), data[i].toFloat());
     1898            cacheDiskWrite(timeStamps[i], (int)data[i].toFloat());
    18991899        }
    19001900
     
    19311931    foreach (const KMetricType &enmMetricType, m_availableMetricTypes)
    19321932    {
    1933         printf("enm %d\n", enmMetricType);
    19341933        UIMetric metric;
    19351934        int iDataSeriesIndex = 0;
     
    19891988void UIVMActivityMonitorCloud::updateRAMGraphsAndMetric(quint64 /*iTotalRAM*/, quint64 /*iFreeRAM*/){}
    19901989void UIVMActivityMonitorCloud::updateNetworkGraphsAndMetric(quint64 /*iReceiveTotal*/, quint64 /*iTransmitTotal*/){}
    1991 void UIVMActivityMonitorCloud::updateDiskIOGraphsAndMetric(quint64 /*uDiskIOTotalWritten*/, quint64 /*uDiskIOTotalRead*/){}
     1990
     1991void UIVMActivityMonitorCloud::updateDiskIOGraphsAndMetric(quint64 uWriteRate, quint64 uReadRate)
     1992{
     1993    //printf("%lld %lld\n", uWriteRate, uReadRate);
     1994    UIMetric &diskMetric = m_metrics[m_strDiskIOMetricName];
     1995
     1996    // quint64 iWriteRate = uDiskIOTotalWritten - diskMetric.total(0);
     1997    // quint64 iReadRate = uDiskIOTotalRead - diskMetric.total(1);
     1998
     1999    // diskMetric.setTotal(0, uDiskIOTotalWritten);
     2000    // diskMetric.setTotal(1, uDiskIOTotalRead);
     2001
     2002    // /* Do not set data and maximum if the metric has not been initialized  since we need to initialize totals "(t-1)" first: */
     2003    // if (!diskMetric.isInitialized()){
     2004    //     diskMetric.setIsInitialized(true);
     2005    //     return;
     2006    // }
     2007    diskMetric.addData(0, uWriteRate);
     2008    diskMetric.addData(1, uReadRate);
     2009
     2010    // if (m_infoLabels.contains(m_strDiskIOMetricName)  && m_infoLabels[m_strDiskIOMetricName])
     2011    // {
     2012    //     QString strInfo = QString("<b>%1</b></b><br/><font color=\"%2\">%3: %4<br/>%5 %6</font><br/><font color=\"%7\">%8: %9<br/>%10 %11</font>")
     2013    //         .arg(m_strDiskIOInfoLabelTitle)
     2014    //         .arg(dataColorString(m_strDiskIOMetricName, 0)).arg(m_strDiskIOInfoLabelWritten).arg(UITranslator::formatSize((quint64)iWriteRate, g_iDecimalCount))
     2015    //         .arg(m_strDiskIOInfoLabelWrittenTotal).arg(UITranslator::formatSize((quint64)uDiskIOTotalWritten, g_iDecimalCount))
     2016    //         .arg(dataColorString(m_strDiskIOMetricName, 1)).arg(m_strDiskIOInfoLabelRead).arg(UITranslator::formatSize((quint64)iReadRate, g_iDecimalCount))
     2017    //         .arg(m_strDiskIOInfoLabelReadTotal).arg(UITranslator::formatSize((quint64)uDiskIOTotalRead, g_iDecimalCount));
     2018    //     m_infoLabels[m_strDiskIOMetricName]->setText(strInfo);
     2019    // }
     2020    if (m_charts.contains(m_strDiskIOMetricName))
     2021        m_charts[m_strDiskIOMetricName]->update();
     2022}
    19922023
    19932024bool UIVMActivityMonitorCloud::findMetric(KMetricType enmMetricType, UIMetric &metric, int &iDataSeriesIndex) const
     
    20832114}
    20842115
     2116void UIVMActivityMonitorCloud::cacheDiskWrite(const QString &strTimeStamp, int iValue)
     2117{
     2118    /* Make sure this is the first time we receieve write for this time stap: */
     2119    AssertReturnVoid(!m_diskWriteCache.contains(strTimeStamp));
     2120    /* If we have read rate for this time stamp just update the chart and remove related data from the cache: */
     2121    if (m_diskReadCache.contains(strTimeStamp))
     2122    {
     2123        updateDiskIOGraphsAndMetric((quint64) iValue, (quint64) m_diskReadCache[strTimeStamp]);
     2124        m_diskReadCache[strTimeStamp];
     2125    }
     2126    else
     2127        m_diskWriteCache[strTimeStamp] = iValue;
     2128}
     2129
     2130void UIVMActivityMonitorCloud::cacheDiskRead(const QString &strTimeStamp, int iValue)
     2131{
     2132    /* Make sure this is the first time we receieve read for this time stap: */
     2133    AssertReturnVoid(!m_diskReadCache.contains(strTimeStamp));
     2134    /* If we have write rate for this time stamp just update the chart and remove related data from the cache: */
     2135    if (m_diskWriteCache.contains(strTimeStamp))
     2136    {
     2137        updateDiskIOGraphsAndMetric((quint64) m_diskWriteCache[strTimeStamp], (quint64) iValue);
     2138        m_diskWriteCache.remove(strTimeStamp);
     2139    }
     2140    else
     2141        m_diskReadCache[strTimeStamp] = iValue;
     2142}
     2143
     2144
    20852145#include "UIVMActivityMonitor.moc"
  • trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitor.h

    r102611 r102625  
    335335        virtual void updateRAMGraphsAndMetric(quint64 iTotalRAM, quint64 iFreeRAM) RT_OVERRIDE;
    336336        virtual void updateNetworkGraphsAndMetric(quint64 iReceiveTotal, quint64 iTransmitTotal) RT_OVERRIDE;
    337         virtual void updateDiskIOGraphsAndMetric(quint64 uDiskIOTotalWritten, quint64 uDiskIOTotalRead) RT_OVERRIDE;
     337        virtual void updateDiskIOGraphsAndMetric(quint64 uWriteRate, quint64 uReadRate) RT_OVERRIDE;
    338338    /** @} */
    339339    virtual void resetCPUInfoLabel();
    340340    virtual void resetNetworkInfoLabel();
    341341    virtual void resetDiskIOInfoLabel();
     342
     343    /* Since we have a single UIMetric instance for disk IO we cache write and/or read until the other value arrives. Then update
     344     * the corresponding chart. */
     345    void cacheDiskWrite(const QString &strTimeStamp, int iValue);
     346    void cacheDiskRead(const QString &strTimeStamp, int iValue);
    342347
    343348    bool findMetric(KMetricType enmMetricType, UIMetric &metric, int &iDataSeriesIndex) const;
     
    349354    /** Mapping from API enums to internal metric names. Necessary also since we don't hace a 1-to-1 mapping. */
    350355    QHash<KMetricType, QString> m_metricTypeNames;
     356
     357    /* Key is time stamp we get from our Main API, value is disk write or read values. */
     358    QMap<QString, quint64> m_diskWriteCache;
     359    QMap<QString, quint64> m_diskReadCache;
    351360};
    352361#endif /* !FEQT_INCLUDED_SRC_activity_vmactivity_UIVMActivityMonitor_h */
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