@@ -7,7 +7,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED true) | |||
set(LIBRF_COMPILER_SETTING ) | |||
if(WIN32) | |||
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") | |||
set(LIBRF_COMPILER_SETTING "msvc") | |||
else() | |||
@@ -33,6 +33,8 @@ message(STATUS "LIBRF_COMPILER_SETTING=${LIBRF_COMPILER_SETTING}") | |||
if(${LIBRF_COMPILER_SETTING} STREQUAL "msvc") | |||
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") | |||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++2a -fcoroutines-ts -stdlib=libc++") | |||
elseif ("${LIBRF_COMPILER_SETTING}" STREQUAL "gcc") | |||
@@ -42,6 +44,8 @@ endif() | |||
if(${LIBRF_COMPILER_SETTING} STREQUAL "msvc") | |||
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") | |||
option(LIBRF_INLINE_STATE "Enable Inline state" OFF) | |||
elseif(${LIBRF_COMPILER_SETTING} STREQUAL "gcc") | |||
@@ -68,6 +72,9 @@ endif() | |||
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_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() | |||
if(CMAKE_BUILD_TYPE STREQUAL "Debug") | |||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -ggdb") |
@@ -26,6 +26,7 @@ static future_t<> passing_next(channel_t<intptr_t> rd, channel_t<intptr_t> wr) | |||
} | |||
} | |||
#if defined(__GNUC__) | |||
static future_t<> passing_loop_all(channel_t<intptr_t> head, channel_t<intptr_t> tail) | |||
{ | |||
for (int i = 0; i < LoopCount; ++i) | |||
@@ -39,6 +40,7 @@ static future_t<> passing_loop_all(channel_t<intptr_t> head, channel_t<intptr_t> | |||
std::cout << value << " cost time " << dt << "s" << std::endl; | |||
} | |||
} | |||
#endif | |||
void benchmark_main_channel_passing_next() | |||
{ |
@@ -34,7 +34,9 @@ | |||
#include <thread> | |||
#include <cassert> | |||
#ifdef __cpp_impl_coroutine | |||
#if defined(__clang__) | |||
#include "src/unix/coroutine.h" | |||
#elif __cpp_impl_coroutine | |||
#include <coroutine> | |||
#ifdef _MSC_VER | |||
extern "C" size_t _coro_frame_size(); |
@@ -7,7 +7,7 @@ namespace std | |||
{ | |||
using experimental::coroutine_traits; | |||
using experimental::coroutine_handle; | |||
using experimental::suspend_if; | |||
//using experimental::suspend_if; | |||
using experimental::suspend_always; | |||
using experimental::suspend_never; | |||
} |
@@ -44,11 +44,11 @@ namespace librf | |||
template<class _Node, class _Nodeptr> | |||
intrusive_link_queue<_Node, _Nodeptr>::intrusive_link_queue() | |||
: _header(nullptr) | |||
, _tailer(nullptr) | |||
#ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE | |||
, _count(0) | |||
: _count(0) | |||
#endif | |||
, _header(nullptr) | |||
, _tailer(nullptr) | |||
{ | |||
} | |||
@@ -185,8 +185,8 @@ void resumable_main_event() | |||
test_wait_three(); | |||
std::cout << std::endl; | |||
//test_wait_any(); | |||
//std::cout << std::endl; | |||
test_wait_any(); | |||
std::cout << std::endl; | |||
test_wait_all(); | |||
std::cout << std::endl; |
@@ -37,6 +37,7 @@ static future_t<> test_mutex_pop(size_t idx) | |||
} | |||
} | |||
#ifndef __clang__ | |||
//🔒-50ms-🗝-50ms-🔒-50ms-🗝-50ms-| | |||
//---------........---------....... | |||
//方法之一 | |||
@@ -77,6 +78,7 @@ static future_t<> test_mutex_try_push(size_t idx) | |||
co_await 50ms; | |||
} | |||
} | |||
#endif | |||
static future_t<> test_mutex_timeout_push(size_t idx) | |||
{ |
@@ -88,6 +88,7 @@ static future_t<> resumable_get_long_switch_scheduler(int64_t val, channel_t<boo | |||
(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) | |||
{ | |||
co_await c_done; //第一次等待,等待run_in_thread准备好了 | |||
@@ -99,6 +100,7 @@ static future_t<> resumable_main_switch_scheduler_fix_gcc_bugs(std::thread & oth | |||
//co_await resumable_get_long(3, c_done); | |||
co_await c_done; //等待新的协程运行完毕,从而保证主线程的协程不会提早退出 | |||
} | |||
#endif | |||
void resumable_main_switch_scheduler() | |||
{ |