Giter Club home page Giter Club logo

concurrency-runtime's Introduction

Build

Concurrency runtime in C++

What I did?


Intro

I really wanted to understand how Go's runtime works. I suppose that the best way to research smth - write it by yourself. So this project is only my effort to understand it. This lib doesn't ready for production. For example I wrote specific context switching and I don't know how it works on Window/MacOS or another CPU arch. I try to write good unit tests with diffrent sanitizers and cases. However, I don't think it's enough. For example for simular project fault injection is a good way to found a conccurancy problem.

I must admit that every decision is made in the design of the system imperfectly. Every design is trade off.

When I work with this lib I understood that concurrancy is really too hard.

Requirements

  • x86-64
  • Linux
  • Clang++18

How to build

You can find more information:

sudo apt-get install python3 python3-pip python3-setuptools python3-wheel ninja-build
python3 -m venv env
pip install -r requirements.txt
sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
# /usr/bin/clang++ is clang++-18
conan install . -of=build --build=missing -pr:a=./config/debug_profile
meson setup --native-file build/conan_meson_native.ini build . --buildtype debug
meson compile -C build
meson test -C build

Bench

see here

Perf results

see here


What have I implemented?

Switch context

Main part for implementation stackfull coroutine.

Stackfull coroutine

My implementation of stackfull coroutine.

Executor

Scheduler, executor.

Fibers

Stackfull coroutine + Executor = Fibers. Im proud of async mutex, wait group, event.

Common components

P.S. Thanks for R.Lipovsky for his wonderfully program :)

concurrency-runtime's People

Contributors

k-morozov avatar

Watchers

 avatar

concurrency-runtime's Issues

Data race

