Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-01-05 18:33:13 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-01-09 18:09:33 +0300
commitd2708b0f73d5f0e0a40b36da21c6a0d15405e739 (patch)
tree53d699a0a7701dbe009234633a38065e6f474cdf /source/blender/blenlib/intern/task.c
parentf5d64b59f5152114cfa25a2b7433ed25204cb149 (diff)
Task scheduler: Get rid of extended version of parallel range callback
Wrap all arguments into TLS type of argument. Avoids some branching and also makes it easier to extend things in the future.
Diffstat (limited to 'source/blender/blenlib/intern/task.c')
-rw-r--r--source/blender/blenlib/intern/task.c69
1 files changed, 28 insertions, 41 deletions
diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c
index afa20e3d766..030d4124e62 100644
--- a/source/blender/blenlib/intern/task.c
+++ b/source/blender/blenlib/intern/task.c
@@ -994,7 +994,6 @@ typedef struct ParallelRangeState {
void *userdata;
TaskParallelRangeFunc func;
- TaskParallelRangeFuncEx func_ex;
int iter;
int chunk_size;
@@ -1015,23 +1014,17 @@ BLI_INLINE bool parallel_range_next_iter_get(
static void parallel_range_func(
TaskPool * __restrict pool,
void *userdata_chunk,
- int threadid)
+ int thread_id)
{
ParallelRangeState * __restrict state = BLI_task_pool_userdata(pool);
+ ParallelRangeTLS tls = {
+ .thread_id = thread_id,
+ .userdata_chunk = userdata_chunk,
+ };
int iter, count;
-
while (parallel_range_next_iter_get(state, &iter, &count)) {
- int i;
-
- if (state->func_ex) {
- for (i = 0; i < count; ++i) {
- state->func_ex(state->userdata, userdata_chunk, iter + i, threadid);
- }
- }
- else {
- for (i = 0; i < count; ++i) {
- state->func(state->userdata, iter + i);
- }
+ for (int i = 0; i < count; ++i) {
+ state->func(state->userdata, iter + i, &tls);
}
}
}
@@ -1047,7 +1040,6 @@ static void task_parallel_range_ex(
void *userdata_chunk,
const size_t userdata_chunk_size,
TaskParallelRangeFunc func,
- TaskParallelRangeFuncEx func_ex,
TaskParallelRangeFuncFinalize func_finalize,
const bool use_threading,
const bool use_dynamic_scheduling)
@@ -1059,7 +1051,7 @@ static void task_parallel_range_ex(
void *userdata_chunk_local = NULL;
void *userdata_chunk_array = NULL;
- const bool use_userdata_chunk = (func_ex != NULL) && (userdata_chunk_size != 0) && (userdata_chunk != NULL);
+ const bool use_userdata_chunk = (userdata_chunk_size != 0) && (userdata_chunk != NULL);
if (start == stop) {
return;
@@ -1067,7 +1059,6 @@ static void task_parallel_range_ex(
BLI_assert(start < stop);
if (userdata_chunk_size != 0) {
- BLI_assert(func_ex != NULL && func == NULL);
BLI_assert(userdata_chunk != NULL);
}
@@ -1075,28 +1066,25 @@ static void task_parallel_range_ex(
* do everything from the main thread.
*/
if (!use_threading) {
- if (func_ex) {
- if (use_userdata_chunk) {
- userdata_chunk_local = MALLOCA(userdata_chunk_size);
- memcpy(userdata_chunk_local, userdata_chunk, userdata_chunk_size);
- }
-
- for (i = start; i < stop; ++i) {
- func_ex(userdata, userdata_chunk_local, i, 0);
- }
-
- if (func_finalize) {
- func_finalize(userdata, userdata_chunk_local);
- }
+ if (use_userdata_chunk) {
+ userdata_chunk_local = MALLOCA(userdata_chunk_size);
+ memcpy(userdata_chunk_local, userdata_chunk, userdata_chunk_size);
+ }
- MALLOCA_FREE(userdata_chunk_local, userdata_chunk_size);
+ ParallelRangeTLS tls = {
+ .thread_id = 0,
+ .userdata_chunk = userdata_chunk_local,
+ };
+ for (i = start; i < stop; ++i) {
+ func(userdata, i, &tls);
}
- else {
- for (i = start; i < stop; ++i) {
- func(userdata, i);
- }
+
+ if (func_finalize) {
+ func_finalize(userdata, userdata_chunk_local);
}
+ MALLOCA_FREE(userdata_chunk_local, userdata_chunk_size);
+
return;
}
@@ -1114,7 +1102,6 @@ static void task_parallel_range_ex(
state.stop = stop;
state.userdata = userdata;
state.func = func;
- state.func_ex = func_ex;
state.iter = start;
if (use_dynamic_scheduling) {
state.chunk_size = 32;
@@ -1180,12 +1167,12 @@ void BLI_task_parallel_range_ex(
void *userdata,
void *userdata_chunk,
const size_t userdata_chunk_size,
- TaskParallelRangeFuncEx func_ex,
+ TaskParallelRangeFunc func,
const bool use_threading,
const bool use_dynamic_scheduling)
{
task_parallel_range_ex(
- start, stop, userdata, userdata_chunk, userdata_chunk_size, NULL, func_ex, NULL,
+ start, stop, userdata, userdata_chunk, userdata_chunk_size, func, NULL,
use_threading, use_dynamic_scheduling);
}
@@ -1206,7 +1193,7 @@ void BLI_task_parallel_range(
TaskParallelRangeFunc func,
const bool use_threading)
{
- task_parallel_range_ex(start, stop, userdata, NULL, 0, func, NULL, NULL, use_threading, false);
+ task_parallel_range_ex(start, stop, userdata, NULL, 0, func, NULL, use_threading, false);
}
/**
@@ -1232,13 +1219,13 @@ void BLI_task_parallel_range_finalize(
void *userdata,
void *userdata_chunk,
const size_t userdata_chunk_size,
- TaskParallelRangeFuncEx func_ex,
+ TaskParallelRangeFunc func,
TaskParallelRangeFuncFinalize func_finalize,
const bool use_threading,
const bool use_dynamic_scheduling)
{
task_parallel_range_ex(
- start, stop, userdata, userdata_chunk, userdata_chunk_size, NULL, func_ex, func_finalize,
+ start, stop, userdata, userdata_chunk, userdata_chunk_size, func, func_finalize,
use_threading, use_dynamic_scheduling);
}