📄 schedulerbase.h
字号:
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
//
// SchedulerBase.h
//
// Header file containing the metaphor for a concrt scheduler
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#pragma once
namespace Concurrency
{
namespace details
{
// The base class that implements a scheduler instance
class SchedulerBase : public Scheduler
{
private:
//
// NESTED CLASSES:
//
///<summary>
/// An intrusive node type for context tracking outside of the normal placement of contexts upon
/// free/runnable lists.
///</summary>
class ContextNode
{
public:
ContextNode(InternalContextBase *pContext) : m_pContext(pContext)
{
}
SLIST_ENTRY m_slNext;
InternalContextBase *m_pContext;
};
///<summary>
/// A node that tracks events needing to be signaled at finalization time.
///</summary>
class WaitNode
{
public:
WaitNode *m_pNext, *m_pPrev;
HANDLE m_hEvent;
};
///<summary>
/// A class that the scheduler uses to manage external context exit events for implicitly attached
/// external contexts.
///</summary>
class ContextExitEventHandler
{
public:
bool m_fCanceled;
// Count of handles the event handler is waiting on at any time.
unsigned short m_handleCount;
// Modified to reflect the new handle count after adding handles to the wait array and before notifying the
// watch dog of handle addition.
unsigned short m_newHandleCount;
// Event handle used to notify the event handler of certain events (new handle addition, shutdown).
HANDLE m_hWakeEventHandler;
SchedulerBase *m_pScheduler;
// prev, next pointers for the list of all handlers in the scheduler.
ContextExitEventHandler *m_pNext, *m_pPrev;
// list entry for a list of handlers with available slots for context handles. The scheduler uses this
// list when registering contexts.
ListEntry m_availableChain;
// The array of wait handles each thread waits on. Of these one is an event handle for notification
// and the rest are handles to OS contexts.
HANDLE m_waitHandleArray[MAXIMUM_WAIT_OBJECTS];
};
public:
/// <summary>
/// Creates a scheduler that only manages internal contexts. Implicitly calls Reference.
/// If Attach is called, the scheduler is no longer anonymous because it is also managing the external
/// context where Attach was called. To destroy an anonymous scheduler, Release needs to be called.
/// </summary>
/// <param name="policy">
/// [in] A const reference to the scheduler policy.
/// </param>
/// <returns>
/// A pointer to the new scheduler (never null)
/// </returns>
static __ecount(1) SchedulerBase* Create(__in const SchedulerPolicy& policy);
static __ecount(1) SchedulerBase* CreateWithoutInitializing(__in const SchedulerPolicy& policy);
// Constructor
SchedulerBase(__in const ::Concurrency::SchedulerPolicy& policy);
// dtor
virtual ~SchedulerBase();
public: // Public Scheduler interface
/// <returns>
/// Returns a unique identifier for this scheduler. No error state.
/// </returns>
virtual unsigned int Id() const { return m_id; }
/// <returns>
/// Returns a current number of virtual processors for this scheduler. No error state.
/// </returns>
virtual unsigned int GetNumberOfVirtualProcessors() const { return m_virtualProcessorCount; };
/// <returns>
/// Returns a copy of the policy this scheduler is using. No error state.
/// </returns>
virtual __ecount(1) SchedulerPolicy GetPolicy() const;
/// <summary>
/// Increments a reference count to this scheduler to manage lifetimes over composition.</summary>
/// This reference count is known as the scheduler reference count.
/// </summary>
/// <returns>
/// The resulting reference count is returned. No error state.
/// </returns>
virtual unsigned int Reference();
/// <summary>
/// Decrements this scheduler抯 reference count to manage lifetimes over composition.
/// A scheduler starts the shutdown protocol when the scheduler reference count goes to zero.
/// <summary>
/// <returns>
/// The resulting reference count is returned. No error state.
/// </returns>
virtual unsigned int Release();
/// <summary>
/// Causes the OS event object 慹vent
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -