elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | ||||
set(CMAKE_CXX_FLAGS "/std:c++latest /await /EHsc") | set(CMAKE_CXX_FLAGS "/std:c++latest /await /EHsc") | ||||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | ||||
set(CMAKE_CXX_FLAGS "-std=c++2a -fcoroutines -pthread") | |||||
set(CMAKE_CXX_FLAGS "-std=c++2a -fcoroutines") | |||||
endif() | |||||
if (UNIX) | |||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") | |||||
endif() | |||||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | |||||
set(CMAKE_CXX_FLAGS_MINSIZEREL "/W4 /GS- /Gm- /Ox /Ob2 /Oy /Oi /Os /GT /EHsc /Zc:inline") | |||||
set(CMAKE_CXX_FLAGS_RELEASE "/W4 /GS- /Gm- /Ox /Ob2 /Oy /Oi /Os /GT /EHsc /Zc:inline") | |||||
else() | |||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug") | if(CMAKE_BUILD_TYPE STREQUAL "Debug") | ||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g -ggdb") | |||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -ggdb") | |||||
else() | else() | ||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") | |||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -DNDEBUG") | |||||
endif() | endif() | ||||
endif() | endif() | ||||
message(STATUS "C++ flags: ${CMAKE_CXX_FLAGS}") | message(STATUS "C++ flags: ${CMAKE_CXX_FLAGS}") | ||||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") |
(void)argc; | (void)argc; | ||||
(void)argv; | (void)argv; | ||||
resumable_main_mutex(); | |||||
return 0; | |||||
//resumable_main_mutex(); | |||||
//return 0; | |||||
//if (argc > 1) | //if (argc > 1) | ||||
// resumable_main_benchmark_asio_client(atoi(argv[1])); | // resumable_main_benchmark_asio_client(atoi(argv[1])); |
for (int i = 0; i < 100; ++i) | for (int i = 0; i < 100; ++i) | ||||
{ | { | ||||
co_await(head << 0); | co_await(head << 0); | ||||
intptr_t value = co_await tail; | |||||
co_await tail; | |||||
} | } | ||||
} | } | ||||
#endif | #endif | ||||
template<class... _Mtxs> | template<class... _Mtxs> | ||||
static future_t<> gcc_bugs_nameless_args(adopt_manual_unlock_t | |||||
static future_t<> gcc_bugs_nameless_args(adopt_manual_unlock_t | |||||
#if GCC_FIX_BUGS | #if GCC_FIX_BUGS | ||||
nameless | nameless | ||||
#endif | #endif | ||||
#if GCC_FIX_BUGS | #if GCC_FIX_BUGS | ||||
(void)nameless; | (void)nameless; | ||||
#endif | #endif | ||||
mutex_t::_MutexAwaitAssembleT _MAA{ root_state(), mtxs... }; | |||||
co_await detail::mutex_lock_await_lock_impl::_Lock_range(_MAA); | |||||
co_await mutex_t::lock(adopt_manual_unlock, mtxs...); | |||||
} //internal compiler error: Segmentation fault | } //internal compiler error: Segmentation fault | ||||
mutex_t a, b, c; | mutex_t a, b, c; | ||||
go gcc_bugs_nameless_args(adopt_manual_unlock, a, b, c); | go gcc_bugs_nameless_args(adopt_manual_unlock, a, b, c); | ||||
} | |||||
} |
assert(c.is_locked()); | assert(c.is_locked()); | ||||
++g_counter; | ++g_counter; | ||||
std::cout << "push:" << g_counter << " on " << idx << std::endl; | |||||
co_await 5ms; | |||||
//std::cout << "push:" << g_counter << " on " << idx << std::endl; | |||||
//co_await 5ms; | |||||
} | } | ||||
} | } | ||||
assert(c.is_locked()); | assert(c.is_locked()); | ||||
--g_counter; | --g_counter; | ||||
std::cout << "pop :" << g_counter << " on " << idx << std::endl; | |||||
co_await 5ms; | |||||
//std::cout << "pop :" << g_counter << " on " << idx << std::endl; | |||||
//co_await 5ms; | |||||
} | } | ||||
} | } | ||||