#ifndef PXR_BASE_WORK_DETACHED_TASK_H
#define PXR_BASE_WORK_DETACHED_TASK_H
#include "pxr/pxr.h"
#include "pxr/base/tf/errorMark.h"
#include "pxr/base/work/api.h"
#include <tbb/task.h>
#include <type_traits>
#include <utility>
PXR_NAMESPACE_OPEN_SCOPE
template <class Fn>
struct Work_DetachedInvoker : public tbb::task {
explicit Work_DetachedInvoker(Fn &&fn) : _fn(std::move(fn)) {}
explicit Work_DetachedInvoker(Fn const &fn) : _fn(fn) {}
virtual tbb::task *execute() {
TfErrorMark m;
_fn();
m.Clear();
return nullptr;
}
private:
Fn _fn;
};
WORK_API tbb::task_group_context &Work_GetDetachedTaskGroupContext();
template <class Fn>
void WorkRunDetachedTask(Fn &&fn)
{
using FnType = typename std::remove_reference<Fn>::type;
tbb::task::enqueue(
*new (tbb::task::allocate_root(Work_GetDetachedTaskGroupContext()))
Work_DetachedInvoker<FnType>(std::forward<Fn>(fn)));
}
PXR_NAMESPACE_CLOSE_SCOPE
#endif