From b37093de7b42cf331a4ae5830737d9972d7bb426 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 16 Jun 2021 16:29:21 +0200 Subject: 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. --- source/blender/blenkernel/intern/volume.cc | 6 +++--- source/blender/blenlib/BLI_task.hh | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc index 41f0b5c6b72..5e444e66a15 100644 --- a/source/blender/blenkernel/intern/volume.cc +++ b/source/blender/blenkernel/intern/volume.cc @@ -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(); diff --git a/source/blender/blenlib/BLI_task.hh b/source/blender/blenlib/BLI_task.hh index cdf7759ef41..5f5a17f6b58 100644 --- a/source/blender/blenlib/BLI_task.hh +++ b/source/blender/blenlib/BLI_task.hh @@ -31,6 +31,7 @@ # include # include # include +# include # 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 void isolate_task(const Function &function) +{ +#ifdef WITH_TBB + tbb::this_task_arena::isolate(function); +#else + function(); +#endif +} + } // namespace blender::threading -- cgit v1.2.3