feat add event_bus #1

Merged
tqcq merged 19 commits from feat/support_event_bus into master 2024-04-02 12:41:20 +08:00
Showing only changes of commit 65a269bcc5 - Show all commits

View File

@ -7,71 +7,71 @@
# copies of the Software, and to permit persons to whom the Software is # copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions: # furnished to do so, subject to the following conditions:
# #
# The above copyright notice and this permission notice shall be included in # The above copyright notice and this permission notice shall be included in all
# all copies or substantial portions of the Software. # copies or substantial portions of the Software.
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# THE SOFTWARE. # SOFTWARE.
cmake_minimum_required(VERSION 3.1) cmake_minimum_required(VERSION 3.1)
project(Async++ C CXX) project(Async++ C CXX)
option(BUILD_SHARED_LIBS "Build Async++ as a shared library" ON) option(BUILD_SHARED_LIBS "Build Async++ as a shared library" OFF)
option(USE_CXX_EXCEPTIONS "Enable C++ exception support" ON) option(USE_CXX_EXCEPTIONS "Enable C++ exception support" ON)
if (APPLE) if(APPLE)
option(BUILD_FRAMEWORK "Build a Mac OS X framework instead of a library" OFF) option(BUILD_FRAMEWORK "Build a Mac OS X framework instead of a library" OFF)
if (BUILD_FRAMEWORK AND NOT BUILD_SHARED_LIBS) if(BUILD_FRAMEWORK AND NOT BUILD_SHARED_LIBS)
message(FATAL_ERROR "Can't build a framework with static libraries") message(FATAL_ERROR "Can't build a framework with static libraries")
endif() endif()
endif() endif()
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Add all source and header files so IDEs can see them # Add all source and header files so IDEs can see them
set(ASYNCXX_INCLUDE set(ASYNCXX_INCLUDE
${PROJECT_SOURCE_DIR}/include/async++/aligned_alloc.h ${PROJECT_SOURCE_DIR}/include/async++/aligned_alloc.h
${PROJECT_SOURCE_DIR}/include/async++/cancel.h ${PROJECT_SOURCE_DIR}/include/async++/cancel.h
${PROJECT_SOURCE_DIR}/include/async++/continuation_vector.h ${PROJECT_SOURCE_DIR}/include/async++/continuation_vector.h
${PROJECT_SOURCE_DIR}/include/async++/parallel_for.h ${PROJECT_SOURCE_DIR}/include/async++/parallel_for.h
${PROJECT_SOURCE_DIR}/include/async++/parallel_invoke.h ${PROJECT_SOURCE_DIR}/include/async++/parallel_invoke.h
${PROJECT_SOURCE_DIR}/include/async++/parallel_reduce.h ${PROJECT_SOURCE_DIR}/include/async++/parallel_reduce.h
${PROJECT_SOURCE_DIR}/include/async++/partitioner.h ${PROJECT_SOURCE_DIR}/include/async++/partitioner.h
${PROJECT_SOURCE_DIR}/include/async++/range.h ${PROJECT_SOURCE_DIR}/include/async++/range.h
${PROJECT_SOURCE_DIR}/include/async++/ref_count.h ${PROJECT_SOURCE_DIR}/include/async++/ref_count.h
${PROJECT_SOURCE_DIR}/include/async++/scheduler.h ${PROJECT_SOURCE_DIR}/include/async++/scheduler.h
${PROJECT_SOURCE_DIR}/include/async++/scheduler_fwd.h ${PROJECT_SOURCE_DIR}/include/async++/scheduler_fwd.h
${PROJECT_SOURCE_DIR}/include/async++/task.h ${PROJECT_SOURCE_DIR}/include/async++/task.h
${PROJECT_SOURCE_DIR}/include/async++/task_base.h ${PROJECT_SOURCE_DIR}/include/async++/task_base.h
${PROJECT_SOURCE_DIR}/include/async++/traits.h ${PROJECT_SOURCE_DIR}/include/async++/traits.h
${PROJECT_SOURCE_DIR}/include/async++/when_all_any.h ${PROJECT_SOURCE_DIR}/include/async++/when_all_any.h)
)
set(ASYNCXX_SRC set(ASYNCXX_SRC
${PROJECT_SOURCE_DIR}/src/internal.h ${PROJECT_SOURCE_DIR}/src/internal.h
${PROJECT_SOURCE_DIR}/src/fifo_queue.h ${PROJECT_SOURCE_DIR}/src/fifo_queue.h
${PROJECT_SOURCE_DIR}/src/scheduler.cpp ${PROJECT_SOURCE_DIR}/src/scheduler.cpp
${PROJECT_SOURCE_DIR}/src/singleton.h ${PROJECT_SOURCE_DIR}/src/singleton.h
${PROJECT_SOURCE_DIR}/src/task_wait_event.h ${PROJECT_SOURCE_DIR}/src/task_wait_event.h
${PROJECT_SOURCE_DIR}/src/threadpool_scheduler.cpp ${PROJECT_SOURCE_DIR}/src/threadpool_scheduler.cpp
${PROJECT_SOURCE_DIR}/src/work_steal_queue.h ${PROJECT_SOURCE_DIR}/src/work_steal_queue.h)
) source_group(include FILES ${PROJECT_SOURCE_DIR}/include/async++.h
source_group(include FILES ${PROJECT_SOURCE_DIR}/include/async++.h ${ASYNCXX_INCLUDE}) ${ASYNCXX_INCLUDE})
source_group(src FILES ${ASYNCXX_SRC}) source_group(src FILES ${ASYNCXX_SRC})
add_library(Async++ ${PROJECT_SOURCE_DIR}/include/async++.h ${ASYNCXX_INCLUDE} ${ASYNCXX_SRC}) add_library(Async++ ${PROJECT_SOURCE_DIR}/include/async++.h ${ASYNCXX_INCLUDE}
${ASYNCXX_SRC})
# Async++ only depends on the C++11 standard libraries, but some implementations # Async++ only depends on the C++11 standard libraries, but some implementations
# require the -pthread compiler flag to enable threading functionality. # require the -pthread compiler flag to enable threading functionality.
if (NOT MSVC) if(NOT MSVC)
target_compile_options(Async++ PRIVATE -std=c++11) target_compile_options(Async++ PRIVATE -std=c++11)
endif() endif()
if (APPLE) if(APPLE)
# Use libc++ on Mac because the shipped libstdc++ version is ancient # Use libc++ on Mac because the shipped libstdc++ version is ancient
target_compile_options(Async++ PRIVATE -stdlib=libc++) target_compile_options(Async++ PRIVATE -stdlib=libc++)
set_target_properties(Async++ PROPERTIES LINK_FLAGS -stdlib=libc++) set_target_properties(Async++ PROPERTIES LINK_FLAGS -stdlib=libc++)
endif() endif()
set(THREADS_PREFER_PTHREAD_FLAG ON) set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED) find_package(Threads REQUIRED)
@ -80,86 +80,90 @@ target_link_libraries(Async++ PUBLIC Threads::Threads)
# Set up preprocessor definitions # Set up preprocessor definitions
target_include_directories(Async++ PRIVATE ${PROJECT_SOURCE_DIR}/include) target_include_directories(Async++ PRIVATE ${PROJECT_SOURCE_DIR}/include)
set_target_properties(Async++ PROPERTIES DEFINE_SYMBOL LIBASYNC_BUILD) set_target_properties(Async++ PROPERTIES DEFINE_SYMBOL LIBASYNC_BUILD)
if (BUILD_SHARED_LIBS) if(BUILD_SHARED_LIBS)
# Minimize the set of symbols exported by libraries # Minimize the set of symbols exported by libraries
set_target_properties(Async++ PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN ON) set_target_properties(Async++ PROPERTIES CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN ON)
else() else()
target_compile_definitions(Async++ PUBLIC LIBASYNC_STATIC) target_compile_definitions(Async++ PUBLIC LIBASYNC_STATIC)
endif() endif()
# Enable warnings for strict C++ standard conformance # Enable warnings for strict C++ standard conformance
if (NOT MSVC) if(NOT MSVC)
target_compile_options(Async++ PRIVATE -Wall -Wextra -pedantic) target_compile_options(Async++ PRIVATE -Wall -Wextra -pedantic)
endif() endif()
# Async++ doesn't make use of RTTI information, so don't generate it. # Async++ doesn't make use of RTTI information, so don't generate it. There are
# There are issues on Apple platforms with exceptions and -fno-rtti, so keep it # issues on Apple platforms with exceptions and -fno-rtti, so keep it enabled
# enabled there. # there. See
# See https://stackoverflow.com/questions/21737201/problems-throwing-and-catching-exceptions-on-os-x-with-fno-rtti # https://stackoverflow.com/questions/21737201/problems-throwing-and-catching-exceptions-on-os-x-with-fno-rtti
if (MSVC) if(MSVC)
target_compile_options(Async++ PRIVATE /GR-) target_compile_options(Async++ PRIVATE /GR-)
elseif(NOT APPLE) elseif(NOT APPLE)
target_compile_options(Async++ PRIVATE -fno-rtti) target_compile_options(Async++ PRIVATE -fno-rtti)
endif() endif()
# Allow disabling exceptions, but warn the user about the consequences # Allow disabling exceptions, but warn the user about the consequences
if (NOT USE_CXX_EXCEPTIONS) if(NOT USE_CXX_EXCEPTIONS)
message(WARNING "Exceptions have been disabled. Any operation that would " message(
"throw an exception will result in a call to std::abort() instead.") WARNING "Exceptions have been disabled. Any operation that would "
target_compile_definitions(Async++ PUBLIC LIBASYNC_NO_EXCEPTIONS) "throw an exception will result in a call to std::abort() instead.")
if (MSVC) target_compile_definitions(Async++ PUBLIC LIBASYNC_NO_EXCEPTIONS)
target_compile_options(Async++ PUBLIC /EHs-c-) if(MSVC)
else() target_compile_options(Async++ PUBLIC /EHs-c-)
target_compile_options(Async++ PUBLIC -fno-exceptions) else()
endif() target_compile_options(Async++ PUBLIC -fno-exceptions)
endif()
endif() endif()
# /Zc:__cplusplus is required to make __cplusplus accurate # /Zc:__cplusplus is required to make __cplusplus accurate /Zc:__cplusplus is
# /Zc:__cplusplus is available starting with Visual Studio 2017 version 15.7 # available starting with Visual Studio 2017 version 15.7 (according to
# (according to https://docs.microsoft.com/en-us/cpp/build/reference/zc-cplusplus) # https://docs.microsoft.com/en-us/cpp/build/reference/zc-cplusplus) That
# That version is equivalent to _MSC_VER==1914 # version is equivalent to _MSC_VER==1914 (according to
# (according to https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2019) # https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2019)
# CMake's ${MSVC_VERSION} is equivalent to _MSC_VER # CMake's ${MSVC_VERSION} is equivalent to _MSC_VER (according to
# (according to https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html#variable:MSVC_VERSION) # https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html#variable:MSVC_VERSION)
# GREATER and EQUAL are used because GREATER_EQUAL is available starting with CMake 3.7 # GREATER and EQUAL are used because GREATER_EQUAL is available starting with
# (according to https://cmake.org/cmake/help/v3.7/release/3.7.html#commands) # CMake 3.7 (according to
if ((MSVC) AND ((MSVC_VERSION GREATER 1914) OR (MSVC_VERSION EQUAL 1914))) # https://cmake.org/cmake/help/v3.7/release/3.7.html#commands)
target_compile_options(Async++ PUBLIC /Zc:__cplusplus) if((MSVC) AND ((MSVC_VERSION GREATER 1914) OR (MSVC_VERSION EQUAL 1914)))
target_compile_options(Async++ PUBLIC /Zc:__cplusplus)
endif() endif()
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
configure_package_config_file("${CMAKE_CURRENT_LIST_DIR}/Async++Config.cmake.in" configure_package_config_file(
"${PROJECT_BINARY_DIR}/Async++Config.cmake" "${CMAKE_CURRENT_LIST_DIR}/Async++Config.cmake.in"
INSTALL_DESTINATION cmake "${PROJECT_BINARY_DIR}/Async++Config.cmake" INSTALL_DESTINATION cmake)
)
install(FILES "${PROJECT_BINARY_DIR}/Async++Config.cmake" install(FILES "${PROJECT_BINARY_DIR}/Async++Config.cmake" DESTINATION cmake)
DESTINATION cmake
)
# Install the library and produce a CMake export script # Install the library and produce a CMake export script
include(GNUInstallDirs) include(GNUInstallDirs)
install(TARGETS Async++ install(
EXPORT Async++ TARGETS Async++
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} EXPORT Async++
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
FRAMEWORK DESTINATION Frameworks ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
) FRAMEWORK DESTINATION Frameworks)
export(EXPORT Async++) export(EXPORT Async++)
install(EXPORT Async++ DESTINATION cmake) install(EXPORT Async++ DESTINATION cmake)
if (APPLE AND BUILD_FRAMEWORK) if(APPLE AND BUILD_FRAMEWORK)
set_target_properties(Async++ PROPERTIES OUTPUT_NAME Async++ FRAMEWORK ON) set_target_properties(Async++ PROPERTIES OUTPUT_NAME Async++ FRAMEWORK ON)
set_source_files_properties(${ASYNCXX_INCLUDE} PROPERTIES MACOSX_PACKAGE_LOCATION Headers/async++) set_source_files_properties(
set_source_files_properties(${PROJECT_SOURCE_DIR}/include/async++.h PROPERTIES MACOSX_PACKAGE_LOCATION Headers) ${ASYNCXX_INCLUDE} PROPERTIES MACOSX_PACKAGE_LOCATION Headers/async++)
set_source_files_properties(${PROJECT_SOURCE_DIR}/include/async++.h
PROPERTIES MACOSX_PACKAGE_LOCATION Headers)
else() else()
set_target_properties(Async++ PROPERTIES OUTPUT_NAME async++) set_target_properties(Async++ PROPERTIES OUTPUT_NAME async++)
target_include_directories(Async++ INTERFACE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) target_include_directories(
install(FILES ${PROJECT_SOURCE_DIR}/include/async++.h DESTINATION include) Async++ INTERFACE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
install(FILES ${ASYNCXX_INCLUDE} DESTINATION include/async++) $<INSTALL_INTERFACE:include>)
install(FILES ${PROJECT_SOURCE_DIR}/include/async++.h DESTINATION include)
install(FILES ${ASYNCXX_INCLUDE} DESTINATION include/async++)
endif() endif()
SET(CPACK_GENERATOR "DEB") set(CPACK_GENERATOR "DEB")
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "none") #required set(CPACK_DEBIAN_PACKAGE_MAINTAINER "none") # required
INCLUDE(CPack) include(CPack)