Files
Michael Fabian 'Xaymar' Dirks d6e6ec96c4 windows: Rewrite onto IOCompletionPorts
IOCompletionPorts are the modern way to handle asynchronous IO without affected the system too much. Synchronization, work allocation and spreading, etc is all handled by the OS for us, which reduces the work we have to do in order to be NUMA aware. While this is far from perfect, it should perform better than a naive threaded approach.

ToDo:
- Add documentation generation
- Add Github Actions integration
- Write tests for everything.
- Update 'benchmark' sample to work again.
- Figure out a useful way to deal with connect/disconnect/error events.
- Figure out the broken pipe error, caused by an additional connected event where none should have been.
2020-06-22 00:43:06 +02:00

331 lines
8.7 KiB
CMake

# Low Latency IPC Library for high-speed traffic
# Copyright (C) 2019 Michael Fabian Dirks <info@xaymar.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#================================================================================#
# Define Project
#================================================================================#
cmake_minimum_required(VERSION 3.15.0)
# Automatic Versioning
set(VERSION_MAJOR 0)
set(VERSION_MINOR 1)
set(VERSION_PATCH 0)
set(VERSION_TWEAK 0)
set(VERSION_COMMIT "")
set(VERSION_SUFFIX "")
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git")
set(GIT_RESULT "")
set(GIT_OUTPUT "")
execute_process(
COMMAND git rev-list --count --topo-order ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}..HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
RESULT_VARIABLE GIT_RESULT
OUTPUT_VARIABLE GIT_OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET
)
if(GIT_RESULT EQUAL 0)
set(VERSION_TWEAK ${GIT_OUTPUT})
endif()
execute_process(
COMMAND git rev-parse HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
RESULT_VARIABLE GIT_RESULT
OUTPUT_VARIABLE GIT_OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET
)
if(GIT_RESULT EQUAL 0)
set(VERSION_COMMIT ${GIT_OUTPUT})
endif()
endif()
# Define Project
project(
DataPath
LANGUAGES CXX
VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}
)
set(PROJECT_FULL_NAME "DataPath IPC Library")
set(PROJECT_DESCRIPTION "High Performance Synchronous and Asynchronous IPC Library")
set(PROJECT_AUTHORS "Michael Fabian 'Xaymar' Dirks <info@xaymar.com>")
set(PROJECT_COPYRIGHT_YEARS "2018 - 2020")
#================================================================================#
# CMake Tools & Modules
#================================================================================#
# CMake Modules
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/clang")
include("util")
include("Clang")
# Detect Build Type
if(NOT "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
set(PropertyPrefix "${PROJECT_NAME}_")
else()
set(PropertyPrefix "")
endif()
# Detect Architecture
math(EXPR BITS "8*${CMAKE_SIZEOF_VOID_P}")
if("${BITS}" STREQUAL "32")
set(ARCH "x86")
else()
set(ARCH "x64")
endif()
#================================================================================#
# Options
#================================================================================#
# Static or Dynamic?
option(${PropertyPrefix}BUILD_SHARED "Create dynamically linked library instead of statically linked library." ON)
option(${PropertyPrefix}BUILD_SAMPLES "Build Samples" OFF)
#================================================================================#
# Sources
#================================================================================#
set(PROJECT_PUBLIC "")
set(PROJECT_PUBLIC_INCLUDES "")
set(PROJECT_PRIVATE "")
set(PROJECT_PRIVATE_INCLUDES "")
set(PROJECT_TEMPLATES "")
set(PROJECT_GENERATED "")
set(PROJECT_DATA "")
set(PROJECT_LIBRARIES "")
set(PROJECT_DEFINES "")
# Generic Source files
list(APPEND PROJECT_PUBLIC
"include/datapath/datapath.hpp"
"include/datapath/error.hpp"
"include/datapath/event.hpp"
"include/datapath/server.hpp"
"include/datapath/socket.hpp"
)
list(APPEND PROJECT_PUBLIC_INCLUDES
"${PROJECT_SOURCE_DIR}/include"
"${PROJECT_BINARY_DIR}/generated"
)
list(APPEND PROJECT_PRIVATE_INCLUDES
"${PROJECT_SOURCE_DIR}/include/datapath"
"${PROJECT_BINARY_DIR}/generated/datapath"
"${PROJECT_SOURCE_DIR}/source"
)
list(APPEND PROJECT_TEMPLATES
"cmake/config.hpp.in"
)
list(APPEND PROJECT_GENERATED
"${PROJECT_BINARY_DIR}/generated/datapath/config.hpp"
)
list(APPEND PROJECT_DATA
"README.md"
"LICENSE"
)
# Create config file.
set(GEN_VERSION_MAJOR ${VERSION_MAJOR})
set(GEN_VERSION_MINOR ${VERSION_MINOR})
set(GEN_VERSION_PATCH ${VERSION_PATCH})
set(GEN_VERSION_TWEAK ${VERSION_TWEAK})
set(GEN_VERSION_SUFFIX ${VERSION_SUFFIX})
set(GEN_VERSION_COMMIT ${VERSION_COMMIT})
if(BUILD_SHARED)
set(DATAPATH_SHARED_LIBRARY TRUE)
else()
set(DATAPATH_SHARED_LIBRARY FALSE)
endif()
configure_file(
"${PROJECT_SOURCE_DIR}/cmake/config.hpp.in"
"${PROJECT_BINARY_DIR}/generated/datapath/config.hpp"
@ONLY
)
# Platforms
if(WIN32)
# Windows
list(APPEND PROJECT_LIBRARIES
advapi32
)
list(APPEND PROJECT_DEFINES
_CRT_SECURE_NO_WARNINGS
WIN32_LEAN_AND_MEAN
NOGPICAPMASKS
NOVIRTUALKEYCODES
NOWINMESSAGES
NOWINSTYLES
NOSYSMETRICS
NOMENUS
NOICONS
NOKEYSTATES
NOSYSCOMMANDS
NORASTEROPS
NOSHOWWINDOW
NOATOM
NOCLIPBOARD
NOCOLOR
NOCTLMGR
NODRAWTEXT
NOGDI
NOKERNEL
#NOUSER
#NONLS
NOMB
NOMEMMGR
NOMETAFILE
NOMINMAX
NOMSG
NOOPENFILE
NOSCROLL
NOSERVICE
NOSOUND
NOTEXTMETRIC
NOWH
NOWINOFFSETS
NOCOMM
NOKANJI
NOHELP
NOPROFILER
NODEFERWINDOWPOS
NOMCX
NOIME
NOMDI
NOINOUT
)
list(APPEND PROJECT_PRIVATE
"source/windows/windows-overlapped.hpp"
"source/windows/windows-overlapped.cpp"
"source/windows/windows-socket.hpp"
"source/windows/windows-socket.cpp"
"source/windows/windows-client-socket.hpp"
"source/windows/windows-client-socket.cpp"
"source/windows/windows-server.hpp"
"source/windows/windows-server.cpp"
"source/windows/windows-server-socket.hpp"
"source/windows/windows-server-socket.cpp"
"source/windows/windows-utility.hpp"
)
elseif(APPLE)
# MacOSX
list(APPEND PROJECT_PRIVATE
)
elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
# Linux
list(APPEND PROJECT_PRIVATE
)
elseif("${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD")
# FreeBSD
list(APPEND PROJECT_PRIVATE
)
endif()
# Grouping
source_group(TREE "${PROJECT_SOURCE_DIR}" PREFIX "Data Files" FILES ${PROJECT_DATA})
source_group(TREE "${PROJECT_SOURCE_DIR}/cmake" PREFIX "Template Files" FILES ${PROJECT_TEMPLATES})
source_group(TREE "${PROJECT_BINARY_DIR}/generated" PREFIX "Generated Files" FILES ${PROJECT_GENERATED})
source_group(TREE "${PROJECT_SOURCE_DIR}/include" PREFIX "Public Files" FILES ${PROJECT_PUBLIC})
source_group(TREE "${PROJECT_SOURCE_DIR}/source" PREFIX "Private Files" FILES ${PROJECT_PRIVATE})
#================================================================================#
# Building
#================================================================================#
# Define the target
set(_BUILD_TYPE "STATIC")
if(${PropertyPrefix}BUILD_SHARED)
set(_BUILD_TYPE "SHARED")
if(MSVC)
list(APPEND PROJECT_DEFINES
"DATAPATH_INTERFACE=__declspec(dllexport)"
)
else()
list(APPEND PROJECT_DEFINES
"DATAPATH_INTERFACE=__attribute__((dllexport))"
)
endif()
else()
endif()
add_library(${PROJECT_NAME} ${_BUILD_TYPE}
${PROJECT_PUBLIC}
${PROJECT_PRIVATE}
${PROJECT_GENERATED}
${PROJECT_TEMPLATES}
${PROJECT_DATA}
)
target_include_directories(${PROJECT_NAME}
PUBLIC
${PROJECT_PUBLIC_INCLUDES}
PRIVATE
${PROJECT_PRIVATE_INCLUDES}
)
target_compile_definitions(${PROJECT_NAME}
PRIVATE ${PROJECT_DEFINES}
)
target_link_libraries(${PROJECT_NAME}
${PROJECT_LIBRARIES}
)
set_target_properties(
${PROJECT_NAME}
PROPERTIES
CXX_STANDARD 17
CXX_EXTENSIONS OFF
)
# File Version
if(WIN32)
set_target_properties(
${PROJECT_NAME}
PROPERTIES
VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK}
SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK}
)
elseif(UNIX AND NOT APPLE)
set_target_properties(
${PROJECT_NAME}
PROPERTIES
VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK}
SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK}
)
endif()
# Clang
if("${PropertyPrefix}" STREQUAL "")
clang_format(
TARGETS ${PROJECT_NAME}
DEPENDENCY
VERSION 9.0.0
)
endif()
#================================================================================#
# Samples
#================================================================================#
if(${PropertyPrefix}BUILD_TESTS)
add_subdirectory(tests)
endif()
if(${PropertyPrefix}BUILD_SAMPLES)
add_subdirectory(samples)
endif()