windows-nt/Source/XPSP1/NT/admin/activec/conui/idle.h
2020-09-26 16:20:57 +08:00

159 lines
3.6 KiB
C++

/*--------------------------------------------------------------------------*
*
* Microsoft Windows
* Copyright (C) Microsoft Corporation, 1992 - 1999
*
* File: idle.h
*
* Contents: Interface file for CIdleTaskQueue
*
* History: 13-Apr-99 jeffro Created
*
*--------------------------------------------------------------------------*/
#ifndef IDLE_H
#define IDLE_H
#pragma once
#include <queue>
typedef enum tagIdleTaskPriority
{
ePriority_Low,
ePriority_Normal,
ePriority_High
} IdleTaskPriority;
class CIdleTask
{
public:
CIdleTask();
virtual ~CIdleTask();
CIdleTask(const CIdleTask &rhs);
CIdleTask& operator= (const CIdleTask& rhs);
virtual SC ScDoWork() = 0;
virtual SC ScGetTaskID(ATOM* pID) = 0;
/*
* Merge from pitMergeFrom into the called idle task.
*
* S_OK the tasks have been merged and pitMergeFrom can be discarded
*
* S_FALSE these two tasks cannot be merged and you wish the idle task
* manager to continue searching for idle tasks into which
* pitMergeFrom can be merged.
*
* E_FAIL these two tasks cannot be merged and you do not wish the idle
* task manager to continue searching for idle tasks into which
* pitMergeFrom can be merged.
*/
virtual SC ScMerge(CIdleTask* pitMergeFrom) = 0;
};
class CIdleQueueEntry
{
public:
CIdleQueueEntry () :
m_ePriority (ePriority_Normal)
{
DEBUG_INCREMENT_INSTANCE_COUNTER(CIdleQueueEntry);
}
CIdleQueueEntry (CIdleTask *pIdleTask, IdleTaskPriority ePriority = ePriority_Normal) :
m_pTask(pIdleTask), m_ePriority (ePriority)
{
DEBUG_INCREMENT_INSTANCE_COUNTER(CIdleQueueEntry);
}
~CIdleQueueEntry()
{
DEBUG_DECREMENT_INSTANCE_COUNTER(CIdleQueueEntry);
}
CIdleQueueEntry(const CIdleQueueEntry &rhs);
CIdleQueueEntry& operator= (const CIdleQueueEntry& rhs);
bool operator< (const CIdleQueueEntry& other) const
{
return (m_ePriority < other.m_ePriority);
}
private:
CIdleTask * m_pTask;
IdleTaskPriority m_ePriority;
public:
CIdleTask * GetTask() const {return m_pTask;}
IdleTaskPriority GetPriority () const {return m_ePriority;}
};
/*
* Determines if a CIdleQueueEntry matches a given task ID.
*/
struct EqualTaskID : std::binary_function<CIdleQueueEntry, ATOM, bool>
{
bool operator()(const CIdleQueueEntry& iqe, ATOM idToMatch) const
{
ATOM id;
SC sc = iqe.GetTask()->ScGetTaskID(&id);
if(sc)
return (false);
return (id == idToMatch);
}
};
/*
* accessible_priority_queue - thin wrapper around std::prority_queue to
* provide access to the container iterators
*/
template<class _Ty, class _C = std::vector<_Ty>, class _Pr = std::less<_C::value_type> >
class accessible_priority_queue : public std::priority_queue<_Ty, _C, _Pr>
{
public:
typedef _C::iterator iterator;
iterator begin()
{ return (c.begin()); }
iterator end()
{ return (c.end()); }
};
class CIdleTaskQueue
{
public:
CIdleTaskQueue();
~CIdleTaskQueue();
// CIdleTaskManager methods
SC ScPushTask (CIdleTask* pitToPush, IdleTaskPriority ePriority);
SC ScPerformNextTask();
SC ScGetTaskCount (LONG_PTR* plCount);
private:
typedef accessible_priority_queue<CIdleQueueEntry> Queue;
Queue::iterator FindTaskByID (
Queue::iterator itFirst,
Queue::iterator itLast,
ATOM idToFind);
private:
Queue m_queue;
};
#endif /* IDLE_H */