📄 searchalgorithms.h
字号:
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
//
// SearchAlgorithms.h
//
// Header file containing definitions for all scheduling algorithms.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
namespace Concurrency
{
namespace details
{
/// <summary>
/// Variant type representing a work item returned from a search.
/// </summary>
class WorkItem
{
public:
/// <summary>
/// The type of work item.
/// </summary>
enum WorkItemType
{
WorkItemTypeNone = 0x0,
WorkItemTypeContext = 0x1,
WorkItemTypeRealizedChore = 0x2,
WorkItemTypeUnrealizedChore = 0x4
};
/// <summary>
/// Default constructor for a work item.
/// </summary>
WorkItem() :
m_type(WorkItemTypeNone),
m_pItem(NULL)
{
}
/// <summary>
/// Constructs a work item from an internal context.
/// </summary>
WorkItem(InternalContextBase *pContext);
/// <summary>
/// Constructs a work item from a realized chore.
/// </summary>
WorkItem(RealizedChore *pRealizedChore, ScheduleGroupBase *pGroup) :
m_type(WorkItemTypeRealizedChore),
m_pGroup(pGroup),
m_pRealizedChore(pRealizedChore)
{
}
/// <summary>
/// Constructs a work item from an unrealized chore.
/// </summary>
WorkItem(_UnrealizedChore *pUnrealizedChore, ScheduleGroupBase *pGroup) :
m_type(WorkItemTypeUnrealizedChore),
m_pGroup(pGroup),
m_pUnrealizedChore(pUnrealizedChore)
{
}
/// <summary>
/// Transfers reference counts as necessary to inline the given work item on the given context. This may
/// only be called on a work item that can be inlined (e.g.: an unbound one).
/// </summary>
/// <param name="pContext">
/// The context that is attempting to inline the work item.
/// </param>
void TransferReferences(InternalContextBase *pContext);
/// <summary>
/// Binds the work item to a context and returns the context. This may or may not allocate a new context. Note that
/// act of binding which performs a context allocation will transfer a single count of work to the counter of the new
/// context.
/// </summary>
InternalContextBase *Bind();
/// <summary>
/// Invokes the work item.
/// </summary>
void Invoke();
/// <summary>
/// Accessor for type.
/// </summary>
WorkItemType GetType() const
{
return m_type;
}
/// <summary>
/// Returns the work item.
/// </summary>
void *GetItem() const
{
return m_pItem;
}
/// <summary>
/// Returns whether the work item is a context or not.
/// </summary>
bool IsContext() const
{
return (m_type == WorkItemTypeContext);
}
/// <summary>
/// Accessor for a context.
/// </summary>
InternalContextBase *GetContext() const
{
CORE_ASSERT(m_type == WorkItemTypeContext);
return m_pContext;
}
/// <summary>
/// Accessor for a realized chore.
/// </summary>
RealizedChore *GetRealizedChore() const
{
CORE_ASSERT(m_type == WorkItemTypeRealizedChore);
return m_pRealizedChore;
}
/// <summary>
/// Accessor for an unrealized chore.
/// </summary>
_UnrealizedChore *GetUnrealizedChore() const
{
CORE_ASSERT(m_type == WorkItemTypeUnrealizedChore);
return m_pUnrealizedChore;
}
/// <summary>
/// Accessor for the schedule group.
/// </summary>
ScheduleGroupBase *GetScheduleGroup() const
{
return m_pGroup;
}
private:
// The type of work item
WorkItemType m_type;
// The schedule group that the work item was found in.
ScheduleGroupBase *m_pGroup;
// The work item itself
union
{
void *m_pItem;
InternalContextBase *m_pContext;
RealizedChore *m_pRealizedChore;
_UnrealizedChore *m_pUnrealizedChore;
};
};
/// <summary>
/// A class which tracks iterator state for a search-for-work. This is generic in terms of search algorithm.
/// </summary>
class WorkSearchContext
{
public:
enum Algorithm
{
AlgorithmNotSet = 0,
AlgorithmCacheLocal,
AlgorithmFair
};
/// <summary>
/// Constructs a work search context that will be reset later.
/// </summary>
WorkSearchContext() : m_pSearchFn(NULL), m_pSearchYieldFn(NULL), m_pVirtualProcessor(NULL), m_pScheduler(NULL)
{
}
/// <summary>
/// Constructs a work search context (an iterator position for a search algorithm).
/// </summary>
WorkSearchContext(VirtualProcessor *pVirtualProcessor, Algorithm algorithm)
{
Reset(pVirtualProcessor, algorithm);
}
/// <summary>
/// Resets the work search context to utilize the specified algorithm at the starting iterator position.
/// </summary>
/// <param name="pVirtualProcessor">
/// The virtual processor binding the searching.
/// </param>
/// <param name="algorithm">
/// What algorithm to reset the iterator with.
/// </param>
void Reset(VirtualProcessor *pVirtualProcessor, Algorithm algorithm);
/// <summary>
/// Searches from the last iterator position according to the set algorithm. This can return any type of work
/// item (context, realized chore, or unrealized chore)
/// </summary>
/// <param name="pWorkItem">
/// Upon successful return, the resulting work item is placed here along with information about what group it was found in, etc...
/// </param>
/// <param name="pOriginGroup">
/// The schedule group of the context which is performing the search.
/// </param>
/// <param name="allowableTypes">
/// What type of work items are allowed to be returned.
/// </param>
/// <returns>
/// An indication of whether a work item was found or not.
/// </returns>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -