Commit 623f7571 authored by Dominik Charousset's avatar Dominik Charousset

Fix build with default visibility hidden

parent bac7c902
...@@ -22,6 +22,36 @@ else() ...@@ -22,6 +22,36 @@ else()
endif() endif()
unset(_parent) unset(_parent)
# enable tests if not disabled
if(NOT CAF_NO_UNIT_TESTS)
enable_testing()
function(add_test_suites executable dir)
# enumerate all test suites.
set(suites "")
foreach(cpp_file ${ARGN})
file(STRINGS "${dir}/${cpp_file}" contents)
foreach(line ${contents})
if ("${line}" MATCHES "SUITE (.+)")
string(REGEX REPLACE ".*SUITE (.+)" "\\1" suite ${line})
list(APPEND suites "${suite}")
endif()
endforeach()
endforeach()
list(REMOVE_DUPLICATES suites)
list(LENGTH suites num_suites)
message(STATUS "Found ${num_suites} test suite for ${executable}")
# creates one CMake test per test suite.
macro (make_test suite)
string(REPLACE " " "_" test_name ${suite})
add_test(NAME ${test_name} COMMAND ${executable} -r300 -n -v5 -s"^${suite}$")
endmacro ()
list(LENGTH suites num_suites)
foreach(suite ${suites})
make_test("${suite}")
endforeach ()
endfunction()
endif()
# -- make sure we have at least C++17 available -------------------------------- # -- make sure we have at least C++17 available --------------------------------
if(NOT CMAKE_CROSSCOMPILING) if(NOT CMAKE_CROSSCOMPILING)
...@@ -426,51 +456,32 @@ add_custom_command(TARGET uninstall ...@@ -426,51 +456,32 @@ add_custom_command(TARGET uninstall
COMMAND "${CMAKE_COMMAND}" -P COMMAND "${CMAKE_COMMAND}" -P
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
################################################################################ # -- generate build config header ----------------------------------------------
# set inclue paths for subprojects #
################################################################################ configure_file("${PROJECT_SOURCE_DIR}/cmake/build_config.hpp.in"
"${CMAKE_BINARY_DIR}/caf/detail/build_config.hpp"
@ONLY)
# -- set include paths for all subprojects -------------------------------------
# path to caf core & io headers include_directories("${CMAKE_BINARY_DIR}"
set(LIBCAF_INCLUDE_DIRS
"${CMAKE_CURRENT_SOURCE_DIR}/libcaf_core" "${CMAKE_CURRENT_SOURCE_DIR}/libcaf_core"
"${CMAKE_CURRENT_SOURCE_DIR}/libcaf_io" "${CMAKE_CURRENT_SOURCE_DIR}/libcaf_io"
"${CMAKE_CURRENT_SOURCE_DIR}/libcaf_test") "${CMAKE_CURRENT_SOURCE_DIR}/libcaf_test"
# enable tests if not disabled "${CMAKE_CURRENT_SOURCE_DIR}/libcaf_openssl")
if(NOT CAF_NO_UNIT_TESTS)
enable_testing()
macro(add_unit_tests globstr)
file(GLOB_RECURSE tests "${globstr}")
set(CAF_ALL_UNIT_TESTS ${CAF_ALL_UNIT_TESTS} ${tests})
endmacro()
else()
macro(add_unit_tests globstr)
# do nothing (unit tests disabled)
endmacro()
endif()
# all projects need the headers of the core components
include_directories("${LIBCAF_INCLUDE_DIRS}")
################################################################################ ################################################################################
# add targets # # add targets #
################################################################################ ################################################################################
macro(add_caf_lib name)
set(full_name libcaf_${name})
add_subdirectory(${full_name})
add_unit_tests("${full_name}/test/*.cpp")
# add headers to include directories so other subprojects can use them
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/${full_name}")
endmacro()
macro(add_optional_caf_lib name) macro(add_optional_caf_lib name)
string(TOUPPER ${name} upper_name) string(TOUPPER ${name} upper_name)
set(flag_varname CAF_NO_${upper_name}) set(flag_varname CAF_NO_${upper_name})
if(NOT ${flag_varname} if(NOT ${flag_varname}
AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libcaf_${name}/CMakeLists.txt") AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libcaf_${name}/CMakeLists.txt")
add_caf_lib(${name}) add_subdirectory("libcaf_${name}")
else() else()
set(${flag_name} yes) set(${flag_varname} yes)
endif() endif()
endmacro() endmacro()
...@@ -500,7 +511,7 @@ macro(add_optional_caf_binaries name) ...@@ -500,7 +511,7 @@ macro(add_optional_caf_binaries name)
endmacro() endmacro()
# build core and I/O library # build core and I/O library
add_caf_lib(core) add_subdirectory(libcaf_core)
add_optional_caf_lib(io) add_optional_caf_lib(io)
# build SSL module if OpenSSL library is available # build SSL module if OpenSSL library is available
...@@ -572,48 +583,6 @@ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/CAFConfig.cmake" ...@@ -572,48 +583,6 @@ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/CAFConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/CAFConfigVersion.cmake" "${CMAKE_CURRENT_BINARY_DIR}/CAFConfigVersion.cmake"
DESTINATION "${INSTALL_CAF_CMAKEDIR}") DESTINATION "${INSTALL_CAF_CMAKEDIR}")
################################################################################
# unit tests setup #
################################################################################
if(NOT CAF_NO_UNIT_TESTS)
# setup unit test binary
add_executable(caf-test
libcaf_test/src/caf-test.cpp
libcaf_test/caf/test/unit_test.hpp
libcaf_test/caf/test/unit_test_impl.hpp
${CAF_ALL_UNIT_TESTS})
target_link_libraries(caf-test
${CAF_EXTRA_LDFLAGS}
${CAF_LIBRARIES}
${PTHREAD_LIBRARIES})
add_custom_target(all_unit_tests)
add_dependencies(caf-test all_unit_tests)
# enumerate all test suites.
foreach(test ${CAF_ALL_UNIT_TESTS})
file(STRINGS ${test} contents)
foreach(line ${contents})
if ("${line}" MATCHES "CAF_SUITE (.*)")
string(REGEX REPLACE ".* CAF_SUITE (.*)" "\\1" suite ${line})
list(APPEND suites ${suite})
endif()
endforeach()
endforeach()
list(REMOVE_DUPLICATES suites)
# creates one CMake test per test suite.
macro (make_test suite)
string(REPLACE " " "_" test_name ${suite})
set(caf_test ${EXECUTABLE_OUTPUT_PATH}/caf-test)
add_test(${test_name} ${caf_test} -r 300 -n -v 5 -s "${suite}" ${ARGN})
endmacro ()
list(LENGTH suites num_suites)
message(STATUS "Found ${num_suites} test suites")
foreach(suite ${suites})
make_test("${suite}")
endforeach ()
endif()
# -- Fetch branch name and SHA if available ------------------------------------ # -- Fetch branch name and SHA if available ------------------------------------
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/release.txt") if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/release.txt")
...@@ -627,7 +596,9 @@ message(STATUS "Set release version for all documentation to ${CAF_RELEASE}.") ...@@ -627,7 +596,9 @@ message(STATUS "Set release version for all documentation to ${CAF_RELEASE}.")
# -- Setup for building manual and API documentation --------------------------- # -- Setup for building manual and API documentation ---------------------------
add_subdirectory(doc) if(NOT WIN32)
add_subdirectory(doc)
endif()
################################################################################ ################################################################################
# Add additional project files to GUI # # Add additional project files to GUI #
......
# -- get header files for creating "proper" XCode projects --------------------- # -- get header files for creating "proper" XCode projects ---------------------
file(GLOB_RECURSE LIBCAF_CORE_HDRS "caf/*.hpp") file(GLOB_RECURSE CAF_CORE_HEADERS "caf/*.hpp")
# -- auto generate to_string for enum types ------------------------------------ # -- auto generate to_string for enum types ------------------------------------
...@@ -13,9 +13,9 @@ enum_to_string("caf/pec.hpp" "pec_strings.cpp") ...@@ -13,9 +13,9 @@ enum_to_string("caf/pec.hpp" "pec_strings.cpp")
enum_to_string("caf/sec.hpp" "sec_strings.cpp") enum_to_string("caf/sec.hpp" "sec_strings.cpp")
enum_to_string("caf/stream_priority.hpp" "stream_priority_strings.cpp") enum_to_string("caf/stream_priority.hpp" "stream_priority_strings.cpp")
# -- list cpp files ------------------------------------------------------------ # -- list cpp files for libcaf_core --------------------------------------------
set(LIBCAF_CORE_SRCS set(CAF_CORE_SOURCES
"${CMAKE_CURRENT_BINARY_DIR}/exit_reason_strings.cpp" "${CMAKE_CURRENT_BINARY_DIR}/exit_reason_strings.cpp"
"${CMAKE_CURRENT_BINARY_DIR}/inbox_result_strings.cpp" "${CMAKE_CURRENT_BINARY_DIR}/inbox_result_strings.cpp"
"${CMAKE_CURRENT_BINARY_DIR}/invoke_msg_result_strings.cpp" "${CMAKE_CURRENT_BINARY_DIR}/invoke_msg_result_strings.cpp"
...@@ -157,37 +157,140 @@ set(LIBCAF_CORE_SRCS ...@@ -157,37 +157,140 @@ set(LIBCAF_CORE_SRCS
src/uri_builder.cpp src/uri_builder.cpp
) )
# -- generate build config header ---------------------------------------------- # -- list cpp files for caf-core-test ------------------------------------------
configure_file("${PROJECT_SOURCE_DIR}/cmake/build_config.hpp.in" set(CAF_CORE_TEST_SOURCES
"${CMAKE_CURRENT_BINARY_DIR}/caf/detail/build_config.hpp" test/actor_clock.cpp
@ONLY) test/actor_factory.cpp
test/actor_lifetime.cpp
test/actor_pool.cpp
test/actor_profiler.cpp
test/actor_registry.cpp
test/actor_system_config.cpp
test/actor_termination.cpp
test/aout.cpp
test/atom.cpp
test/behavior.cpp
test/blocking_actor.cpp
test/broadcast_downstream_manager.cpp
test/byte.cpp
test/composable_behavior.cpp
test/composition.cpp
test/config_option.cpp
test/config_option_set.cpp
test/config_value.cpp
test/config_value_adaptor.cpp
test/constructor_attach.cpp
test/continuous_streaming.cpp
test/cow_tuple.cpp
test/custom_exception_handler.cpp
test/decorator/sequencer.cpp
test/decorator/splitter.cpp
test/deep_to_string.cpp
test/detached_actors.cpp
test/detail/bounds_checker.cpp
test/detail/ini_consumer.cpp
test/detail/limited_vector.cpp
test/detail/parse.cpp
test/detail/parser/read_atom.cpp
test/detail/parser/read_bool.cpp
test/detail/parser/read_floating_point.cpp
test/detail/parser/read_ini.cpp
test/detail/parser/read_number.cpp
test/detail/parser/read_number_or_timespan.cpp
test/detail/parser/read_signed_integer.cpp
test/detail/parser/read_string.cpp
test/detail/parser/read_timespan.cpp
test/detail/parser/read_unsigned_integer.cpp
test/detail/ringbuffer.cpp
test/detail/ripemd_160.cpp
test/detail/serialized_size.cpp
test/detail/tick_emitter.cpp
test/detail/unique_function.cpp
test/detail/unordered_flat_map.cpp
test/dictionary.cpp
test/dynamic_spawn.cpp
test/expected.cpp
test/extract.cpp
test/function_view.cpp
test/fused_downstream_manager.cpp
test/handles.cpp
test/inbound_path.cpp
test/inspector.cpp
test/intrusive/drr_cached_queue.cpp
test/intrusive/drr_queue.cpp
test/intrusive/fifo_inbox.cpp
test/intrusive/lifo_inbox.cpp
test/intrusive/task_queue.cpp
test/intrusive/wdrr_dynamic_multiplexed_queue.cpp
test/intrusive/wdrr_fixed_multiplexed_queue.cpp
test/intrusive_ptr.cpp
test/ipv4_address.cpp
test/ipv4_endpoint.cpp
test/ipv4_subnet.cpp
test/ipv6_address.cpp
test/ipv6_endpoint.cpp
test/ipv6_subnet.cpp
test/local_group.cpp
test/local_migration.cpp
test/logger.cpp
test/mailbox_element.cpp
test/make_config_value_field.cpp
test/match.cpp
test/message.cpp
test/message_id.cpp
test/message_lifetime.cpp
test/metaprogramming.cpp
test/mixin/requester.cpp
test/mixin/sender.cpp
test/mock_streaming_classes.cpp
test/native_streaming_classes.cpp
test/optional.cpp
test/or_else.cpp
test/pipeline_streaming.cpp
test/policy/categorized.cpp
test/request_timeout.cpp
test/result.cpp
test/rtti_pair.cpp
test/runtime_settings_map.cpp
test/selective_streaming.cpp
test/serial_reply.cpp
test/serialization.cpp
test/serializer_impl.cpp
test/settings.cpp
test/simple_timeout.cpp
test/span.cpp
test/stateful_actor.cpp
test/streambuf.cpp
test/string_algorithms.cpp
test/string_view.cpp
test/sum_type.cpp
test/sum_type_token.cpp
test/thread_hook.cpp
test/to_string.cpp
test/type_erased_tuple.cpp
test/typed_response_promise.cpp
test/typed_spawn.cpp
test/unit.cpp
test/uri.cpp
test/variant.cpp
)
# -- add library target -------------------------------------------------------- # -- add library target --------------------------------------------------------
add_library(libcaf_core ${LIBCAF_CORE_SRCS} ${LIBCAF_CORE_HDRS}) add_library(libcaf_core_obj OBJECT ${CAF_CORE_SOURCES} ${CAF_CORE_HEADERS})
add_library(caf::core ALIAS libcaf_core) add_library(libcaf_core $<TARGET_OBJECTS:libcaf_core_obj>)
# TODO: only exists for backwards compatibility, remove with CAF 0.19 add_library(caf::core ALIAS libcaf_core)
if(BUILD_SHARED_LIBS)
add_library(libcaf_core_shared ALIAS libcaf_core)
else()
add_library(libcaf_core_static ALIAS libcaf_core)
endif()
target_link_libraries(libcaf_core PUBLIC ${CAF_EXTRA_LDFLAGS}) target_link_libraries(libcaf_core PUBLIC ${CAF_EXTRA_LDFLAGS})
generate_export_header(libcaf_core generate_export_header(libcaf_core_obj
EXPORT_MACRO_NAME CAF_CORE_EXPORT EXPORT_MACRO_NAME CAF_CORE_EXPORT
EXPORT_FILE_NAME "caf/detail/core_export.hpp" EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/caf/detail/core_export.hpp"
STATIC_DEFINE CAF_STATIC_BUILD) STATIC_DEFINE CAF_STATIC_BUILD)
target_include_directories(libcaf_core PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>)
set_target_properties(libcaf_core PROPERTIES set_target_properties(libcaf_core PROPERTIES
EXPORT_NAME core EXPORT_NAME core
SOVERSION ${CAF_VERSION} SOVERSION ${CAF_VERSION}
...@@ -196,6 +299,10 @@ set_target_properties(libcaf_core PROPERTIES ...@@ -196,6 +299,10 @@ set_target_properties(libcaf_core PROPERTIES
# -- install library and header files ------------------------------------------ # -- install library and header files ------------------------------------------
install(FILES "${CMAKE_BINARY_DIR}/caf/detail/build_config.hpp"
"${CMAKE_BINARY_DIR}/caf/detail/core_export.hpp"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/caf/detail")
install(TARGETS libcaf_core install(TARGETS libcaf_core
EXPORT CAFTargets EXPORT CAFTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT core ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT core
...@@ -207,12 +314,31 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/caf" ...@@ -207,12 +314,31 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/caf"
COMPONENT core COMPONENT core
FILES_MATCHING PATTERN "*.hpp") FILES_MATCHING PATTERN "*.hpp")
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/caf/detail/build_config.hpp"
"${CMAKE_CURRENT_BINARY_DIR}/caf/detail/core_export.hpp"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/caf/detail")
# -- add this library to the global CAF_LIBRARIES ------------------------------ # -- add this library to the global CAF_LIBRARIES ------------------------------
list(APPEND CAF_LIBRARIES libcaf_core) list(APPEND CAF_LIBRARIES libcaf_core)
set(CAF_LIBRARIES ${CAF_LIBRARIES} PARENT_SCOPE) set(CAF_LIBRARIES ${CAF_LIBRARIES} PARENT_SCOPE)
# -- build unit tests ----------------------------------------------------------
if(NOT CAF_NO_UNIT_TESTS)
add_executable(caf-core-test
"${PROJECT_SOURCE_DIR}/libcaf_test/src/caf-test.cpp"
"${PROJECT_SOURCE_DIR}/libcaf_test/caf/test/unit_test.hpp"
"${PROJECT_SOURCE_DIR}/libcaf_test/caf/test/unit_test_impl.hpp"
${CAF_CORE_TEST_SOURCES}
$<TARGET_OBJECTS:libcaf_core_obj>)
target_link_libraries(caf-core-test ${CAF_EXTRA_LDFLAGS})
add_test_suites(caf-core-test
"${CMAKE_CURRENT_SOURCE_DIR}"
${CAF_CORE_TEST_SOURCES})
endif()
# -- backwards compatibility, TODO: remove -------------------------------------
if(BUILD_SHARED_LIBS)
add_library(libcaf_core_shared ALIAS libcaf_core)
else()
add_library(libcaf_core_static ALIAS libcaf_core)
endif()
...@@ -81,6 +81,7 @@ struct mpi_field_access<void> { ...@@ -81,6 +81,7 @@ struct mpi_field_access<void> {
return "void"; return "void";
} }
}; };
template <class T> template <class T>
std::string get_mpi_field(const uniform_type_info_map& types) { std::string get_mpi_field(const uniform_type_info_map& types) {
mpi_field_access<T> f; mpi_field_access<T> f;
...@@ -147,7 +148,7 @@ public: ...@@ -147,7 +148,7 @@ public:
actor_system& operator=(const actor_system&) = delete; actor_system& operator=(const actor_system&) = delete;
/// An (optional) component of the actor system. /// An (optional) component of the actor system.
class module { class CAF_CORE_EXPORT module {
public: public:
enum id_t { enum id_t {
scheduler, scheduler,
......
...@@ -124,7 +124,7 @@ public: ...@@ -124,7 +124,7 @@ public:
// -- nested classes --------------------------------------------------------- // -- nested classes ---------------------------------------------------------
/// Represents pre- and postconditions for receive loops. /// Represents pre- and postconditions for receive loops.
class receive_cond { class CAF_CORE_EXPORT receive_cond {
public: public:
virtual ~receive_cond(); virtual ~receive_cond();
...@@ -136,14 +136,14 @@ public: ...@@ -136,14 +136,14 @@ public:
}; };
/// Pseudo receive condition modeling a single receive. /// Pseudo receive condition modeling a single receive.
class accept_one_cond : public receive_cond { class CAF_CORE_EXPORT accept_one_cond : public receive_cond {
public: public:
~accept_one_cond() override; ~accept_one_cond() override;
bool post() override; bool post() override;
}; };
/// Implementation helper for `blocking_actor::receive_while`. /// Implementation helper for `blocking_actor::receive_while`.
struct receive_while_helper { struct CAF_CORE_EXPORT receive_while_helper {
using fun_type = std::function<bool()>; using fun_type = std::function<bool()>;
blocking_actor* self; blocking_actor* self;
...@@ -195,7 +195,7 @@ public: ...@@ -195,7 +195,7 @@ public:
}; };
/// Implementation helper for `blocking_actor::do_receive`. /// Implementation helper for `blocking_actor::do_receive`.
struct do_receive_helper { struct CAF_CORE_EXPORT do_receive_helper {
std::function<void(receive_cond& rc)> cb; std::function<void(receive_cond& rc)> cb;
template <class Statement> template <class Statement>
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#include "caf/buffered_downstream_manager.hpp" #include "caf/buffered_downstream_manager.hpp"
#include "caf/detail/algorithms.hpp" #include "caf/detail/algorithms.hpp"
#include "caf/detail/core_export.hpp"
#include "caf/detail/path_state.hpp" #include "caf/detail/path_state.hpp"
#include "caf/detail/select_all.hpp" #include "caf/detail/select_all.hpp"
#include "caf/detail/unordered_flat_map.hpp" #include "caf/detail/unordered_flat_map.hpp"
...@@ -32,8 +31,7 @@ ...@@ -32,8 +31,7 @@
namespace caf { namespace caf {
template <class T, class Filter = unit_t, class Select = detail::select_all> template <class T, class Filter = unit_t, class Select = detail::select_all>
class CAF_CORE_EXPORT broadcast_downstream_manager class broadcast_downstream_manager : public buffered_downstream_manager<T> {
: public buffered_downstream_manager<T> {
public: public:
// -- member types ----------------------------------------------------------- // -- member types -----------------------------------------------------------
......
...@@ -19,17 +19,15 @@ ...@@ -19,17 +19,15 @@
#pragma once #pragma once
#include <cstdint> #include <cstdint>
#include <cstring>
#include "caf/config.hpp" #include "caf/config.hpp"
#include "caf/detail/comparable.hpp"
namespace caf { namespace caf {
/// Base type for addresses based on a byte representation such as IP or /// Base type for addresses based on a byte representation such as IP or
/// Ethernet addresses. /// Ethernet addresses.
template <class Derived> template <class Derived>
class byte_address : detail::comparable<Derived> { class byte_address {
public: public:
// -- element access --------------------------------------------------------- // -- element access ---------------------------------------------------------
...@@ -50,15 +48,6 @@ public: ...@@ -50,15 +48,6 @@ public:
return dref().bytes().size(); return dref().bytes().size();
} }
// -- comparison -------------------------------------------------------------
/// Returns a negative number if `*this < other`, zero if `*this == other`
/// and a positive number if `*this > other`.
int compare(const Derived& other) const noexcept {
auto& buf = dref().bytes();
return memcmp(buf.data(), other.bytes().data(), Derived::num_bytes);
}
// -- transformations -------------------------------------------------------- // -- transformations --------------------------------------------------------
Derived network_address(size_t prefix_length) const noexcept { Derived network_address(size_t prefix_length) const noexcept {
......
...@@ -262,8 +262,6 @@ CAF_DEFAULT_CONFIG_VALUE_ACCESS(double, "real64"); ...@@ -262,8 +262,6 @@ CAF_DEFAULT_CONFIG_VALUE_ACCESS(double, "real64");
CAF_DEFAULT_CONFIG_VALUE_ACCESS(atom_value, "atom"); CAF_DEFAULT_CONFIG_VALUE_ACCESS(atom_value, "atom");
CAF_DEFAULT_CONFIG_VALUE_ACCESS(timespan, "timespan"); CAF_DEFAULT_CONFIG_VALUE_ACCESS(timespan, "timespan");
CAF_DEFAULT_CONFIG_VALUE_ACCESS(uri, "uri"); CAF_DEFAULT_CONFIG_VALUE_ACCESS(uri, "uri");
CAF_DEFAULT_CONFIG_VALUE_ACCESS(config_value::list, "list");
CAF_DEFAULT_CONFIG_VALUE_ACCESS(config_value::dictionary, "dictionary");
#undef CAF_DEFAULT_CONFIG_VALUE_ACCESS #undef CAF_DEFAULT_CONFIG_VALUE_ACCESS
......
...@@ -39,8 +39,14 @@ public: ...@@ -39,8 +39,14 @@ public:
dynamic_message_data(elements&& data); dynamic_message_data(elements&& data);
dynamic_message_data(dynamic_message_data&&) = default;
dynamic_message_data(const dynamic_message_data& other); dynamic_message_data(const dynamic_message_data& other);
dynamic_message_data& operator=(dynamic_message_data&&) = delete;
dynamic_message_data& operator=(const dynamic_message_data&) = delete;
~dynamic_message_data() override; ~dynamic_message_data() override;
// -- overridden observers of message_data ----------------------------------- // -- overridden observers of message_data -----------------------------------
......
...@@ -247,6 +247,18 @@ public: ...@@ -247,6 +247,18 @@ public:
} }
}; };
// -- constructors, destructors, and assignment operators --------------------
simple_actor_clock() = default;
simple_actor_clock(simple_actor_clock&&) = default;
simple_actor_clock(const simple_actor_clock&) = delete;
simple_actor_clock& operator=(simple_actor_clock&&) = default;
simple_actor_clock& operator=(const simple_actor_clock&) = delete;
// -- properties ------------------------------------------------------------- // -- properties -------------------------------------------------------------
const schedule_map& schedule() const { const schedule_map& schedule() const {
......
...@@ -49,13 +49,13 @@ public: ...@@ -49,13 +49,13 @@ public:
using unique_path_ptr = std::unique_ptr<path_type>; using unique_path_ptr = std::unique_ptr<path_type>;
/// Function object for iterating over all paths. /// Function object for iterating over all paths.
struct path_visitor { struct CAF_CORE_EXPORT path_visitor {
virtual ~path_visitor(); virtual ~path_visitor();
virtual void operator()(outbound_path& x) = 0; virtual void operator()(outbound_path& x) = 0;
}; };
/// Predicate object for paths. /// Predicate object for paths.
struct path_predicate { struct CAF_CORE_EXPORT path_predicate {
virtual ~path_predicate(); virtual ~path_predicate();
virtual bool operator()(const outbound_path& x) const noexcept = 0; virtual bool operator()(const outbound_path& x) const noexcept = 0;
}; };
...@@ -67,6 +67,10 @@ public: ...@@ -67,6 +67,10 @@ public:
explicit downstream_manager(stream_manager* parent); explicit downstream_manager(stream_manager* parent);
downstream_manager(const downstream_manager&) = delete;
downstream_manager& operator=(const downstream_manager&) = delete;
virtual ~downstream_manager(); virtual ~downstream_manager();
// -- properties ------------------------------------------------------------- // -- properties -------------------------------------------------------------
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <tuple> #include <tuple>
#include <vector> #include <vector>
#include "caf/detail/core_export.hpp"
#include "caf/detail/is_one_of.hpp" #include "caf/detail/is_one_of.hpp"
#include "caf/detail/is_primitive_config_value.hpp" #include "caf/detail/is_primitive_config_value.hpp"
#include "caf/timespan.hpp" #include "caf/timespan.hpp"
...@@ -193,7 +194,7 @@ using stream_slot = uint16_t; ...@@ -193,7 +194,7 @@ using stream_slot = uint16_t;
// -- functions ---------------------------------------------------------------- // -- functions ----------------------------------------------------------------
/// @relates actor_system_config /// @relates actor_system_config
const settings& content(const actor_system_config&); CAF_CORE_EXPORT const settings& content(const actor_system_config&);
// -- intrusive containers ----------------------------------------------------- // -- intrusive containers -----------------------------------------------------
...@@ -280,13 +281,14 @@ class private_thread; ...@@ -280,13 +281,14 @@ class private_thread;
class uri_impl; class uri_impl;
// enable intrusive_ptr<uri_impl> with forward declaration only // enable intrusive_ptr<uri_impl> with forward declaration only
void intrusive_ptr_add_ref(const uri_impl*); CAF_CORE_EXPORT void intrusive_ptr_add_ref(const uri_impl*);
void intrusive_ptr_release(const uri_impl*); CAF_CORE_EXPORT void intrusive_ptr_release(const uri_impl*);
// enable intrusive_cow_ptr<dynamic_message_data> with forward declaration only // enable intrusive_cow_ptr<dynamic_message_data> with forward declaration only
void intrusive_ptr_add_ref(const dynamic_message_data*); CAF_CORE_EXPORT void intrusive_ptr_add_ref(const dynamic_message_data*);
void intrusive_ptr_release(const dynamic_message_data*); CAF_CORE_EXPORT void intrusive_ptr_release(const dynamic_message_data*);
dynamic_message_data* intrusive_cow_ptr_unshare(dynamic_message_data*&); CAF_CORE_EXPORT dynamic_message_data*
intrusive_cow_ptr_unshare(dynamic_message_data*&);
} // namespace detail } // namespace detail
......
...@@ -46,6 +46,10 @@ public: ...@@ -46,6 +46,10 @@ public:
// -- constructors, destructors, and assignment operators -------------------- // -- constructors, destructors, and assignment operators --------------------
group_manager(const group_manager&) = delete;
group_manager& operator=(const group_manager&) = delete;
~group_manager(); ~group_manager();
// -- observers -------------------------------------------------------------- // -- observers --------------------------------------------------------------
...@@ -78,7 +82,7 @@ public: ...@@ -78,7 +82,7 @@ public:
private: private:
// -- constructors, destructors, and assignment operators -------------------- // -- constructors, destructors, and assignment operators --------------------
group_manager(actor_system& sys); explicit group_manager(actor_system& sys);
// -- member functions required by actor_system ------------------------------ // -- member functions required by actor_system ------------------------------
......
...@@ -37,6 +37,10 @@ public: ...@@ -37,6 +37,10 @@ public:
group_module(actor_system& sys, std::string mname); group_module(actor_system& sys, std::string mname);
group_module(const group_module&) = delete;
group_module& operator=(const group_module&) = delete;
virtual ~group_module(); virtual ~group_module();
// -- pure virtual member functions ------------------------------------------ // -- pure virtual member functions ------------------------------------------
......
...@@ -73,7 +73,7 @@ public: ...@@ -73,7 +73,7 @@ public:
static constexpr int initial_credit = 50; static constexpr int initial_credit = 50;
/// Stores statistics for measuring complexity of incoming batches. /// Stores statistics for measuring complexity of incoming batches.
struct stats_t { struct CAF_CORE_EXPORT stats_t {
/// Wraps a time measurement for a single processed batch. /// Wraps a time measurement for a single processed batch.
struct measurement { struct measurement {
/// Number of items in the batch. /// Number of items in the batch.
...@@ -83,7 +83,7 @@ public: ...@@ -83,7 +83,7 @@ public:
}; };
/// Wraps the resulf of `stats_t::calculate()`. /// Wraps the resulf of `stats_t::calculate()`.
struct calculation_result { struct CAF_CORE_EXPORT calculation_result {
/// Number of items per credit cycle. /// Number of items per credit cycle.
int32_t max_throughput; int32_t max_throughput;
/// Number of items per batch to reach the desired batch complexity. /// Number of items per batch to reach the desired batch complexity.
......
...@@ -29,7 +29,8 @@ ...@@ -29,7 +29,8 @@
namespace caf { namespace caf {
class CAF_CORE_EXPORT ipv4_address : public byte_address<ipv4_address> { class CAF_CORE_EXPORT ipv4_address : public byte_address<ipv4_address>,
detail::comparable<ipv4_address> {
public: public:
// -- constants -------------------------------------------------------------- // -- constants --------------------------------------------------------------
...@@ -94,6 +95,12 @@ public: ...@@ -94,6 +95,12 @@ public:
return bytes_; return bytes_;
} }
// -- comparison -------------------------------------------------------------
/// Returns a negative number if `*this < other`, zero if `*this == other`
/// and a positive number if `*this > other`.
int compare(ipv4_address other) const noexcept;
// -- inspection ------------------------------------------------------------- // -- inspection -------------------------------------------------------------
template <class Inspector> template <class Inspector>
......
...@@ -27,11 +27,13 @@ ...@@ -27,11 +27,13 @@
#include "caf/detail/comparable.hpp" #include "caf/detail/comparable.hpp"
#include "caf/detail/core_export.hpp" #include "caf/detail/core_export.hpp"
#include "caf/fwd.hpp" #include "caf/fwd.hpp"
#include "caf/ipv4_address.hpp"
namespace caf { namespace caf {
class CAF_CORE_EXPORT ipv6_address class CAF_CORE_EXPORT ipv6_address
: public byte_address<ipv6_address>, : public byte_address<ipv6_address>,
detail::comparable<ipv6_address>,
detail::comparable<ipv6_address, ipv4_address> { detail::comparable<ipv6_address, ipv4_address> {
public: public:
// -- constants -------------------------------------------------------------- // -- constants --------------------------------------------------------------
...@@ -66,7 +68,9 @@ public: ...@@ -66,7 +68,9 @@ public:
// -- comparison ------------------------------------------------------------- // -- comparison -------------------------------------------------------------
using super::compare; /// Returns a negative number if `*this < other`, zero if `*this == other`
/// and a positive number if `*this > other`.
int compare(ipv6_address other) const noexcept;
/// Returns a negative number if `*this < other`, zero if `*this == other` /// Returns a negative number if `*this < other`, zero if `*this == other`
/// and a positive number if `*this > other`. /// and a positive number if `*this > other`.
......
...@@ -102,7 +102,7 @@ public: ...@@ -102,7 +102,7 @@ public:
}; };
/// Encapsulates a single logging event. /// Encapsulates a single logging event.
struct event { struct CAF_CORE_EXPORT event {
// -- constructors, destructors, and assignment operators ------------------ // -- constructors, destructors, and assignment operators ------------------
event() = default; event() = default;
...@@ -181,7 +181,7 @@ public: ...@@ -181,7 +181,7 @@ public:
using line_format = std::vector<field>; using line_format = std::vector<field>;
/// Utility class for building user-defined log messages with `CAF_ARG`. /// Utility class for building user-defined log messages with `CAF_ARG`.
class line_builder { class CAF_CORE_EXPORT line_builder {
public: public:
line_builder(); line_builder();
......
...@@ -35,7 +35,7 @@ public: ...@@ -35,7 +35,7 @@ public:
// -- nested types ----------------------------------------------------------- // -- nested types -----------------------------------------------------------
/// Configures a nested DRR queue. /// Configures a nested DRR queue.
class nested { class CAF_CORE_EXPORT nested {
public: public:
// -- member types --------------------------------------------------------- // -- member types ---------------------------------------------------------
......
/******************************************************************************
* ____ _ _____ *
* / ___| / \ | ___| C++ *
* | | / _ \ | |_ Actor *
* | |___ / ___ \| _| Framework *
* \____/_/ \_|_| *
* *
* Copyright 2011-2018 Dominik Charousset *
* *
* Distributed under the terms and conditions of the BSD 3-Clause License or *
* (at your option) under the terms and conditions of the Boost Software *
* License 1.0. See accompanying files LICENSE and LICENSE_ALTERNATIVE. *
* *
* If you did not receive a copy of the license files, see *
* http://opensource.org/licenses/BSD-3-Clause and *
* http://www.boost.org/LICENSE_1_0.txt. *
******************************************************************************/
#pragma once
#include "caf/abstract_actor.hpp"
#include "caf/resumable.hpp"
namespace caf {
namespace scheduler {
template <class>
class profiled_coordinator;
} // namespace scheduler
namespace policy {
/// An enhancement of CAF's scheduling policy which records fine-grained
/// resource utiliziation for worker threads and actors in the parent
/// coordinator of the workers.
template <class Policy>
struct profiled : Policy {
using coordinator_type = scheduler::profiled_coordinator<profiled<Policy>>;
static actor_id id_of(resumable* job) {
auto ptr = dynamic_cast<abstract_actor*>(job);
return ptr != nullptr ? ptr->id() : 0;
}
template <class Worker>
void before_resume(Worker* worker, resumable* job) {
Policy::before_resume(worker, job);
auto parent = static_cast<coordinator_type*>(worker->parent());
parent->start_measuring(worker->id(), id_of(job));
}
template <class Worker>
void after_resume(Worker* worker, resumable* job) {
Policy::after_resume(worker, job);
auto parent = static_cast<coordinator_type*>(worker->parent());
parent->stop_measuring(worker->id(), id_of(job));
}
template <class Worker>
void after_completion(Worker* worker, resumable* job) {
Policy::after_completion(worker, job);
auto parent = static_cast<coordinator_type*>(worker->parent());
parent->remove_job(id_of(job));
}
};
} // namespace policy
} // namespace caf
...@@ -38,7 +38,7 @@ namespace caf { ...@@ -38,7 +38,7 @@ namespace caf {
class CAF_CORE_EXPORT proxy_registry { class CAF_CORE_EXPORT proxy_registry {
public: public:
/// Responsible for creating proxy actors. /// Responsible for creating proxy actors.
class backend { class CAF_CORE_EXPORT backend {
public: public:
virtual ~backend(); virtual ~backend();
......
...@@ -251,6 +251,14 @@ public: ...@@ -251,6 +251,14 @@ public:
explicit scheduled_actor(actor_config& cfg); explicit scheduled_actor(actor_config& cfg);
scheduled_actor(scheduled_actor&&) = delete;
scheduled_actor(const scheduled_actor&) = delete;
scheduled_actor& operator=(scheduled_actor&&) = delete;
scheduled_actor& operator=(const scheduled_actor&) = delete;
~scheduled_actor() override; ~scheduled_actor() override;
// -- overridden functions of abstract_actor --------------------------------- // -- overridden functions of abstract_actor ---------------------------------
......
This diff is collapsed.
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <unordered_set> #include <unordered_set>
#include "caf/actor_system_config.hpp" #include "caf/actor_system_config.hpp"
#include "caf/defaults.hpp"
#include "caf/event_based_actor.hpp" #include "caf/event_based_actor.hpp"
#include "caf/raise_error.hpp" #include "caf/raise_error.hpp"
#include "caf/raw_event_based_actor.hpp" #include "caf/raw_event_based_actor.hpp"
...@@ -33,7 +34,6 @@ ...@@ -33,7 +34,6 @@
#include "caf/scheduler/coordinator.hpp" #include "caf/scheduler/coordinator.hpp"
#include "caf/scheduler/test_coordinator.hpp" #include "caf/scheduler/test_coordinator.hpp"
#include "caf/scheduler/abstract_coordinator.hpp" #include "caf/scheduler/abstract_coordinator.hpp"
#include "caf/scheduler/profiled_coordinator.hpp"
namespace caf { namespace caf {
...@@ -240,17 +240,12 @@ actor_system::actor_system(actor_system_config& cfg) ...@@ -240,17 +240,12 @@ actor_system::actor_system(actor_system_config& cfg)
using policy::work_stealing; using policy::work_stealing;
using share = coordinator<work_sharing>; using share = coordinator<work_sharing>;
using steal = coordinator<work_stealing>; using steal = coordinator<work_stealing>;
using profiled_share = profiled_coordinator<policy::profiled<work_sharing>>;
using profiled_steal = profiled_coordinator<policy::profiled<work_stealing>>;
// set scheduler only if not explicitly loaded by user // set scheduler only if not explicitly loaded by user
if (!sched) { if (!sched) {
enum sched_conf { enum sched_conf {
stealing = 0x0001, stealing = 0x0001,
sharing = 0x0002, sharing = 0x0002,
testing = 0x0003, testing = 0x0003,
profiled = 0x0100,
profiled_stealing = 0x0101,
profiled_sharing = 0x0102
}; };
sched_conf sc = stealing; sched_conf sc = stealing;
namespace sr = defaults::scheduler; namespace sr = defaults::scheduler;
...@@ -264,8 +259,6 @@ actor_system::actor_system(actor_system_config& cfg) ...@@ -264,8 +259,6 @@ actor_system::actor_system(actor_system_config& cfg)
<< " is an unrecognized scheduler pollicy, " << " is an unrecognized scheduler pollicy, "
"falling back to 'stealing' (i.e. work-stealing)" "falling back to 'stealing' (i.e. work-stealing)"
<< std::endl; << std::endl;
if (get_or(cfg, "scheduler.enable-profiling", false))
sc = static_cast<sched_conf>(sc | profiled);
switch (sc) { switch (sc) {
default: // any invalid configuration falls back to work stealing default: // any invalid configuration falls back to work stealing
sched.reset(new steal(*this)); sched.reset(new steal(*this));
...@@ -273,12 +266,6 @@ actor_system::actor_system(actor_system_config& cfg) ...@@ -273,12 +266,6 @@ actor_system::actor_system(actor_system_config& cfg)
case sharing: case sharing:
sched.reset(new share(*this)); sched.reset(new share(*this));
break; break;
case profiled_stealing:
sched.reset(new profiled_steal(*this));
break;
case profiled_sharing:
sched.reset(new profiled_share(*this));
break;
case testing: case testing:
sched.reset(new test_coordinator(*this)); sched.reset(new test_coordinator(*this));
} }
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#include "caf/ipv4_address.hpp" #include "caf/ipv4_address.hpp"
#include <cstring>
#include "caf/detail/network_order.hpp" #include "caf/detail/network_order.hpp"
#include "caf/detail/parser/read_ipv4_address.hpp" #include "caf/detail/parser/read_ipv4_address.hpp"
#include "caf/error.hpp" #include "caf/error.hpp"
...@@ -56,6 +58,11 @@ ipv4_address::ipv4_address() { ...@@ -56,6 +58,11 @@ ipv4_address::ipv4_address() {
ipv4_address::ipv4_address(array_type bytes) { ipv4_address::ipv4_address(array_type bytes) {
memcpy(bytes_.data(), bytes.data(), bytes.size()); memcpy(bytes_.data(), bytes.data(), bytes.size());
} }
// -- comparison ---------------------------------------------------------------
int ipv4_address::compare(ipv4_address other) const noexcept {
return memcmp(bytes().data(), other.bytes().data(), num_bytes);
}
// -- properties --------------------------------------------------------------- // -- properties ---------------------------------------------------------------
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#include "caf/ipv6_address.hpp" #include "caf/ipv6_address.hpp"
#include <cstring>
#include "caf/detail/append_hex.hpp" #include "caf/detail/append_hex.hpp"
#include "caf/detail/network_order.hpp" #include "caf/detail/network_order.hpp"
#include "caf/detail/parser/read_ipv6_address.hpp" #include "caf/detail/parser/read_ipv6_address.hpp"
...@@ -116,6 +118,12 @@ ipv6_address::ipv6_address(array_type bytes) { ...@@ -116,6 +118,12 @@ ipv6_address::ipv6_address(array_type bytes) {
memcpy(bytes_.data(), bytes.data(), bytes.size()); memcpy(bytes_.data(), bytes.data(), bytes.size());
} }
// -- comparison ---------------------------------------------------------------
int ipv6_address::compare(ipv6_address other) const noexcept {
return memcmp(bytes().data(), other.bytes().data(), num_bytes);
}
int ipv6_address::compare(ipv4_address other) const noexcept { int ipv6_address::compare(ipv4_address other) const noexcept {
ipv6_address tmp{other}; ipv6_address tmp{other};
return compare(tmp); return compare(tmp);
......
# -- get header files for creating "proper" XCode projects --------------------- # -- get header files for creating "proper" XCode projects ---------------------
file(GLOB_RECURSE LIBCAF_IO_HDRS "caf/*.hpp") file(GLOB_RECURSE CAF_IO_HEADERS "caf/*.hpp")
# -- auto generate to_string for enum types ------------------------------------ # -- auto generate to_string for enum types ------------------------------------
...@@ -9,7 +9,7 @@ enum_to_string("caf/io/network/operation.hpp" "operation_to_string.cpp") ...@@ -9,7 +9,7 @@ enum_to_string("caf/io/network/operation.hpp" "operation_to_string.cpp")
# -- list cpp files ------------------------------------------------------------ # -- list cpp files ------------------------------------------------------------
set(LIBCAF_IO_SRCS set(CAF_IO_SOURCES
"${CMAKE_CURRENT_BINARY_DIR}/message_type_to_string.cpp" "${CMAKE_CURRENT_BINARY_DIR}/message_type_to_string.cpp"
"${CMAKE_CURRENT_BINARY_DIR}/operation_to_string.cpp" "${CMAKE_CURRENT_BINARY_DIR}/operation_to_string.cpp"
src/detail/socket_guard.cpp src/detail/socket_guard.cpp
...@@ -52,31 +52,38 @@ set(LIBCAF_IO_SRCS ...@@ -52,31 +52,38 @@ set(LIBCAF_IO_SRCS
src/policy/udp.cpp src/policy/udp.cpp
) )
set(CAF_IO_TEST_SOURCES
test/io/basp/message_queue.cpp
test/io/basp_broker.cpp
test/io/broker.cpp
test/io/http_broker.cpp
test/io/network/default_multiplexer.cpp
test/io/network/ip_endpoint.cpp
test/io/receive_buffer.cpp
test/io/remote_actor.cpp
test/io/remote_group.cpp
test/io/remote_spawn.cpp
test/io/unpublish.cpp
test/io/worker.cpp
)
# -- add library target -------------------------------------------------------- # -- add library target --------------------------------------------------------
add_library(libcaf_io ${LIBCAF_IO_SRCS} ${LIBCAF_IO_HDRS}) add_library(libcaf_io_obj OBJECT ${CAF_IO_SOURCES} ${CAF_IO_HEADERS})
add_library(libcaf_io $<TARGET_OBJECTS:libcaf_io_obj>)
add_library(caf::io ALIAS libcaf_io) add_library(caf::io ALIAS libcaf_io)
# TODO: only exists for backwards compatibility, remove with CAF 0.19 target_link_libraries(libcaf_io_obj PUBLIC caf::core)
if(BUILD_SHARED_LIBS)
add_library(libcaf_io_shared ALIAS libcaf_io)
else()
add_library(libcaf_io_static ALIAS libcaf_io)
endif()
target_link_libraries(libcaf_io PUBLIC caf::core) target_link_libraries(libcaf_io PUBLIC caf::core)
generate_export_header(libcaf_io generate_export_header(libcaf_io_obj
EXPORT_MACRO_NAME CAF_IO_EXPORT EXPORT_MACRO_NAME CAF_IO_EXPORT
EXPORT_FILE_NAME "caf/detail/io_export.hpp" EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/caf/detail/io_export.hpp"
STATIC_DEFINE CAF_STATIC_BUILD) STATIC_DEFINE CAF_STATIC_BUILD)
target_include_directories(libcaf_io PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>)
set_target_properties(libcaf_io PROPERTIES set_target_properties(libcaf_io PROPERTIES
EXPORT_NAME io EXPORT_NAME io
SOVERSION ${CAF_VERSION} SOVERSION ${CAF_VERSION}
...@@ -85,10 +92,9 @@ set_target_properties(libcaf_io PROPERTIES ...@@ -85,10 +92,9 @@ set_target_properties(libcaf_io PROPERTIES
# -- install library and header files ------------------------------------------ # -- install library and header files ------------------------------------------
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/caf/detail/io_export.hpp" install(FILES "${CMAKE_BINARY_DIR}/caf/detail/io_export.hpp"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/caf/detail") DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/caf/detail")
install(TARGETS libcaf_io install(TARGETS libcaf_io
EXPORT CAFTargets EXPORT CAFTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT io ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT io
...@@ -100,8 +106,31 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/caf" ...@@ -100,8 +106,31 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/caf"
COMPONENT io COMPONENT io
FILES_MATCHING PATTERN "*.hpp") FILES_MATCHING PATTERN "*.hpp")
# -- build unit tests ----------------------------------------------------------
if(NOT CAF_NO_UNIT_TESTS)
add_executable(caf-io-test
"${PROJECT_SOURCE_DIR}/libcaf_test/src/caf-test.cpp"
"${PROJECT_SOURCE_DIR}/libcaf_test/caf/test/unit_test.hpp"
"${PROJECT_SOURCE_DIR}/libcaf_test/caf/test/unit_test_impl.hpp"
${CAF_IO_TEST_SOURCES}
$<TARGET_OBJECTS:libcaf_io_obj>)
target_link_libraries(caf-io-test caf::core ${CAF_EXTRA_LDFLAGS})
add_test_suites(caf-io-test
"${CMAKE_CURRENT_SOURCE_DIR}"
${CAF_IO_TEST_SOURCES})
endif()
# -- add this library to the global CAF_LIBRARIES ------------------------------ # -- add this library to the global CAF_LIBRARIES ------------------------------
list(APPEND CAF_LIBRARIES libcaf_io) list(APPEND CAF_LIBRARIES libcaf_io)
set(CAF_LIBRARIES ${CAF_LIBRARIES} PARENT_SCOPE) set(CAF_LIBRARIES ${CAF_LIBRARIES} PARENT_SCOPE)
# -- backwards compatibility, TODO: remove -------------------------------------
if(BUILD_SHARED_LIBS)
add_library(libcaf_io_shared ALIAS libcaf_io)
else()
add_library(libcaf_io_static ALIAS libcaf_io)
endif()
...@@ -76,6 +76,14 @@ class middleman; ...@@ -76,6 +76,14 @@ class middleman;
class CAF_IO_EXPORT abstract_broker : public scheduled_actor, class CAF_IO_EXPORT abstract_broker : public scheduled_actor,
public prohibit_top_level_spawn_marker { public prohibit_top_level_spawn_marker {
public: public:
abstract_broker(abstract_broker&&) = delete;
abstract_broker(const abstract_broker&&) = delete;
abstract_broker& operator=(abstract_broker&&) = delete;
abstract_broker& operator=(const abstract_broker&&) = delete;
~abstract_broker() override; ~abstract_broker() override;
// even brokers need friends // even brokers need friends
......
...@@ -81,6 +81,14 @@ public: ...@@ -81,6 +81,14 @@ public:
explicit broker(actor_config& cfg); explicit broker(actor_config& cfg);
broker(broker&&) = delete;
broker(const broker&) = delete;
broker& operator=(broker&&) = delete;
broker& operator=(const broker&) = delete;
protected: protected:
virtual behavior make_behavior(); virtual behavior make_behavior();
}; };
......
...@@ -18,22 +18,8 @@ ...@@ -18,22 +18,8 @@
#pragma once #pragma once
#include <chrono>
#include "caf/actor_system_config.hpp"
#include "caf/after.hpp"
#include "caf/detail/io_export.hpp" #include "caf/detail/io_export.hpp"
#include "caf/event_based_actor.hpp" #include "caf/fwd.hpp"
#include "caf/io/basp/all.hpp"
#include "caf/io/basp_broker.hpp"
#include "caf/io/broker.hpp"
#include "caf/io/datagram_handle.hpp"
#include "caf/io/middleman.hpp"
#include "caf/io/network/datagram_manager.hpp"
#include "caf/io/network/default_multiplexer.hpp"
#include "caf/io/network/interfaces.hpp"
#include "caf/io/system_messages.hpp"
#include "caf/stateful_actor.hpp"
namespace caf { namespace caf {
namespace io { namespace io {
......
...@@ -48,6 +48,14 @@ public: ...@@ -48,6 +48,14 @@ public:
middleman_actor_impl(actor_config& cfg, actor default_broker); middleman_actor_impl(actor_config& cfg, actor default_broker);
middleman_actor_impl(middleman_actor_impl&&) = delete;
middleman_actor_impl(const middleman_actor_impl&) = delete;
middleman_actor_impl& operator=(middleman_actor_impl&&) = delete;
middleman_actor_impl& operator=(const middleman_actor_impl&) = delete;
void on_exit() override; void on_exit() override;
const char* name() const override; const char* name() const override;
......
...@@ -84,13 +84,13 @@ using multiplexer_poll_shadow_data = native_socket; ...@@ -84,13 +84,13 @@ using multiplexer_poll_shadow_data = native_socket;
#endif // CAF_POLL_MULTIPLEXER #endif // CAF_POLL_MULTIPLEXER
/// Defines the bitmask for input (read) socket events. /// Defines the bitmask for input (read) socket events.
CAF_IO_EXPORT extern const event_mask_type input_mask; extern const event_mask_type input_mask;
/// Defines the bitmask for output (write) socket events. /// Defines the bitmask for output (write) socket events.
CAF_IO_EXPORT extern const event_mask_type output_mask; extern const event_mask_type output_mask;
/// Defines the bitmask for error socket events. /// Defines the bitmask for error socket events.
CAF_IO_EXPORT extern const event_mask_type error_mask; extern const event_mask_type error_mask;
class CAF_IO_EXPORT default_multiplexer : public multiplexer { class CAF_IO_EXPORT default_multiplexer : public multiplexer {
public: public:
...@@ -274,11 +274,11 @@ new_tcp_connection(const std::string& host, uint16_t port, ...@@ -274,11 +274,11 @@ new_tcp_connection(const std::string& host, uint16_t port,
CAF_IO_EXPORT expected<native_socket> CAF_IO_EXPORT expected<native_socket>
new_tcp_acceptor_impl(uint16_t port, const char* addr, bool reuse_addr); new_tcp_acceptor_impl(uint16_t port, const char* addr, bool reuse_addr);
CAF_IO_EXPORT expected<std::pair<native_socket, ip_endpoint>> expected<std::pair<native_socket, ip_endpoint>>
new_remote_udp_endpoint_impl(const std::string& host, uint16_t port, new_remote_udp_endpoint_impl(const std::string& host, uint16_t port,
optional<protocol::network> preferred = none); optional<protocol::network> preferred = none);
CAF_IO_EXPORT expected<std::pair<native_socket, protocol::network>> expected<std::pair<native_socket, protocol::network>>
new_local_udp_endpoint_impl(uint16_t port, const char* addr, new_local_udp_endpoint_impl(uint16_t port, const char* addr,
bool reuse_addr = false, bool reuse_addr = false,
optional<protocol::network> preferred = none); optional<protocol::network> preferred = none);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#pragma once #pragma once
#include "caf/actor_control_block.hpp"
#include "caf/detail/io_export.hpp" #include "caf/detail/io_export.hpp"
#include "caf/intrusive_ptr.hpp" #include "caf/intrusive_ptr.hpp"
#include "caf/io/fwd.hpp" #include "caf/io/fwd.hpp"
......
...@@ -19,9 +19,15 @@ ...@@ -19,9 +19,15 @@
#include "caf/io/connection_helper.hpp" #include "caf/io/connection_helper.hpp"
#include <chrono> #include <chrono>
#include <string>
#include "caf/actor.hpp"
#include "caf/after.hpp"
#include "caf/defaults.hpp" #include "caf/defaults.hpp"
#include "caf/event_based_actor.hpp"
#include "caf/io/basp/instance.hpp" #include "caf/io/basp/instance.hpp"
#include "caf/io/network/interfaces.hpp"
#include "caf/stateful_actor.hpp"
namespace caf { namespace caf {
namespace io { namespace io {
......
# -- get header files for creating "proper" XCode projects --------------------- # -- get header files for creating "proper" XCode projects ---------------------
file(GLOB_RECURSE LIBCAF_OPENSSL_HDRS "caf/*.hpp") file(GLOB_RECURSE CAF_OPENSSL_HEADERS "caf/*.hpp")
# -- list cpp files ------------------------------------------------------------ # -- list cpp files ------------------------------------------------------------
set(LIBCAF_OPENSSL_SRCS set(CAF_OPENSSL_SOURCES
src/openssl/manager.cpp src/openssl/manager.cpp
src/openssl/middleman_actor.cpp src/openssl/middleman_actor.cpp
src/openssl/publish.cpp src/openssl/publish.cpp
...@@ -12,34 +12,38 @@ set(LIBCAF_OPENSSL_SRCS ...@@ -12,34 +12,38 @@ set(LIBCAF_OPENSSL_SRCS
src/openssl/session.cpp src/openssl/session.cpp
) )
set(CAF_OPENSSL_TEST_SOURCES
test/openssl/authentication.cpp
test/openssl/remote_actor.cpp
)
# -- add library target -------------------------------------------------------- # -- add library target --------------------------------------------------------
add_library(libcaf_openssl ${LIBCAF_OPENSSL_SRCS} ${LIBCAF_OPENSSL_HDRS}) add_library(libcaf_openssl_obj OBJECT ${CAF_OPENSSL_SOURCES} ${CAF_OPENSSL_HEADERS})
add_library(libcaf_openssl $<TARGET_OBJECTS:libcaf_openssl_obj>)
add_library(caf::openssl ALIAS libcaf_openssl) add_library(caf::openssl ALIAS libcaf_openssl)
# TODO: only exists for backwards compatibility, remove with CAF 0.19 target_link_libraries(libcaf_openssl_obj PUBLIC
if(BUILD_SHARED_LIBS) caf::core caf::io ${OPENSSL_LIBRARIES})
add_library(libcaf_openssl_shared ALIAS libcaf_openssl)
else()
add_library(libcaf_openssl_static ALIAS libcaf_openssl)
endif()
target_link_libraries(libcaf_openssl PUBLIC target_link_libraries(libcaf_openssl PUBLIC
caf::core caf::io ${OPENSSL_LIBRARIES}) caf::core caf::io ${OPENSSL_LIBRARIES})
if(NOT APPLE AND NOT WIN32) if(NOT APPLE AND NOT WIN32)
target_link_libraries(libcaf_openssl_obj PUBLIC "-pthread")
target_link_libraries(libcaf_openssl PUBLIC "-pthread") target_link_libraries(libcaf_openssl PUBLIC "-pthread")
endif() endif()
generate_export_header(libcaf_openssl generate_export_header(libcaf_openssl_obj
EXPORT_MACRO_NAME CAF_OPENSSL_EXPORT EXPORT_MACRO_NAME CAF_OPENSSL_EXPORT
EXPORT_FILE_NAME "caf/detail/openssl_export.hpp" EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/caf/detail/openssl_export.hpp"
STATIC_DEFINE CAF_STATIC_BUILD) STATIC_DEFINE CAF_STATIC_BUILD)
target_include_directories(libcaf_openssl PUBLIC target_include_directories(libcaf_openssl PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>) $<INSTALL_INTERFACE:include>)
set_target_properties(libcaf_openssl PROPERTIES set_target_properties(libcaf_openssl PROPERTIES
...@@ -50,6 +54,9 @@ set_target_properties(libcaf_openssl PROPERTIES ...@@ -50,6 +54,9 @@ set_target_properties(libcaf_openssl PROPERTIES
# -- install library and header files ------------------------------------------ # -- install library and header files ------------------------------------------
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/caf/detail/openssl_export.hpp"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/caf/detail")
install(TARGETS libcaf_openssl install(TARGETS libcaf_openssl
EXPORT CAFTargets EXPORT CAFTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT openssl ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT openssl
...@@ -61,11 +68,32 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/caf" ...@@ -61,11 +68,32 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/caf"
COMPONENT openssl COMPONENT openssl
FILES_MATCHING PATTERN "*.hpp") FILES_MATCHING PATTERN "*.hpp")
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/caf/detail/openssl_export.hpp" # -- build unit tests ----------------------------------------------------------
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/caf/detail")
if(NOT CAF_NO_UNIT_TESTS)
add_executable(caf-openssl-test
"${PROJECT_SOURCE_DIR}/libcaf_test/src/caf-test.cpp"
"${PROJECT_SOURCE_DIR}/libcaf_test/caf/test/unit_test.hpp"
"${PROJECT_SOURCE_DIR}/libcaf_test/caf/test/unit_test_impl.hpp"
${CAF_OPENSSL_TEST_SOURCES}
$<TARGET_OBJECTS:libcaf_openssl_obj>)
target_link_libraries(caf-openssl-test caf::core caf::io
${OPENSSL_LIBRARIES} ${CAF_EXTRA_LDFLAGS})
add_test_suites(caf-openssl-test
"${CMAKE_CURRENT_SOURCE_DIR}"
${CAF_OPENSSL_TEST_SOURCES})
endif()
# -- add this library to the global CAF_LIBRARIES ------------------------------ # -- add this library to the global CAF_LIBRARIES ------------------------------
list(APPEND CAF_LIBRARIES libcaf_openssl) list(APPEND CAF_LIBRARIES libcaf_openssl)
set(CAF_LIBRARIES ${CAF_LIBRARIES} PARENT_SCOPE) set(CAF_LIBRARIES ${CAF_LIBRARIES} PARENT_SCOPE)
# -- backwards compatibility, TODO: remove -------------------------------------
if(BUILD_SHARED_LIBS)
add_library(libcaf_openssl_shared ALIAS libcaf_openssl)
else()
add_library(libcaf_openssl_static ALIAS libcaf_openssl)
endif()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment