Browse Source

兼容clang on msvc

3.0.0
tearshark 2 years ago
parent
commit
629fcc609c

+ 8
- 1
CMakeLists.txt View File

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

+ 2
- 0
benchmark/benchmark_channel_passing_next.cpp View File

} }
} }


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

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

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

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

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

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



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



+ 2
- 2
tutorial/test_async_event.cpp View File

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;

+ 2
- 0
tutorial/test_async_mutex.cpp View File

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

+ 2
- 0
tutorial/test_async_switch_scheduler.cpp View File

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

Loading…
Cancel
Save