WorkItemStatistics::WorkItemStatistics(void) { m_totalDeferredWorkItemsExecuted = 0; m_totalImmediateWorkItemsExecuted = 0; for (UIntN i = 0; i < FrameworkEvent::Max; i++) { m_immediateWorkItemStatistics[i].totalExecuted = 0; m_immediateWorkItemStatistics[i].totalQueueTimeMilliseconds = 0; m_immediateWorkItemStatistics[i].minQueueTimeMilliseconds = 0; m_immediateWorkItemStatistics[i].maxQueueTimeMilliseconds = 0; m_immediateWorkItemStatistics[i].totalExecutionTimeMilliseconds = 0; m_immediateWorkItemStatistics[i].minExecutionTimeMilliseconds = 0; m_immediateWorkItemStatistics[i].maxExecutionTimeMilliseconds = 0; } m_lastDptfGetStatusWorkItemCreationTime = EsifTime(0); m_lastDptfGetStatusWorkItemExecutionStartTime = EsifTime(0); m_lastDptfGetStatusWorkItemCompletionTime = EsifTime(0); m_lastDptfGetStatusWorkItemExecutionTimeMilliseconds = 0; }
DeferredWorkItem* DeferredWorkItemQueue::getFirstReadyWorkItemFromQueue(void) { DeferredWorkItem* firstReadyWorkItem = nullptr; if (m_queue.empty() == false) { auto currentTime = EsifTime().getTimeStamp(); firstReadyWorkItem = m_queue.front(); if (firstReadyWorkItem->getDeferredProcessingTime() <= currentTime) { m_queue.pop_front(); } else { firstReadyWorkItem = nullptr; } } return firstReadyWorkItem; }
DeferredWorkItem::DeferredWorkItem(WorkItemInterface* workItem, const TimeSpan& timeUntilExecution) : m_workItem(workItem) { m_deferredProcessingTime = EsifTime() + timeUntilExecution.asMillisecondsInt(); }
void WorkItemStatistics::incrementImmediateTotals(WorkItemInterface* workItem) { FrameworkEvent::Type eventType = workItem->getFrameworkEventType(); if (eventType >= FrameworkEvent::Max) { return; } auto currentTime = EsifTime().getTimeStamp(); m_totalImmediateWorkItemsExecuted += 1; m_immediateWorkItemStatistics[eventType].totalExecuted += 1; auto queueTime = workItem->getWorkItemExecutionStartTime() - workItem->getWorkItemCreationTime(); auto executionTime = currentTime - workItem->getWorkItemExecutionStartTime(); // See if a DptfGetStatus work item executed while this work item was sitting in the queue. If so we need to // adjust the queueTimeMilliseconds. if ((eventType != FrameworkEvent::DptfGetStatus) && (m_lastDptfGetStatusWorkItemCompletionTime > workItem->getWorkItemCreationTime())) { if (m_lastDptfGetStatusWorkItemExecutionStartTime >= workItem->getWorkItemCreationTime()) { // deduct all of the DptfGetStatus execution time queueTime -= m_lastDptfGetStatusWorkItemExecutionTime; } else { // only deduct part of the DptfGetStatus execution time auto timeToDeduct = m_lastDptfGetStatusWorkItemCompletionTime - workItem->getWorkItemCreationTime(); queueTime -= timeToDeduct; } } m_immediateWorkItemStatistics[eventType].totalQueueTime += queueTime; m_immediateWorkItemStatistics[eventType].totalExecutionTime += executionTime; if (m_immediateWorkItemStatistics[eventType].totalExecuted == 1) { m_immediateWorkItemStatistics[eventType].minQueueTime = queueTime; m_immediateWorkItemStatistics[eventType].maxQueueTime = queueTime; m_immediateWorkItemStatistics[eventType].minExecutionTime = executionTime; m_immediateWorkItemStatistics[eventType].maxExecutionTime = executionTime; } else { if (queueTime < m_immediateWorkItemStatistics[eventType].minQueueTime) { m_immediateWorkItemStatistics[eventType].minQueueTime = queueTime; } if (queueTime > m_immediateWorkItemStatistics[eventType].maxQueueTime) { m_immediateWorkItemStatistics[eventType].maxQueueTime = queueTime; } if (executionTime < m_immediateWorkItemStatistics[eventType].minExecutionTime) { m_immediateWorkItemStatistics[eventType].minExecutionTime = executionTime; } if (executionTime > m_immediateWorkItemStatistics[eventType].maxExecutionTime) { m_immediateWorkItemStatistics[eventType].maxExecutionTime = executionTime; } } if (eventType == FrameworkEvent::DptfGetStatus) { m_lastDptfGetStatusWorkItemCreationTime = workItem->getWorkItemCreationTime(); m_lastDptfGetStatusWorkItemExecutionStartTime = workItem->getWorkItemExecutionStartTime(); m_lastDptfGetStatusWorkItemCompletionTime = currentTime; m_lastDptfGetStatusWorkItemExecutionTime = executionTime; } }
DeferredWorkItem::DeferredWorkItem(WorkItemInterface* workItem, const TimeSpan& timeUntilExecution) : m_workItem(workItem) { m_deferredProcessingTime = EsifTime().getTimeStamp() + timeUntilExecution; }