Loading...
Searching...
No Matches
utils.h
Go to the documentation of this file.
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://openusd.org/license.
6//
7#ifndef PXR_BASE_WORK_UTILS_H
8#define PXR_BASE_WORK_UTILS_H
9
11
12#include "pxr/pxr.h"
13#include "pxr/base/work/api.h"
15
16#include <utility>
17
18PXR_NAMESPACE_OPEN_SCOPE
19
20WORK_API
21bool Work_ShouldSynchronizeAsyncDestroyCalls();
22
23template <class T>
24struct Work_AsyncMoveDestroyHelper {
25 void operator()() const { /* do nothing */ }
26 T obj;
27};
28
29// Helper for swap-based asynchronous destruction that synthesizes move
30// construction and assignment using swap.
31template <class T>
32struct Work_AsyncSwapDestroyHelper {
33 Work_AsyncSwapDestroyHelper() = default;
34
35 Work_AsyncSwapDestroyHelper(Work_AsyncSwapDestroyHelper const&) = delete;
36 Work_AsyncSwapDestroyHelper& operator=(
37 Work_AsyncSwapDestroyHelper const&) = delete;
38
39 Work_AsyncSwapDestroyHelper(Work_AsyncSwapDestroyHelper &&other)
40 : obj()
41 {
42 using std::swap;
43 swap(obj, other.obj);
44 }
45
46 Work_AsyncSwapDestroyHelper& operator=(
47 Work_AsyncSwapDestroyHelper &&other)
48 {
49 using std::swap;
50 swap(obj, other.obj);
51 return *this;
52 }
53
54 void operator()() const { /* do nothing */ }
55 T obj;
56};
57
65template <class T>
67{
68 using std::swap;
69 Work_AsyncSwapDestroyHelper<T> helper;
70 swap(helper.obj, obj);
71 if (!Work_ShouldSynchronizeAsyncDestroyCalls())
72 WorkRunDetachedTask(std::move(helper));
73}
74
77template <class T>
79{
80 Work_AsyncMoveDestroyHelper<T> helper { std::move(obj) };
81 if (!Work_ShouldSynchronizeAsyncDestroyCalls())
82 WorkRunDetachedTask(std::move(helper));
83}
84
85PXR_NAMESPACE_CLOSE_SCOPE
86
87#endif // PXR_BASE_WORK_UTILS_H
void WorkMoveDestroyAsync(T &obj)
Like WorkSwapDestroyAsync() but instead, move from obj, leaving it in a moved-from state instead of a...
Definition: utils.h:78
void WorkSwapDestroyAsync(T &obj)
Swap obj with a default-constructed T instance, return and arrange for the swapped-out instance to be...
Definition: utils.h:66
void WorkRunDetachedTask(Fn &&fn)
Invoke fn asynchronously, discard any errors it produces, and provide no way to wait for it to comple...
Definition: detachedTask.h:40