stderr:
==================
WARNING: ThreadSanitizer: data race (pid=4206)
  Read of size 1 at 0x72c00001fd50 by thread T313:
    #0 std::unique_lock<NSync::SpinLock>::~unique_lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/unique_lock.h:103:6 (libfiber.so+0x6e5d) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #1 fibers::AsyncMutexWaiter<fibers::AsyncMutex>::~AsyncMutexWaiter() /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/awaiter/mutex_awaiter.h:16:7 (libfiber.so+0x6eef) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #2 fibers::AsyncMutex::Lock() /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/sync/async_mutex.cpp:16:5 (libfiber.so+0x6937) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #3 fibers::AsyncMutex::lock() /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/sync/async_mutex.h:23:19 (test_fiber+0x1040a5) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #4 std::lock_guard<fibers::AsyncMutex>::lock_guard(fibers::AsyncMutex&) /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/std_mutex.h:229:19 (test_fiber+0x104009) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #5 TestMutex_Counter_Test::TestBody()::$_0::operator()() const /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/test_mutex.cpp:48:33 (test_fiber+0x102003) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #6 NComponents::BasicFunction<void ()>::free_function_holder<TestMutex_Counter_Test::TestBody()::$_0>::invoke() /home/runner/work/go-runtime/go-runtime/buildDir/../src/components/function/basic_function.h:47:20 (test_fiber+0x101f89) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #7 NComponents::BasicFunction<void ()>::operator()() /home/runner/work/go-runtime/go-runtime/buildDir/../src/components/function/basic_function.h:23:25 (libexecutor.so+0x2140e) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #8 fibers::coro::StackfullCoroutine::Run() /home/runner/work/go-runtime/go-runtime/buildDir/../src/coro/stackfull_coro.cpp:17:9 (libcoro.so+0x439d) (BuildId: f8816de9b913f7de1ebffcba32ba05bcbf95fde6)
    #9 fibers::ctx::Context::Run() /home/runner/work/go-runtime/go-runtime/buildDir/../src/context/context.cpp:34:14 (libcontext.so+0x269d) (BuildId: 3866a1d5c970e718783185d03686ee8ee2ecbdd7)
    #10 fibers::ctx::(anonymous namespace)::CallRunner(void*, void*, void*, void*, void*, void*, void*) /home/runner/work/go-runtime/go-runtime/buildDir/../src/context/buffer/buffer_context.cpp:16:8 (libcontext.so+0x2d31) (BuildId: 3866a1d5c970e718783185d03686ee8ee2ecbdd7)

  Previous write of size 1 at 0x72c00001fd50 by thread T308:
    #0 std::unique_lock<NSync::SpinLock>::unlock() /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/unique_lock.h:196:14 (libfiber.so+0x7368) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #1 fibers::AsyncMutexWaiter<fibers::AsyncMutex>::AwaitSuspend(fibers::StoppedFiber) /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/awaiter/mutex_awaiter.h:29:15 (libfiber.so+0x72bc) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #2 fibers::AwaiterFiber::Run() /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/awaiter_fiber.cpp:38:19 (libfiber.so+0x59d9) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #3 NExecutors::IntrusiveThreadPool::Start()::$_0::operator()() const /home/runner/work/go-runtime/go-runtime/buildDir/../src/executor/pool/intrusive_pool.cpp:44:27 (libexecutor.so+0x1de54) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #4 void std::__invoke_impl<void, NExecutors::IntrusiveThreadPool::Start()::$_0>(std::__invoke_other, NExecutors::IntrusiveThreadPool::Start()::$_0&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/invoke.h:61:14 (libexecutor.so+0x1dd55) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #5 std::__invoke_result<NExecutors::IntrusiveThreadPool::Start()::$_0>::type std::__invoke<NExecutors::IntrusiveThreadPool::Start()::$_0>(NExecutors::IntrusiveThreadPool::Start()::$_0&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/invoke.h:96:14 (libexecutor.so+0x1dcc5) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #6 void std::thread::_Invoker<std::tuple<NExecutors::IntrusiveThreadPool::Start()::$_0>>::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/std_thread.h:[279](https://github.com/k-morozov/go-runtime/actions/runs/9658392950/job/26639468352#step:5:280):13 (libexecutor.so+0x1dc7d) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #7 std::thread::_Invoker<std::tuple<NExecutors::IntrusiveThreadPool::Start()::$_0>>::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/std_thread.h:286:11 (libexecutor.so+0x1dc25) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #8 std::thread::_State_impl<std::thread::_Invoker<std::tuple<NExecutors::IntrusiveThreadPool::Start()::$_0>>>::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/std_thread.h:231:13 (libexecutor.so+0x1dae9) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #9 <null> <null> (libstdc++.so.6+0xdc252) (BuildId: e37fe1a879783838de78cbc8c80621fa685d58a2)

  Location is heap block of size 65536 at 0x72c000010000 allocated by main thread:
    #0 operator new[](unsigned long) <null> (test_fiber+0xf0ae7) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #1 fibers::ctx::Buffer::AllocBytes(unsigned long) /home/runner/work/go-runtime/go-runtime/buildDir/../src/context/buffer/buffer.h:21:29 (libgo.so+0x263d) (BuildId: bc333304af824eb6e7c7b9319fabd40497776e68)
    #2 fibers::Go(NExecutors::IExecutor&, NComponents::BasicFunction<void ()>) /home/runner/work/go-runtime/go-runtime/buildDir/../src/go/go.cpp:17:19 (libgo.so+0x23d9) (BuildId: bc333304af824eb6e7c7b9319fabd40497776e68)
    #3 TestMutex_Counter_Test::TestBody() /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/test_mutex.cpp:46:9 (test_fiber+0x100e36) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #4 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /home/runner/.conan2/p/b/gtest86d4f1cbf8b63/b/src/googletest/src/gtest.cc:2554:10 (test_fiber+0x166f8a) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #5 main /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/main.cpp:9:12 (test_fiber+0xf1940) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)

  Thread T313 (tid=0, running) created by main thread at:
    #0 fibers::ctx::SanitizerContext::Setup(std::span<std::byte, 18446744073709551615ul>) /home/runner/work/go-runtime/go-runtime/buildDir/../src/context/sanitizer/thread/sanitizer_context.h:14:50 (libcontext.so+0x2703) (BuildId: 3866a1d5c970e718783185d03686ee8ee2ecbdd7)
    #1 fibers::ctx::Context::Setup(std::span<std::byte, 18446744073709551615ul>, fibers::ctx::Runner*) /home/runner/work/go-runtime/go-runtime/buildDir/../src/context/context.cpp:16:20 (libcontext.so+0x242e) (BuildId: 3866a1d5c970e718783185d03686ee8ee2ecbdd7)
    #2 fibers::coro::StackfullCoroutine::StackfullCoroutine(NComponents::BasicFunction<void ()>, fibers::ctx::Buffer&&) /home/runner/work/go-runtime/go-runtime/buildDir/../src/coro/stackfull_coro.cpp:12:15 (libcoro.so+0x42f8) (BuildId: f8816de9b913f7de1ebffcba32ba05bcbf95fde6)
    #3 fibers::AwaiterFiber::AwaiterFiber(NExecutors::IExecutor*, NComponents::BasicFunction<void ()>, fibers::ctx::Buffer&&) /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/awaiter_fiber.cpp:23:28 (libfiber.so+0x57f0) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #4 fibers::Go(NExecutors::IExecutor&, NComponents::BasicFunction<void ()>) /home/runner/work/go-runtime/go-runtime/buildDir/../src/go/go.cpp:19:13 (libgo.so+0x2423) (BuildId: bc333304af824eb6e7c7b9319fabd40497776e68)
    #5 TestMutex_Counter_Test::TestBody() /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/test_mutex.cpp:46:9 (test_fiber+0x100e36) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #6 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /home/runner/.conan2/p/b/gtest86d4f1cbf8b63/b/src/googletest/src/gtest.cc:2554:10 (test_fiber+0x166f8a) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #7 main /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/main.cpp:9:12 (test_fiber+0xf1940) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)

  Thread T308 (tid=4302, running) created by main thread at:
    #0 pthread_create <null> (test_fiber+0x725eb) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State>>, void (*)()) <null> (libstdc++.so.6+0xdc328) (BuildId: e37fe1a879783838de78cbc8c80621fa685d58a2)
    #2 std::__detail::_MakeUniq<std::thread>::__single_object std::make_unique<std::thread, NExecutors::IntrusiveThreadPool::Start()::$_0>(NExecutors::IntrusiveThreadPool::Start()::$_0&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/unique_ptr.h:1065:34 (libexecutor.so+0x1d2ac) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #3 NExecutors::IntrusiveThreadPool::Start() /home/runner/work/go-runtime/go-runtime/buildDir/../src/executor/pool/intrusive_pool.cpp:34:28 (libexecutor.so+0x1d1cc) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #4 TestMutex_Counter_Test::TestBody() /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/test_mutex.cpp:37:15 (test_fiber+0x100da7) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #5 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /home/runner/.conan2/p/b/gtest86d4f1cbf8b63/b/src/googletest/src/gtest.cc:2554:10 (test_fiber+0x166f8a) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #6 main /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/main.cpp:9:12 (test_fiber+0xf1940) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)

