📄 contextbase.h
字号:
/// <summary>
/// Wrapper for m_pWorkQueue for use in unstructured task collections
/// that performs delay construction as well as insertion into schedule group.
/// </summary>
WorkQueue *GetWorkQueue()
{
// want inlining
if (m_pWorkQueue == NULL)
CreateWorkQueue();
return m_pWorkQueue;
}
/// <summary>
/// Wrapper for m_pWorkQueue for use in structured task collections
/// that performs delay construction as well as insertion into schedule group.
/// </summary>
WorkQueue *GetStructuredWorkQueue()
{
// want inlining
if (m_pWorkQueue == NULL)
CreateStructuredWorkQueue();
return m_pWorkQueue;
}
/// <summary>
/// Create a workqueue for use in unstructured task collections.
/// </summary>
void CreateWorkQueue();
/// <summary>
/// Create a workqueue for use in structured task collections.
/// </summary>
void CreateStructuredWorkQueue();
/// <summary>
/// Returns a unique identifier for the work queue associated with this context. Note that this should only be used
/// for binding (e.g.: task collection binding)
/// </summary>
unsigned int GetWorkQueueIdentity()
{
return GetWorkQueue()->Id();
}
/// <summary>
/// Pushes an unrealized chore onto the work stealing queue for structured parallelism.
/// </summary>
/// <param name="pChore">
/// The chore to push onto the structured work stealing queue.
/// </param>
void PushStructured(_UnrealizedChore *pChore);
/// <summary>
/// Pushes an unrealized chore onto the work stealing queue for unstructured parallelism.
/// </summary>
/// <param name="pChore">
/// The chore to push onto the unstructured work stealing queue.
/// </param>
int PushUnstructured(_UnrealizedChore *pChore);
/// <summary>
/// Sweeps the unstructured work stealing queue for items matching a predicate and potentially removes them
/// based on the result of a callback.
/// </summary>
/// <param name="pPredicate">
/// The predicate for things to call pSweepFn on.
/// </param>
/// <param name="pData">
/// The data for the predicate callback
/// </param>
/// <param name="pSweepFn">
/// The sweep function
/// </param>
void SweepUnstructured(WorkStealingQueue<_UnrealizedChore>::SweepPredicate pPredicate,
void *pData,
WorkStealingQueue<_UnrealizedChore>::SweepFunction pSweepFn
);
/// <summary>
/// Pops the topmost chore from the work stealing queue for structured parallelism. Failure
/// to pop typically indicates stealing.
/// </summary>
/// <returns>
/// An unrealized chore from the structured work stealing queue or NULL if none is present.
/// </returns>
_UnrealizedChore *PopStructured();
/// <summary>
/// Attempts to pop the chore specified by a cookie value from the unstructured work stealing queue. Failure
/// to pop typically indicates stealing.
/// </summary>
/// <param name="cookie">
/// A cookie returned from PushUnstructured indicating the chore to attempt to pop from
/// the unstructured work stealing queue.
/// </param>
/// <returns>
/// The specified unrealized chore (as indicated by cookie) or NULL if it could not be popped from
/// the work stealing queue.
/// </returns>
_UnrealizedChore *TryPopUnstructured(int cookie);
/// <summary>
/// Returns the scheduler the specified context is associated with.
/// </summary>
SchedulerBase *GetScheduler() const;
/// <summary>
/// Returns the schedule group the specified context is associated with.
/// </summary>
ScheduleGroupBase *GetScheduleGroup() const;
/// <summary>
/// Tells whether the context is an external context
/// <summary>
bool IsExternal() const { return m_fIsExternal; }
/// <summary>
/// Gets the indirect alias.
/// </summary>
_TaskCollection *GetIndirectAlias() const;
/// <summary>
/// Sets the indirect alias.
/// </summary>
void SetIndirectAlias(_TaskCollection *pAlias);
/// <summary>
/// Returns whether a task collection executing on this context was canceled.
/// </summary>
bool IsCanceled() const
{
return (m_canceledCount > 0);
}
/// <summary>
/// Returns whether the entire context was canceled due to a steal.
/// </summary>
bool IsCanceledContext() const
{
return (m_canceledContext != 0);
}
/// <summary>
/// Called in order to indicate that a cancellation is happening for a structured task collection associated with this thread.
/// </summary>
void PendingCancel()
{
InterlockedIncrement(&m_pendingCancellations);
}
/// <summary>
/// Called when a pending cancel completes.
/// </summary>
void PendingCancelComplete()
{
ASSERT(m_pendingCancellations > 0);
InterlockedDecrement(&m_pendingCancellations);
}
/// <summary>
/// Returns whether the context has a pending cancellation.
/// </summary>
bool IsPendingCancellation() const
{
return (m_pendingCancellations > 0);
}
/// <summary>
/// Returns whether there is any cancellation on the context (pending or committed)
/// </summary>
bool HasAnyCancellation() const
{
return (m_pendingCancellations + m_canceledCount > 0);
}
/// <summary>
/// Called in order to indicate that a collection executing on this context was canceled. This will often cause cancellation
/// and unwinding of the entire context (up to the point where we get to the canceled collection.
/// </summary>
void CancelCollection(int inliningDepth);
/// <summary>
/// Called in order to indicate that we're blowing away the entire context. It's stolen from a collection which was canceled.
/// </summary>
void CancelEntireContext()
{
InterlockedExchange(&m_canceledContext, TRUE);
CancelCollection(0);
}
/// <summary>
/// When a cancellation bubbles up to the collection being canceled, this function is called in order to stop propagation of
/// the cancellation further up the work tree.
/// </summary>
bool CollectionCancelComplete(int inliningDepth);
/// <summary>
/// Completely clears the cancel count. This should be called when a root stolen chore completes on a context.
/// </summary>
void ClearCancel()
{
m_minCancellationDepth = -1;
m_canceledCount = 0;
m_canceledContext = 0;
}
/// <summary>
/// Returns the task collection executing atop a stolen context.
/// </summary>
_TaskCollectionBase *GetRootCollection()
{
return m_pRootCollection;
}
/// <summary>
/// Sets the task collection executing atop a stolen context. Note that this also sets the executing collection since the root
/// collection is executing at the time it is set.
/// </summary>
void SetRootCollection(_TaskCollectionBase *pRootCollection)
{
m_pRootCollection = pRootCollection;
m_pExecutingCollection = pRootCollection;
}
/// <summary>
/// Gets the task collection currently executing atop the context.
/// </summary>
_TaskCollectionBase *GetExecutingCollection()
{
return m_pExecutingCollection;
}
/// <summary>
/// Sets the task collection currently executing atop the context.
/// </summary>
void SetExecutingCollection(_TaskCollectionBase *pExecutingCollection)
{
m_pExecutingCollection = pExecutingCollection;
}
/// <summary>
/// Places a reference on the context preventing it from being destroyed until such time as the stealer is added to the chain
/// via AddStealer. Note that the operation of AddStealer should happen rapidly as it will *BLOCK* cleanup of the context.
/// </summary>
void ReferenceForCancellation();
/// <summary>
/// Removes a reference on the context which was preventing it from being destroyed.
/// </summary>
void DereferenceForCancellation();
/// <summary>
/// Adds a stealing context. Removes a reference.
/// </summary>
void AddStealer(ContextBase *pStealer, bool fDereferenceForCancellation);
/// <summary>
/// Removes a stealing context.
/// </summary>
void RemoveStealer(ContextBase *pStealer);
/// <summary>
/// Called by a stolen chore to flag the context as running a chore for which the steal is chained to a task collection instead
/// of the context.
/// </summary>
void NotifyTaskCollectionChainedStealer()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -