endif() | endif() | ||||
message(STATUS "LIBRF_COMPILER_SETTING=${LIBRF_COMPILER_SETTING}") | message(STATUS "LIBRF_COMPILER_SETTING=${LIBRF_COMPILER_SETTING}") | ||||
message(STATUS "CMAKE_CXX_COMPILER_VERSION=${CMAKE_CXX_COMPILER_VERSION}") | |||||
message(STATUS "CMAKE_CXX_COMPILER_VERSION=${CMAKE_CXX_COMPILER_VERSION}") | |||||
if(${LIBRF_COMPILER_SETTING} STREQUAL "msvc") | if(${LIBRF_COMPILER_SETTING} STREQUAL "msvc") | ||||
if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL "19.30.0.0") | if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL "19.30.0.0") | ||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++20 /EHsc") #VS2022 | |||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++20 /EHsc /await") #VS2022 | |||||
else() | else() | ||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /EHsc /await") #VS2019 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /EHsc /await") #VS2019 | ||||
endif() | endif() | ||||
elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "clang_on_msvc") | elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "clang_on_msvc") | ||||
if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL "19.30.0.0") | |||||
if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL "12.0.0") | |||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++20 /EHsc") #VS2022 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++20 /EHsc") #VS2022 | ||||
else() | else() | ||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /EHsc") #VS2019 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /EHsc") #VS2019 | ||||
endif() | endif() | ||||
elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "clang") | elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "clang") | ||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++2a -fcoroutines-ts -stdlib=libc++") | |||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++2a -fcoroutines-ts -stdlib=libstdc++") | |||||
elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "gcc") | elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "gcc") | ||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++2a -fcoroutines -fconcepts-diagnostics-depth=8") | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++2a -fcoroutines -fconcepts-diagnostics-depth=8") | ||||
endif() | endif() |
Windows: 使用VS2017/VS2019编译(clang在兼容msvc模式下不支持异常,不再支持clang) | Windows: 使用VS2017/VS2019编译(clang在兼容msvc模式下不支持异常,不再支持clang) | ||||
Android: 使用NDK 20.1 自带的clang编译 | Android: 使用NDK 20.1 自带的clang编译 | ||||
Mac: 使用XCode 11.2.1 自带的apple-clang编译 | Mac: 使用XCode 11.2.1 自带的apple-clang编译 | ||||
Ubuntu: 使用GCC 10.0.1/clang 9 编译(2020-04-18:mutex ranged lock failed) | |||||
Ubuntu: 使用GCC 11.2/clang 14 编译(2020-04-18:mutex ranged lock failed) | |||||
注意:GCC 10.0.1在C++ Coroutines上存在很多BUG,并且缺少对应的头文件。 | |||||
当前阶段不推荐使用GCC。 | |||||
注意:GCC 10.0.1在C++ Coroutines上依然存在很多BUG。 | |||||
当前阶段不推荐使用GCC(version 11.2以下)。 | |||||
<br> | <br> | ||||
#include <thread> | #include <thread> | ||||
#include <cassert> | #include <cassert> | ||||
#if defined(__clang__) | |||||
#include "src/unix/coroutine.h" | |||||
#elif __cpp_impl_coroutine | |||||
#if __cpp_impl_coroutine | |||||
#include <coroutine> | #include <coroutine> | ||||
#ifdef _MSC_VER | #ifdef _MSC_VER | ||||
extern "C" size_t _coro_frame_size(); | extern "C" size_t _coro_frame_size(); | ||||
#pragma intrinsic(_coro_cancel) | #pragma intrinsic(_coro_cancel) | ||||
#pragma intrinsic(_coro_resume_block) | #pragma intrinsic(_coro_resume_block) | ||||
#endif | #endif | ||||
#elif defined(__clang__) | |||||
#include "src/unix/coroutine.h" | |||||
#else | #else | ||||
#include <experimental/coroutine> | #include <experimental/coroutine> | ||||
#endif | #endif |
, _value() | , _value() | ||||
{} | {} | ||||
read_awaiter(const read_awaiter&) = delete; | |||||
read_awaiter(read_awaiter&&) = default; | |||||
read_awaiter& operator=(const read_awaiter&) = delete; | |||||
read_awaiter& operator=(read_awaiter&&) = default; | |||||
~read_awaiter() | ~read_awaiter() | ||||
{//为了不在协程中也能正常使用 | {//为了不在协程中也能正常使用 | ||||
if (_channel != nullptr) | if (_channel != nullptr) | ||||
, _value(std::forward<U>(val)) | , _value(std::forward<U>(val)) | ||||
{} | {} | ||||
write_awaiter(const write_awaiter&) = delete; | |||||
write_awaiter(write_awaiter&&) = default; | |||||
write_awaiter& operator=(const write_awaiter&) = delete; | |||||
write_awaiter& operator=(write_awaiter&&) = default; | |||||
~write_awaiter() | ~write_awaiter() | ||||
{//为了不在协程中也能正常使用 | {//为了不在协程中也能正常使用 | ||||
if (_channel != nullptr) | if (_channel != nullptr) |
#pragma once | #pragma once | ||||
#include <memory> | |||||
namespace librf | namespace librf | ||||
{ | { |