BLI: add C++ wrapper for task isolation

This makes it easier to use task isolation in c++ code.
Previously, one either had to check `WITH_TBB` (possibly indirectly
through `WITH_OPENVDB`) or one had to use the C function which
is less convenient.
This commit is contained in:
Jacques Lucke 2021-06-16 16:29:21 +02:00
parent 45d59e0df5
commit b37093de7b
2 changed files with 14 additions and 3 deletions

View File

@ -36,6 +36,7 @@
#include "BLI_math.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
#include "BLI_task.hh"
#include "BLI_utildefines.h"
#include "BKE_anim_data.h"
@ -325,9 +326,8 @@ struct VolumeGrid {
openvdb::io::File file(filepath);
/* Isolate file loading since that's potentially multithreaded and we are
* holding a mutex lock. See BLI_task_isolate. Note OpenVDB already uses
* TBB, so it's fine to use here without a wrapper. */
tbb::this_task_arena::isolate([&] {
* holding a mutex lock. */
blender::threading::isolate_task([&] {
try {
file.setCopyMaxBytes(0);
file.open();

View File

@ -31,6 +31,7 @@
# include <tbb/blocked_range.h>
# include <tbb/parallel_for.h>
# include <tbb/parallel_for_each.h>
# include <tbb/task_arena.h>
# ifdef WIN32
/* We cannot keep this defined, since other parts of the code deal with this on their own, leading
* to multiple define warnings unless we un-define this, however we can only undefine this if we
@ -75,4 +76,14 @@ void parallel_for(IndexRange range, int64_t grain_size, const Function &function
#endif
}
/** See #BLI_task_isolate for a description of what isolating a task means. */
template<typename Function> void isolate_task(const Function &function)
{
#ifdef WITH_TBB
tbb::this_task_arena::isolate(function);
#else
function();
#endif
}
} // namespace blender::threading