#include "pxr/pxr.h"
#include "pxr/base/work/dispatcher.h"
PXR_NAMESPACE_OPEN_SCOPE
WorkDispatcher::WorkDispatcher()
: _context(
tbb::task_group_context::isolated,
tbb::task_group_context::concurrent_wait |
tbb::task_group_context::default_traits)
{
_rootTask = new(tbb::task::allocate_root(_context)) tbb::empty_task;
_rootTask->set_ref_count(1);
}
WorkDispatcher::~WorkDispatcher()
{
Wait();
tbb::task::destroy(*_rootTask);
}
void
WorkDispatcher::Wait()
{
_rootTask->wait_for_all();
if (_context.is_group_execution_cancelled()) {
_context.reset();
}
for (auto &et: _errors)
et.Post();
_errors.clear();
}
void
WorkDispatcher::Cancel()
{
_context.cancel_group_execution();
}
void
WorkDispatcher::_TransportErrors(const TfErrorMark &mark,
_ErrorTransports *errors)
{
TfErrorTransport transport = mark.Transport();
errors->grow_by(1)->swap(transport);
}
PXR_NAMESPACE_CLOSE_SCOPE