From 841ae6e8ab7bb4afffe248a6233a340f6eb789c9 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 2 Jan 2025 12:21:56 +0100 Subject: [PATCH] Fix part of #131933: Crash with playback of deforming subdivision surface The `ForeachContext` in `deform_coarse_vertices` does not use TLS but still has a `func_free` callback set. Change the task API to allow this. Pull Request: https://projects.blender.org/blender/blender/pulls/132498 --- source/blender/blenlib/intern/task_iterator.c | 4 ++-- source/blender/blenlib/intern/task_range.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/blenlib/intern/task_iterator.c b/source/blender/blenlib/intern/task_iterator.c index 05a73ca53d8..1747deada3d 100644 --- a/source/blender/blenlib/intern/task_iterator.c +++ b/source/blender/blenlib/intern/task_iterator.c @@ -84,7 +84,7 @@ void BLI_task_parallel_mempool(BLI_mempool *mempool, } if (use_userdata_chunk) { - if (settings->func_free != NULL) { + if (settings->func_free != NULL && userdata_chunk != NULL) { /* `func_free` should only free data that was created during execution of `func`. */ settings->func_free(userdata, userdata_chunk); } @@ -138,7 +138,7 @@ void BLI_task_parallel_mempool(BLI_mempool *mempool, settings->func_reduce( userdata, userdata_chunk, mempool_iterator_data[i].tls.userdata_chunk); } - if (settings->func_free) { + if (settings->func_free && mempool_iterator_data[i].tls.userdata_chunk != NULL) { settings->func_free(userdata, mempool_iterator_data[i].tls.userdata_chunk); } } diff --git a/source/blender/blenlib/intern/task_range.cc b/source/blender/blenlib/intern/task_range.cc index be6a9deecd3..10e555eebf1 100644 --- a/source/blender/blenlib/intern/task_range.cc +++ b/source/blender/blenlib/intern/task_range.cc @@ -62,7 +62,7 @@ struct RangeTask { ~RangeTask() { - if (settings->func_free != nullptr) { + if (settings->func_free != nullptr && userdata_chunk != nullptr) { settings->func_free(userdata, userdata_chunk); } MEM_SAFE_FREE(userdata_chunk); @@ -131,7 +131,7 @@ void BLI_task_parallel_range(const int start, for (int i = start; i < stop; i++) { func(userdata, i, &tls); } - if (settings->func_free != nullptr) { + if (settings->func_free != nullptr && settings->userdata_chunk != nullptr) { settings->func_free(userdata, settings->userdata_chunk); } }