7 #ifndef PXR_BASE_WORK_LOOPS_H
8 #define PXR_BASE_WORK_LOOPS_H
18 #include "pxr/base/tf/mallocTag.h"
36 template <
typename ... Args>
39 _callback(std::forward<Args>(
args)...);
42 _errors->grow_by(1)->swap(transport);
60 , _mallocTagStack(TfMallocTag::GetCurrentStackState()) {}
62 template <
typename ... Args>
65 TfMallocTag::StackOverride ovr(_mallocTagStack);
66 _callback(std::forward<Args>(
args)...);
69 _errors->grow_by(1)->swap(transport);
76 TfMallocTag::StackState _mallocTagStack;
89 template <
typename Arg>
92 _callback(std::forward<Arg>(
arg));
95 _errors->grow_by(1)->swap(transport);
111 : _callback(callback)
113 , _mallocTagStack(TfMallocTag::GetCurrentStackState()) {}
115 template <
typename Arg>
118 TfMallocTag::StackOverride ovr(_mallocTagStack);
119 _callback(std::forward<Arg>(
arg));
122 _errors->grow_by(1)->swap(transport);
129 TfMallocTag::StackState _mallocTagStack;
144 template<
typename Fn>
148 std::forward<Fn>(fn)(0, n);
166 template <
typename Fn>
177 if (TfMallocTag::IsInitialized()) {
179 task(std::forward<Fn>(callback), &errorTransports);
184 task(std::forward<Fn>(callback), &errorTransports);
188 for (
auto &et: errorTransports) {
208 template <
typename Fn>
228 template <
typename RangeType,
typename Fn>
238 #if defined WORK_IMPL_HAS_PARALLEL_FOR_TBB_RANGE
240 if (TfMallocTag::IsInitialized()) {
242 task(std::forward<Fn>(callback), &errorTransports);
247 task(std::forward<Fn>(callback), &errorTransports);
250 for (
auto &et: errorTransports) {
263 : _dispatcher(dispatcher)
264 , _range(std::move(range))
265 , _callback(callback) {}
267 void operator()()
const {
270 RangeType &leftRange = _range;
271 while (leftRange.is_divisible()) {
272 RangeType rightRange(leftRange,
tbb::split());
273 _dispatcher.Run(_RangeTask(
274 _dispatcher, std::move(rightRange), _callback));
279 if (!leftRange.empty()) {
286 mutable RangeType _range;
291 RangeType range =
range;
292 dispatcher.
Run(_RangeTask(
293 dispatcher, range, std::forward<Fn>(callback)));
297 std::forward<Fn>(callback)(range);
313 template <
typename InputIterator,
typename Fn>
316 InputIterator
first, InputIterator
last, Fn &&fn)
321 if (TfMallocTag::IsInitialized()) {
323 task(std::forward<Fn>(fn), &errorTransports);
328 task(std::forward<Fn>(fn), &errorTransports);
331 for (
auto &et: errorTransports) {
335 std::for_each(first, last, std::forward<Fn>(fn));
341 #endif // PXR_BASE_WORK_LOOPS_H
void operator()(Args &&...args) const
#define PXR_NAMESPACE_OPEN_SCOPE
void WorkImpl_ParallelForTBBRange(const RangeType &range, Fn &&callback)
void WorkSerialForN(size_t n, Fn &&fn)
void operator()(Arg &&arg) const
auto arg(const Char *name, const T &arg) -> detail::named_arg< Char, T >
TfErrorTransport Transport() const
void WorkImpl_ParallelForEach(InputIterator first, InputIterator last, Fn &&fn)
void WorkParallelForN(size_t n, Fn &&callback, size_t grainSize)
void WorkParallelForTBBRange(const RangeType &range, Fn &&callback)
tbb::concurrent_vector< TfErrorTransport > Work_ErrorTransports
WORK_API bool WorkHasConcurrency()
Work_LoopsForEachTaskWrapper(Fn &&callback, Work_ErrorTransports *errors)
void WorkParallelForEach(InputIterator first, InputIterator last, Fn &&fn)
__hostdev__ uint64_t last(uint32_t i) const
#define PXR_NAMESPACE_CLOSE_SCOPE
**If you just want to fire and args
PXR_NAMESPACE_OPEN_SCOPE void WorkImpl_ParallelForN(size_t n, Fn &&callback, size_t grainSize)
Work_LoopsTaskWrapper(Fn &&callback, Work_ErrorTransports *errors)
void OIIO_UTIL_API split(string_view str, std::vector< string_view > &result, string_view sep=string_view(), int maxsplit=-1)
int invoke(const Func &taskFunc1, Rest...taskFuncN)
#define PXR_WORK_IMPL_NAMESPACE_USING_DIRECTIVE