/*--------------------------------------------------------------------------* * * 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 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 { 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 _Pr = std::less > class accessible_priority_queue : public std::priority_queue<_Ty, _C, _Pr> { public: typedef typename _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 Queue; Queue::iterator FindTaskByID ( Queue::iterator itFirst, Queue::iterator itLast, ATOM idToFind); private: Queue m_queue; }; #endif /* IDLE_H */