Cross-platform coroutine library in C++ .
License under the MIT LICENSE
Documents can be found at https://libcopp.atframe.work , API references canbe found at https://libcopp.atframe.work/doxygen/html/ .(Generated by sphinx and doxygen with docs/sphinx and docs/libcopp.doxyfile.in).
- Rename
cotask::task::await
intocotask::task::await_task
- Replace
cotask::task<TCO_MACRO, TTASK_MACRO>
withcotask::task<TCO_MACRO>
, we don't allow to custom id allocator now. - Replace
cotask::core::standard_int_id_allocator<uint64_t>
withcopp::util::uint64_id_allocator
, we don't allow to custom id allocator now. - Require gcc 4.7+, MSVC 14+(Visual Studio 2015)>)
- Require cmake 3.12.0 or upper
- [required] GCC or Clang or MSVC or clang-cl support ISO C++ 11 and upper
- [required] cmake 3.12.0 and upper
- [optional] gtest 1.6.0 and upper (Better unit test supported)
- [optional] Boost.Test (Boost.Test supported)
- [required] masm (in MSVC)
- [optional] if using gtest, pthread is required.
- Clone and setup vcpkg (See more detail on https://github.com/Microsoft/vcpkg)
git clone https://github.com/Microsoft/vcpkg.git cd vcpkg PS> bootstrap-vcpkg.bootstrap Linux:~/$ ./bootstrap-vcpkg.sh
- Install libcopp
PS> .\vcpkg install libcopp [--triplet x64-windows-static/x64-windows/x64-windows-static-md and etc...] Linux:~/$ ./vcpkg install libcopp
See :ref:`using with cmake <usage-using with-cmake>` for cmake below.
- Clone and make a build directory
git clone --single-branch --depth=1 -b master https://github.com/owt5008137/libcopp.git mkdir libcopp/build && cd libcopp/build
- Run cmake command
# cmake <libcopp dir> [options...] cmake .. -DPROJECT_ENABLE_UNITTEST=YES -DPROJECT_ENABLE_SAMPLE=YES
- Make libcopp
cmake --build . --config RelWithDebInfo # or make [options] when using Makefile
- Run
test/sample/benchmark
[optional] # Run test => Required: PROJECT_ENABLE_UNITTEST=YES cmake --build . --config RelWithDebInfo --target run_test # or make run_test when using Makefile # Run sample => Required: PROJECT_ENABLE_SAMPLE=YES cmake --build . --config RelWithDebInfo --target run_sample # or make run_sample when using Makefile # Run benchmark => Required: PROJECT_ENABLE_SAMPLE=YES cmake --build . --config RelWithDebInfo --target benchmark # or make benchmark when using Makefile
- Run
- Install [optional]
cmake --build . --config RelWithDebInfo --target install # or make install when using Makefile
Then just include and link
libcopp.*/libcotask.*
, or see :ref:`using with cmake <usage-using with-cmake>` for cmake below.
Options can be cmake options. such as set compile toolchains, source directory or options of libcopp that control build actions. libcopp options are listed below:
Option | Description |
---|---|
BUILD_SHARED_LIBS=YES|NO | [default=NO] Build dynamic library. |
LIBCOPP_ENABLE_SEGMENTED_STACKS=YES|NO | [default=NO] Enable split stack supported context.(it's only availabe in linux and gcc 4.7.0 or upper) |
LIBCOPP_ENABLE_VALGRIND=YES|NO | [default=YES] Enable valgrind supported context. |
PROJECT_ENABLE_UNITTEST=YES|NO | [default=NO] Build unit test. |
PROJECT_ENABLE_SAMPLE=YES|NO | [default=NO] Build samples. |
LIBCOPP_DISABLE_THIS_MT=YES|NO | [default=NO] Disable multi-thread support for copp::this_coroutine and cotask::this_task . |
LIBCOPP_DISABLE_ATOMIC_LOCK=YES|NO | [default=NO] Disable multi-thread support. |
LIBCOTASK_ENABLE=YES|NO | [default=YES] Enable build libcotask. |
LIBCOPP_FCONTEXT_USE_TSX=YES|NO | [default=YES] Enable Intel Transactional Synchronisation Extensions (TSX). |
GTEST_ROOT=[path] | set gtest library install prefix path |
BOOST_ROOT=[path] | set Boost.Test library install prefix path |
- Using
set(Libcopp_ROOT <where to find libcopp/INSTALL_PREFIX>)
- Just using find_package(Libcopp) to use libcopp module.
- Example:(we assume the target name is stored in
${CUSTOM_TARGET_NAME}
)
find_package(Libcopp CONFIG REQUIRED)
target_link_libraries(${CUSTOM_TARGET_NAME} libcopp::cotask)
# Or just using copp by target_link_libraries(${CUSTOM_TARGET_NAME} libcopp::copp)
If using MSVC and vcpkg, CRT must match the triplet of vcpkg, these codes below may be helpful:
if (MSVC AND VCPKG_TOOLCHAIN)
string(REGEX MATCH "^.*windows-static$" CHECK_VCPKG_TARGET_TRIPLET_RUNTIME ${VCPKG_TARGET_TRIPLET})
message(STATUS "CHECK_VCPKG_TARGET_TRIPLET_RUNTIME=${CHECK_VCPKG_TARGET_TRIPLET_RUNTIME}")
if(DEFINED ENV{VCPKG_DEFAULT_TRIPLET} AND NOT DEFINED VCPKG_TARGET_TRIPLET)
set(VCPKG_TARGET_TRIPLET "$ENV{VCPKG_DEFAULT_TRIPLET}" CACHE STRING "")
endif()
if (CHECK_VCPKG_TARGET_TRIPLET_RUNTIME)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>" CACHE STRING "")
else ()
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL" CACHE STRING "")
endif ()
endif ()
See more detail on https://github.com/Microsoft/vcpkg/tree/master/ports/libcopp .
Just include headers and linking library file of your platform to use libcopp.
LIBCOPP_PREFIX=<WHERE TO INSTALL libcopp>
# Example command for build sample with gcc 4.9 or upper on Linux
for source in sample_readme_*.cpp; do
g++ -std=c++14 -O2 -g -ggdb -Wall -Werror -fPIC -rdynamic -fdiagnostics-color=auto -Wno-unused-local-typedefs \
-I$LIBCOPP_PREFIX/include -L$LIBCOPP_PREFIX/lib64 -lcopp -lcotask $source -o $source.exe;
done
# Example command for build sample with clang 3.9 or upper and libc++ on Linux
for source in sample_readme_*.cpp; do
clang++ -std=c++17 -stdlib=libc++ -O2 -g -ggdb -Wall -Werror -fPIC -rdynamic \
-I$LIBCOPP_PREFIX/include -L$LIBCOPP_PREFIX/lib64 -lcopp -lcotask -lc++ -lc++abi \
$source -o $source.exe;
done
# AppleClang on macOS just like those scripts upper.
# If you are using MinGW on Windows, it's better to add -static-libstdc++ -static-libgcc to
# use static linking and other scripts are just like those on Linux.
# Example command for build sample with MSVC 1914 or upper on Windows & powershell(Debug Mode /MDd)
foreach ($source in Get-ChildItem -File -Name .\sample_readme_*.cpp) {
cl /nologo /MP /W4 /wd"4100" /wd"4125" /EHsc /std:c++17 /Zc:__cplusplus /O2 /MDd /I$LIBCOPP_PREFIX/include $LIBCOPP_PREFIX/lib64/copp.lib $LIBCOPP_PREFIX/lib64/cotask.lib $source
}
There serveral samples to use copp::coroutine_context
、 copp::coroutine_context_fiber
and cotask::task
:
- Using coroutine context
- Using coroutine task
- Using coroutine task manager
- Using stack pool
- Using
task::then
ortask::await_task
- Using
copp::future::future_t
and prepare for c++20 coroutine - Using c++20 coroutine
- Using c++20 coroutine with custom generator
- Custom error (timeout for example) when polling c++20 coroutine task or generator
- Let c++20 coroutine work with
cotask::task
- Using Windows fiber and
SetUnhandledExceptionFilter
on Windows withcotask::task
All sample codes can be found on :ref:`EXAMPLES <examples_doc_anchor>` and sample .
Split stack support: if in Linux and user gcc 4.7.0 or upper, add -DLIBCOPP_ENABLE_SEGMENTED_STACKS=YES
to use split stack supported context.
It's recommanded to use stack pool instead of gcc splited stack.
Please see CI output for latest benchmark report. Click to visit benchmark on Linux and macOS and benchmark on Windows . benchmark on Linux,macOS and Windows of dev branch can be found on Github Actions .
Q: How to enable c++20 coroutine
/std:c++latest /await
for MSVC or -std=c++20 -fcoroutines-ts -stdlib=libc++
for clang or -std=c++20 -fcoroutines
for gcc.Q: Will libcopp handle exception?
Q: Why SetUnhandledExceptionFilter
can not catch the unhandled exception in a coroutine?
SetUnhandledExceptionFilter
only works with Windows Fiber, please see sample/sample_readme_11.cpp for details.If you has any question, please create a issue and provide the information of your environments. For example:
- OS: Windows 10 Pro 19041 (This can be see after running ``msinfo32``) / Manjaro(Arch) Linux Linux 5.4.39-1-MANJARO
- Compiler: Visual Studio 2019 C++ 16.5.5 with VS 2019 C++ v14.25 or MSVC 1925/ gcc 9.3.0
- CMake Commands:
cmake .. -G "Visual Studio 16 2019" -A x64 -DLIBCOPP_FCONTEXT_USE_TSX=ON -DPROJECT_ENABLE_UNITTEST=ON -DPROJECT_ENABLE_SAMPLE=ON-DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=%cd%/install-prefix
/cmake .. -G Ninja -DLIBCOPP_FCONTEXT_USE_TSX=ON -DPROJECT_ENABLE_UNITTEST=ON -DPROJECT_ENABLE_SAMPLE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/opt/libcopp
- Compile Commands:
cmake --build . -j
- Related Environment Variables: Please provide all the environment variables which will change the cmake toolchain,
CC
、CXX
、AR
and etc.