diff --git a/native/cocos/base/Scheduler.cpp b/native/cocos/base/Scheduler.cpp index 2d6319aaf8d..3bf0370d245 100644 --- a/native/cocos/base/Scheduler.cpp +++ b/native/cocos/base/Scheduler.cpp @@ -360,9 +360,7 @@ void Scheduler::runFunctionsToBePerformedInCocosThread() { } std::lock_guard lk(_performMutex); - for (; iter != temp.end(); ++iter) { - _functionsToPerform.emplace_back(std::move(*iter)); - } + _functionsToPerform.insert(_functionsToPerform.begin(), std::make_move_iterator(iter), std::make_move_iterator(temp.end())); } } diff --git a/native/tests/unit-test/src/scheduler_test.cpp b/native/tests/unit-test/src/scheduler_test.cpp new file mode 100644 index 00000000000..1d1b1f830f7 --- /dev/null +++ b/native/tests/unit-test/src/scheduler_test.cpp @@ -0,0 +1,65 @@ +/**************************************************************************** + Copyright (c) 2014-2016 Chukong Technologies Inc. + Copyright (c) 2017-2023 Xiamen Yaji Software Co., Ltd. + + http://www.cocos.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +****************************************************************************/ +#include + +#include "base/Scheduler.h" +#include "utils.h" + +using namespace cc; + +TEST(schedulerTest, performInCocosThreadOrder) { + auto scheduler = std::make_shared(); + + std::vector orderResult; + + for (int i = 0; i < 10; ++i) { + auto task = [&orderResult, i, &scheduler](){ + orderResult.emplace_back(i); + + if (i == 5) { + scheduler->performFunctionInCocosThread([&orderResult](){ + orderResult.emplace_back(10); + }); + + scheduler->performFunctionInCocosThread([&orderResult](){ + orderResult.emplace_back(11); + }); + + scheduler->performFunctionInCocosThread([&orderResult](){ + orderResult.emplace_back(12); + }); + + usleep(100 * 1000); + } + }; + scheduler->performFunctionInCocosThread(task); + } + + scheduler->runFunctionsToBePerformedInCocosThread(); + scheduler->runFunctionsToBePerformedInCocosThread(); + + const std::vector expectedResult{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + EXPECT_EQ(orderResult, expectedResult); +}