Browse Source

兼容clang on msvc

3.0.0
tearshark 2 years ago
parent
commit
629fcc609c

+ 8
- 1
CMakeLists.txt View File

@@ -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")

+ 2
- 0
benchmark/benchmark_channel_passing_next.cpp View File

@@ -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()
{

+ 3
- 1
include/librf/librf.h View File

@@ -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();

+ 1
- 1
include/librf/src/def.h View File

@@ -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;
}

+ 3
- 3
include/librf/src/intrusive_link_queue.h View File

@@ -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)
{
}


+ 2
- 2
tutorial/test_async_event.cpp View File

@@ -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;

+ 2
- 0
tutorial/test_async_mutex.cpp View File

@@ -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)
{

+ 2
- 0
tutorial/test_async_switch_scheduler.cpp View File

@@ -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()
{

Loading…
Cancel
Save