option(OPT_KEEP_REAL_SIZE "Keep real size in queue" OFF) | option(OPT_KEEP_REAL_SIZE "Keep real size in queue" OFF) | ||||
option(OPT_DISABLE_MULT_THREAD "Disable multi-threaded scheduler" OFF) | option(OPT_DISABLE_MULT_THREAD "Disable multi-threaded scheduler" OFF) | ||||
option(OPT_USE_MIMALLOC "Use mimalloc" OFF) | option(OPT_USE_MIMALLOC "Use mimalloc" OFF) | ||||
option(OPT_DYNAMIC_LIBRARY "Use shared library" OFF) | |||||
if (UNIX) | if (UNIX) | ||||
if(OPT_USE_MIMALLOC) | if(OPT_USE_MIMALLOC) | ||||
if(OPT_DISABLE_MULT_THREAD) | if(OPT_DISABLE_MULT_THREAD) | ||||
set(RESUMEF_DISABLE_MULT_THREAD 1) | set(RESUMEF_DISABLE_MULT_THREAD 1) | ||||
endif() | endif() | ||||
if(OPT_DYNAMIC_LIBRARY) | |||||
set(RESUMEF_USE_SHARD_LIBRARY 1) | |||||
add_compile_definitions("-DRESUMEF_DYNAMIC_EXPORTS=1") | |||||
endif() | |||||
configure_file( | configure_file( | ||||
${PROJECT_SOURCE_DIR}/config.h.in | ${PROJECT_SOURCE_DIR}/config.h.in | ||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) | set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) | ||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) | ||||
#add_library(librf SHARED ${SRC}) | |||||
add_library(librf STATIC ${SRC}) | |||||
if(OPT_DYNAMIC_LIBRARY) | |||||
add_library(librf SHARED ${SRC}) | |||||
else() | |||||
add_library(librf STATIC ${SRC}) | |||||
endif() | |||||
include_directories( | include_directories( |
# librf 2.9.10 | # librf 2.9.10 | ||||
### librf - 协程库 | ### librf - 协程库 | ||||
* librf是一个基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的非对称stackless协程库。 | |||||
* librf是一个基于C++20 coroutines编写的无栈协程库。 | |||||
支持以下平台和编译器: | 支持以下平台和编译器: | ||||
#if defined(__clang__) || defined(_MSC_VER) | #if defined(__clang__) || defined(_MSC_VER) | ||||
#cmakedefine RESUMEF_INLINE_STATE @RESUMEF_INLINE_STATE@ | #cmakedefine RESUMEF_INLINE_STATE @RESUMEF_INLINE_STATE@ | ||||
#else | #else | ||||
#cmakedefine RESUMEF_INLINE_STATE @RESUMEF_INLINE_STATE@ | |||||
#cmakedefine RESUMEF_INLINE_STATE 0 | |||||
#endif //defined(__clang__) || defined(_MSC_VER) | #endif //defined(__clang__) || defined(_MSC_VER) | ||||
#endif //RESUMEF_INLINE_STATE | #endif //RESUMEF_INLINE_STATE | ||||
#endif //RESUMEF_DISABLE_MULT_THREAD | #endif //RESUMEF_DISABLE_MULT_THREAD | ||||
#cmakedefine RESUMEF_USE_CUSTOM_SPINLOCK @RESUMEF_USE_CUSTOM_SPINLOCK@ | #cmakedefine RESUMEF_USE_CUSTOM_SPINLOCK @RESUMEF_USE_CUSTOM_SPINLOCK@ | ||||
#cmakedefine RESUMEF_USE_SHARD_LIBRARY @RESUMEF_USE_SHARD_LIBRARY@ |
#ifndef RESUMEF_INLINE_STATE | #ifndef RESUMEF_INLINE_STATE | ||||
#if defined(__clang__) || defined(_MSC_VER) | #if defined(__clang__) || defined(_MSC_VER) | ||||
/* #undef RESUMEF_INLINE_STATE */ | |||||
#define RESUMEF_INLINE_STATE 1 | |||||
#else | #else | ||||
/* #undef RESUMEF_INLINE_STATE */ | |||||
#define RESUMEF_INLINE_STATE 0 | |||||
#endif //defined(__clang__) || defined(_MSC_VER) | #endif //defined(__clang__) || defined(_MSC_VER) | ||||
#endif //RESUMEF_INLINE_STATE | #endif //RESUMEF_INLINE_STATE | ||||
#endif //RESUMEF_DISABLE_MULT_THREAD | #endif //RESUMEF_DISABLE_MULT_THREAD | ||||
/* #undef RESUMEF_USE_CUSTOM_SPINLOCK */ | /* #undef RESUMEF_USE_CUSTOM_SPINLOCK */ | ||||
/* #undef RESUMEF_USE_SHARD_LIBRARY */ |
#define unlikely(x) x | #define unlikely(x) x | ||||
#endif // unlikely | #endif // unlikely | ||||
#endif // defined(__clang__) || defined(__GNUC__) | #endif // defined(__clang__) || defined(__GNUC__) | ||||
#ifdef RESUMEF_USE_SHARD_LIBRARY | |||||
# if _WIN32 | |||||
# ifdef RESUMEF_DYNAMIC_EXPORTS | |||||
# define LIBRF_API __declspec(dllexport) | |||||
# else //RESUMEF_DYNAMIC_EXPORTS | |||||
# define LIBRF_API __declspec(dllimport) | |||||
# endif //RESUMEF_DYNAMIC_EXPORTS | |||||
# else //_WIN32 | |||||
# define LIBRF_API __attribute__((visibility("default"))) | |||||
# endif //_WIN32 | |||||
#else //RESUMEF_USE_SHARD_LIBRARY | |||||
# define LIBRF_API | |||||
#endif //RESUMEF_USE_SHARD_LIBRARY |
} | } | ||||
/* | |||||
using _Alloc_char = std::allocator<char>; | using _Alloc_char = std::allocator<char>; | ||||
void* operator new(size_t _Size); | void* operator new(size_t _Size); | ||||
void operator delete(void* _Ptr, size_t _Size); | void operator delete(void* _Ptr, size_t _Size); | ||||
*/ | |||||
#if !RESUMEF_INLINE_STATE | #if !RESUMEF_INLINE_STATE | ||||
private: | private: | ||||
counted_ptr<state_type> _state = state_future_t::_Alloc_state<state_type>(false); | counted_ptr<state_type> _state = state_future_t::_Alloc_state<state_type>(false); |
return get_state(); | return get_state(); | ||||
} | } | ||||
/* | |||||
template <typename _Ty> | template <typename _Ty> | ||||
void* promise_impl_t<_Ty>::operator new(size_t _Size) | void* promise_impl_t<_Ty>::operator new(size_t _Size) | ||||
{ | { | ||||
return _Al.deallocate(reinterpret_cast<char*>(_Ptr), _Size); | return _Al.deallocate(reinterpret_cast<char*>(_Ptr), _Size); | ||||
#endif | #endif | ||||
} | } | ||||
*/ | |||||
} | } | ||||