From 3a80d5e1d0e4952caa76f1d655429375c0da1884 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sun, 10 Apr 2016 21:18:54 +0200 Subject: Cycles: Fix rare dead-locks on TaskScheduler::exit() When the Moon is full it was possible to have a dead-lock in task scheduler's exit() method. Similar problem was fixed in Blender's task scheduler 3 years ago in bae2a2c. --- intern/cycles/test/CMakeLists.txt | 1 + intern/cycles/test/util_task_test.cpp | 56 +++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 intern/cycles/test/util_task_test.cpp (limited to 'intern/cycles/test') diff --git a/intern/cycles/test/CMakeLists.txt b/intern/cycles/test/CMakeLists.txt index f8bd58c689f..2f3a4d0b1df 100644 --- a/intern/cycles/test/CMakeLists.txt +++ b/intern/cycles/test/CMakeLists.txt @@ -28,3 +28,4 @@ set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${PLATFORM_LIN CYCLES_TEST(util_aligned_malloc "cycles_util") CYCLES_TEST(util_path "cycles_util;${BOOST_LIBRARIES};${OPENIMAGEIO_LIBRARIES}") CYCLES_TEST(util_string "cycles_util;${BOOST_LIBRARIES}") +CYCLES_TEST(util_task "cycles_util;${BOOST_LIBRARIES}") diff --git a/intern/cycles/test/util_task_test.cpp b/intern/cycles/test/util_task_test.cpp new file mode 100644 index 00000000000..e2860d8f8db --- /dev/null +++ b/intern/cycles/test/util_task_test.cpp @@ -0,0 +1,56 @@ +/* + * Copyright 2011-2016 Blender Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "testing/testing.h" + +#include "util/util_task.h" + +CCL_NAMESPACE_BEGIN + +namespace { + +void task_run() { +} + +} // namespace + +TEST(util_task, basic) { + TaskScheduler::init(0); + TaskPool pool; + for (int i = 0; i < 100; ++i) { + pool.push(function_bind(task_run)); + } + TaskPool::Summary summary; + pool.wait_work(&summary); + TaskScheduler::exit(); + EXPECT_EQ(summary.num_tasks_handled, 100); +} + +TEST(util_task, multiple_times) { + for (int N = 0; N < 1000; ++N) { + TaskScheduler::init(0); + TaskPool pool; + for (int i = 0; i < 100; ++i) { + pool.push(function_bind(task_run)); + } + TaskPool::Summary summary; + pool.wait_work(&summary); + TaskScheduler::exit(); + EXPECT_EQ(summary.num_tasks_handled, 100); + } +} + +CCL_NAMESPACE_END -- cgit v1.2.3