Beispiel #1
0
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;
}
Beispiel #2
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;
}
Beispiel #3
0
DeferredWorkItem::DeferredWorkItem(WorkItemInterface* workItem, const TimeSpan& timeUntilExecution) :
    m_workItem(workItem)
{
    m_deferredProcessingTime = EsifTime() + timeUntilExecution.asMillisecondsInt();
}
Beispiel #4
0
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;
	}
}
Beispiel #5
0
DeferredWorkItem::DeferredWorkItem(WorkItemInterface* workItem, const TimeSpan& timeUntilExecution)
	: m_workItem(workItem)
{
	m_deferredProcessingTime = EsifTime().getTimeStamp() + timeUntilExecution;
}