SUMMARY: ThreadSanitizer: data race /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/awaiter/mutex_awaiter.h:16:7 in fibers::AsyncMutexWaiter<fibers::AsyncMutex>::~AsyncMutexWaiter()
==================
==================
WARNING: ThreadSanitizer: data race (pid=4206)
  Write of size 1 at 0x72c00004fd50 by thread T319:
    #0 std::unique_lock<NSync::SpinLock>::unique_lock(std::unique_lock<NSync::SpinLock>&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/unique_lock.h:111:35 (libfiber.so+0x6cea) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #1 fibers::AsyncMutexWaiter<fibers::AsyncMutex>::AsyncMutexWaiter(fibers::AsyncMutex*, std::unique_lock<NSync::SpinLock>) /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/awaiter/mutex_awaiter.h:22:25 (libfiber.so+0x6ded) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #2 fibers::AsyncMutex::Lock() /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/sync/async_mutex.cpp:14:16 (libfiber.so+0x6912) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #3 fibers::AsyncMutex::lock() /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/sync/async_mutex.h:23:19 (test_fiber+0x1040a5) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #4 std::lock_guard<fibers::AsyncMutex>::lock_guard(fibers::AsyncMutex&) /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/std_mutex.h:229:19 (test_fiber+0x104009) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #5 TestMutex_Counter_Test::TestBody()::$_0::operator()() const /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/test_mutex.cpp:48:33 (test_fiber+0x102003) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #6 NComponents::BasicFunction<void ()>::free_function_holder<TestMutex_Counter_Test::TestBody()::$_0>::invoke() /home/runner/work/go-runtime/go-runtime/buildDir/../src/components/function/basic_function.h:47:20 (test_fiber+0x101f89) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #7 NComponents::BasicFunction<void ()>::operator()() /home/runner/work/go-runtime/go-runtime/buildDir/../src/components/function/basic_function.h:23:25 (libexecutor.so+0x2140e) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #8 fibers::coro::StackfullCoroutine::Run() /home/runner/work/go-runtime/go-runtime/buildDir/../src/coro/stackfull_coro.cpp:17:9 (libcoro.so+0x439d) (BuildId: f8816de9b913f7de1ebffcba32ba05bcbf95fde6)
    #9 fibers::ctx::Context::Run() /home/runner/work/go-runtime/go-runtime/buildDir/../src/context/context.cpp:34:14 (libcontext.so+0x269d) (BuildId: 3866a1d5c970e718783185d03686ee8ee2ecbdd7)
    #10 fibers::ctx::(anonymous namespace)::CallRunner(void*, void*, void*, void*, void*, void*, void*) /home/runner/work/go-runtime/go-runtime/buildDir/../src/context/buffer/buffer_context.cpp:16:8 (libcontext.so+0x2d31) (BuildId: 3866a1d5c970e718783185d03686ee8ee2ecbdd7)

  Previous write of size 1 at 0x72c00004fd50 by thread T310:
    #0 std::unique_lock<NSync::SpinLock>::unlock() /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/unique_lock.h:196:14 (libfiber.so+0x7368) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #1 fibers::AsyncMutexWaiter<fibers::AsyncMutex>::AwaitSuspend(fibers::StoppedFiber) /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/awaiter/mutex_awaiter.h:29:15 (libfiber.so+0x72bc) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #2 fibers::AwaiterFiber::Run() /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/awaiter_fiber.cpp:38:19 (libfiber.so+0x59d9) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #3 NExecutors::IntrusiveThreadPool::Start()::$_0::operator()() const /home/runner/work/go-runtime/go-runtime/buildDir/../src/executor/pool/intrusive_pool.cpp:44:27 (libexecutor.so+0x1de54) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #4 void std::__invoke_impl<void, NExecutors::IntrusiveThreadPool::Start()::$_0>(std::__invoke_other, NExecutors::IntrusiveThreadPool::Start()::$_0&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/invoke.h:61:14 (libexecutor.so+0x1dd55) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #5 std::__invoke_result<NExecutors::IntrusiveThreadPool::Start()::$_0>::type std::__invoke<NExecutors::IntrusiveThreadPool::Start()::$_0>(NExecutors::IntrusiveThreadPool::Start()::$_0&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/invoke.h:96:14 (libexecutor.so+0x1dcc5) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #6 void std::thread::_Invoker<std::tuple<NExecutors::IntrusiveThreadPool::Start()::$_0>>::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/std_thread.h:279:13 (libexecutor.so+0x1dc7d) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #7 std::thread::_Invoker<std::tuple<NExecutors::IntrusiveThreadPool::Start()::$_0>>::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/std_thread.h:[286](https://github.com/k-morozov/go-runtime/actions/runs/9658392950/job/26639468352#step:5:287):11 (libexecutor.so+0x1dc25) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #8 std::thread::_State_impl<std::thread::_Invoker<std::tuple<NExecutors::IntrusiveThreadPool::Start()::$_0>>>::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/std_thread.h:231:13 (libexecutor.so+0x1dae9) (BuildId: 4f2091261806cb70f1819[287](https://github.com/k-morozov/go-runtime/actions/runs/9658392950/job/26639468352#step:5:288)d079a68167c993ba)
    #9 <null> <null> (libstdc++.so.6+0xdc252) (BuildId: e37fe1a879783838de78cbc8c80621fa685d58a2)

  Location is heap block of size 65536 at 0x72c000040000 allocated by main thread:
    #0 operator new[](unsigned long) <null> (test_fiber+0xf0ae7) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #1 fibers::ctx::Buffer::AllocBytes(unsigned long) /home/runner/work/go-runtime/go-runtime/buildDir/../src/context/buffer/buffer.h:21:29 (libgo.so+0x263d) (BuildId: bc333304af824eb6e7c7b9319fabd40497776e68)
    #2 fibers::Go(NExecutors::IExecutor&, NComponents::BasicFunction<void ()>) /home/runner/work/go-runtime/go-runtime/buildDir/../src/go/go.cpp:17:19 (libgo.so+0x23d9) (BuildId: bc333304af824eb6e7c7b9319fabd40497776e68)
    #3 TestMutex_Counter_Test::TestBody() /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/test_mutex.cpp:46:9 (test_fiber+0x100e36) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #4 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /home/runner/.conan2/p/b/gtest86d4f1cbf8b63/b/src/googletest/src/gtest.cc:2554:10 (test_fiber+0x166f8a) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #5 main /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/main.cpp:9:12 (test_fiber+0xf1940) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)

  Thread T319 (tid=0, running) created by main thread at:
    #0 fibers::ctx::SanitizerContext::Setup(std::span<std::byte, 18446744073709551615ul>) /home/runner/work/go-runtime/go-runtime/buildDir/../src/context/sanitizer/thread/sanitizer_context.h:14:50 (libcontext.so+0x2703) (BuildId: 3866a1d5c970e718783185d03686ee8ee2ecbdd7)
    #1 fibers::ctx::Context::Setup(std::span<std::byte, 18446744073709551615ul>, fibers::ctx::Runner*) /home/runner/work/go-runtime/go-runtime/buildDir/../src/context/context.cpp:16:20 (libcontext.so+0x242e) (BuildId: 3866a1d5c970e718783185d03686ee8ee2ecbdd7)
    #2 fibers::coro::StackfullCoroutine::StackfullCoroutine(NComponents::BasicFunction<void ()>, fibers::ctx::Buffer&&) /home/runner/work/go-runtime/go-runtime/buildDir/../src/coro/stackfull_coro.cpp:12:15 (libcoro.so+0x42f8) (BuildId: f8816de9b913f7de1ebffcba32ba05bcbf95fde6)
    #3 fibers::AwaiterFiber::AwaiterFiber(NExecutors::IExecutor*, NComponents::BasicFunction<void ()>, fibers::ctx::Buffer&&) /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/awaiter_fiber.cpp:23:28 (libfiber.so+0x57f0) (BuildId: 5596854f8e6300c4882f0f6f8a716a9ae3b514bb)
    #4 fibers::Go(NExecutors::IExecutor&, NComponents::BasicFunction<void ()>) /home/runner/work/go-runtime/go-runtime/buildDir/../src/go/go.cpp:19:13 (libgo.so+0x2423) (BuildId: bc333304af824eb6e7c7b9319fabd40497776e68)
    #5 TestMutex_Counter_Test::TestBody() /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/test_mutex.cpp:46:9 (test_fiber+0x100e36) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #6 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /home/runner/.conan2/p/b/gtest86d4f1cbf8b63/b/src/googletest/src/gtest.cc:2554:10 (test_fiber+0x166f8a) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #7 main /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/main.cpp:9:12 (test_fiber+0xf1940) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)

  Thread T310 (tid=4[304](https://github.com/k-morozov/go-runtime/actions/runs/9658392950/job/26639468352#step:5:305), running) created by main thread at:
    #0 pthread_create <null> (test_fiber+0x725eb) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State>>, void (*)()) <null> (libstdc++.so.6+0xdc328) (BuildId: e37fe1a879783838de78cbc8c80621fa685d58a2)
    #2 std::__detail::_MakeUniq<std::thread>::__single_object std::make_unique<std::thread, NExecutors::IntrusiveThreadPool::Start()::$_0>(NExecutors::IntrusiveThreadPool::Start()::$_0&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/unique_ptr.h:1065:34 (libexecutor.so+0x1d2ac) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #3 NExecutors::IntrusiveThreadPool::Start() /home/runner/work/go-runtime/go-runtime/buildDir/../src/executor/pool/intrusive_pool.cpp:34:28 (libexecutor.so+0x1d1cc) (BuildId: 4f2091261806cb70f1819287d079a68167c993ba)
    #4 TestMutex_Counter_Test::TestBody() /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/test_mutex.cpp:37:15 (test_fiber+0x100da7) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #5 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /home/runner/.conan2/p/b/gtest86d4f1cbf8b63/b/src/googletest/src/gtest.cc:2554:10 (test_fiber+0x166f8a) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)
    #6 main /home/runner/work/go-runtime/go-runtime/buildDir/../test/fiber/main.cpp:9:12 (test_fiber+0xf1940) (BuildId: 38cb1dc66680713c827cc2b2acabc92d8b09a1b3)

SUMMARY: ThreadSanitizer: data race /home/runner/work/go-runtime/go-runtime/buildDir/../src/fiber/awaiter/mutex_awaiter.h:22:25 in fibers::AsyncMutexWaiter<fibers::AsyncMutex>::AsyncMutexWaiter(fibers::AsyncMutex*, std::unique_lock<NSync::SpinLock>)
==================
ThreadSanitizer: reported 2 warnings

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.