diff --git a/.github/workflows/native-unit-test.yml b/.github/workflows/native-unit-test.yml index 7a04b9badb7..e321f4b052d 100644 --- a/.github/workflows/native-unit-test.yml +++ b/.github/workflows/native-unit-test.yml @@ -13,15 +13,25 @@ concurrency: jobs: unit-test-with-cmake: - name: "Run on windows" + name: "Run on macOS" if: (! contains(github.event.pull_request.body, '[X] does not change any runtime related code or build configuration')) - runs-on: windows-latest + runs-on: macos-latest defaults: run: working-directory: ${{github.workspace}}/native steps: - uses: actions/checkout@v4 + + - uses: lukka/get-cmake@latest + with: + cmakeVersion: 3.28.3 + + - name: Check cmake version + run: | + echo "CMake version: " + cmake --version + - name: Download external libraries shell: bash run: | @@ -31,9 +41,16 @@ jobs: - name: Run Unit Tests shell: bash run: | - cmake -B tests/unit-test/build -S tests/unit-test - cmake --build tests/unit-test/build --config Release - ./tests/unit-test/build/src/Release/CocosTest.exe + cpus=$(sysctl hw.ncpu | awk '{print $2}') + echo "cpus: ${cpus}" + which cmake + cmake --version + cmake -B tests/unit-test/build -S tests/unit-test -GXcode + cd tests/unit-test/build + # cmake --build tests/unit-test/build --config Release -j${cpus} + ls -l + xcodebuild -project CocosTest.xcodeproj -scheme "CocosTest" -jobs ${cpus} -arch arm64 -configuration Release build CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO + ./src/Release/CocosTest #### TODO(PatriceJiang): model split # - name: Run Module Tests @@ -73,7 +90,7 @@ jobs: cp cfg.cmake proj/ GW="${GITHUB_WORKSPACE//\\/\/}" cmake -B proj -S win64 -DRES_DIR="${GW}/native/tests/sebind-tests" -DCOCOS_X_PATH="${GW}/native" -DAPP_NAME=sebind - cmake --build proj + cmake --build proj -j2 # cd proj/Debug ## can not boot on this machine # ./sebind.exe || true 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..769cbacb9e2 --- /dev/null +++ b/native/tests/unit-test/src/scheduler_test.cpp @@ -0,0 +1,66 @@ +/**************************************************************************** + Copyright (c) 2024 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 +#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); + }); + + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + }; + 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); +}