set(LIBRF_COMPILER_SETTING ) | set(LIBRF_COMPILER_SETTING ) | ||||
if(WIN32) | if(WIN32) | ||||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | ||||
set(LIBRF_COMPILER_SETTING "msvc") | |||||
set(LIBRF_COMPILER_SETTING "clang_on_msvc") | |||||
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | ||||
set(LIBRF_COMPILER_SETTING "msvc") | set(LIBRF_COMPILER_SETTING "msvc") | ||||
else() | else() | ||||
if(${LIBRF_COMPILER_SETTING} STREQUAL "msvc") | if(${LIBRF_COMPILER_SETTING} STREQUAL "msvc") | ||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /await /EHsc") | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /await /EHsc") | ||||
elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "clang_on_msvc") | |||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /EHsc") | |||||
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=libc++") | ||||
elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "gcc") | elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "gcc") | ||||
if(${LIBRF_COMPILER_SETTING} STREQUAL "msvc") | if(${LIBRF_COMPILER_SETTING} STREQUAL "msvc") | ||||
option(LIBRF_INLINE_STATE "Enable Inline state" OFF) | option(LIBRF_INLINE_STATE "Enable Inline state" OFF) | ||||
elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "clang_on_msvc") | |||||
option(LIBRF_INLINE_STATE "Enable Inline state" OFF) | |||||
elseif(${LIBRF_COMPILER_SETTING} STREQUAL "clang") | elseif(${LIBRF_COMPILER_SETTING} STREQUAL "clang") | ||||
option(LIBRF_INLINE_STATE "Enable Inline state" OFF) | option(LIBRF_INLINE_STATE "Enable Inline state" OFF) | ||||
elseif(${LIBRF_COMPILER_SETTING} STREQUAL "gcc") | elseif(${LIBRF_COMPILER_SETTING} STREQUAL "gcc") | ||||
if(${LIBRF_COMPILER_SETTING} STREQUAL "msvc") | if(${LIBRF_COMPILER_SETTING} STREQUAL "msvc") | ||||
set(CMAKE_CXX_FLAGS_MINSIZEREL "/W3 /WX /MP /GS- /Gm- /Ox /Ob2 /Oy /Oi /Os /GT /EHsc /Zc:inline") | set(CMAKE_CXX_FLAGS_MINSIZEREL "/W3 /WX /MP /GS- /Gm- /Ox /Ob2 /Oy /Oi /Os /GT /EHsc /Zc:inline") | ||||
set(CMAKE_CXX_FLAGS_RELEASE "/W3 /WX /MP /GS- /Gm- /Ox /Ob2 /Oy /Oi /Os /GT /EHsc /Zc:inline") | set(CMAKE_CXX_FLAGS_RELEASE "/W3 /WX /MP /GS- /Gm- /Ox /Ob2 /Oy /Oi /Os /GT /EHsc /Zc:inline") | ||||
elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "clang_on_msvc") | |||||
set(CMAKE_CXX_FLAGS_MINSIZEREL "/W3 /WX /GS- /Ox /Ob2 /Oy /Oi /Os /EHsc /Zc:inline") | |||||
set(CMAKE_CXX_FLAGS_RELEASE "/W3 /WX /GS- /Ox /Ob2 /Oy /Oi /Os /EHsc /Zc:inline") | |||||
elseif() | elseif() | ||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug") | if(CMAKE_BUILD_TYPE STREQUAL "Debug") | ||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -ggdb") | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -ggdb") |
} | } | ||||
} | } | ||||
#if defined(__GNUC__) | |||||
static future_t<> passing_loop_all(channel_t<intptr_t> head, channel_t<intptr_t> tail) | static future_t<> passing_loop_all(channel_t<intptr_t> head, channel_t<intptr_t> tail) | ||||
{ | { | ||||
for (int i = 0; i < LoopCount; ++i) | for (int i = 0; i < LoopCount; ++i) | ||||
std::cout << value << " cost time " << dt << "s" << std::endl; | std::cout << value << " cost time " << dt << "s" << std::endl; | ||||
} | } | ||||
} | } | ||||
#endif | |||||
void benchmark_main_channel_passing_next() | void benchmark_main_channel_passing_next() | ||||
{ | { |
#include <thread> | #include <thread> | ||||
#include <cassert> | #include <cassert> | ||||
#ifdef __cpp_impl_coroutine | |||||
#if defined(__clang__) | |||||
#include "src/unix/coroutine.h" | |||||
#elif __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(); |
{ | { | ||||
using experimental::coroutine_traits; | using experimental::coroutine_traits; | ||||
using experimental::coroutine_handle; | using experimental::coroutine_handle; | ||||
using experimental::suspend_if; | |||||
//using experimental::suspend_if; | |||||
using experimental::suspend_always; | using experimental::suspend_always; | ||||
using experimental::suspend_never; | using experimental::suspend_never; | ||||
} | } |
template<class _Node, class _Nodeptr> | template<class _Node, class _Nodeptr> | ||||
intrusive_link_queue<_Node, _Nodeptr>::intrusive_link_queue() | intrusive_link_queue<_Node, _Nodeptr>::intrusive_link_queue() | ||||
: _header(nullptr) | |||||
, _tailer(nullptr) | |||||
#ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE | #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE | ||||
, _count(0) | |||||
: _count(0) | |||||
#endif | #endif | ||||
, _header(nullptr) | |||||
, _tailer(nullptr) | |||||
{ | { | ||||
} | } | ||||
test_wait_three(); | test_wait_three(); | ||||
std::cout << std::endl; | std::cout << std::endl; | ||||
//test_wait_any(); | |||||
//std::cout << std::endl; | |||||
test_wait_any(); | |||||
std::cout << std::endl; | |||||
test_wait_all(); | test_wait_all(); | ||||
std::cout << std::endl; | std::cout << std::endl; |
} | } | ||||
} | } | ||||
#ifndef __clang__ | |||||
//🔒-50ms-🗝-50ms-🔒-50ms-🗝-50ms-| | //🔒-50ms-🗝-50ms-🔒-50ms-🗝-50ms-| | ||||
//---------........---------....... | //---------........---------....... | ||||
//方法之一 | //方法之一 | ||||
co_await 50ms; | co_await 50ms; | ||||
} | } | ||||
} | } | ||||
#endif | |||||
static future_t<> test_mutex_timeout_push(size_t idx) | static future_t<> test_mutex_timeout_push(size_t idx) | ||||
{ | { |
(void)c_done.write(true); | (void)c_done.write(true); | ||||
} | } | ||||
#if defined(__GNUC__) | |||||
static future_t<> resumable_main_switch_scheduler_fix_gcc_bugs(std::thread & other, channel_t<bool> c_done) | static future_t<> resumable_main_switch_scheduler_fix_gcc_bugs(std::thread & other, channel_t<bool> c_done) | ||||
{ | { | ||||
co_await c_done; //第一次等待,等待run_in_thread准备好了 | co_await c_done; //第一次等待,等待run_in_thread准备好了 | ||||
//co_await resumable_get_long(3, c_done); | //co_await resumable_get_long(3, c_done); | ||||
co_await c_done; //等待新的协程运行完毕,从而保证主线程的协程不会提早退出 | co_await c_done; //等待新的协程运行完毕,从而保证主线程的协程不会提早退出 | ||||
} | } | ||||
#endif | |||||
void resumable_main_switch_scheduler() | void resumable_main_switch_scheduler() | ||||
{ | { |