All Versions
16
Latest Version
Avg Release Cycle
74 days
Latest Release
177 days ago
Changelog History
Page 1
Changelog History
Page 1
-
v0.18.0-rc.1
September 09, 2020โ Added
- The new
fan_out_request
function streamlines fan-out/fan-in work flows (see
the new example inexamples/message_passing/fan_out_request.cpp
as well as
๐ the new manual entry). The policy-based design further allows us to support
more use cases in the future (#932, #964). - We introduced the lightweight template class
error_code
as an alternative to
the generic but more heavyweight classerror
. The new error code abstraction
simply wraps an enumeration type without allowing users to add additional
context such as error messages. However, whenever such information is
unneeded, the new class is much more efficient than usingerror
. - Tracing messages in distributed systems is a common practice for monitoring
and debugging message-based systems. The newtracing_data
abstraction in CAF
enables users to augment messages between actors with arbitrary meta data.
๐ This is an experimental API that requires building CAF with the CMake option
CAF_ENABLE_ACTOR_PROFILER
(#981). - โ Add compact
from..to..step
list notation in configuration files. For
example,[1..3]
expands to[1, 2, 3]
and[4..-4..-2]
expands to
[4, 2, 0, -2, -4]
(#999). - ๐ Allow config keys to start with numbers (#1014).
- The
fan_out_request
function got an additional policy for picking just the
fist result:select_any
(#1012). - โ Run-time type information in CAF now uses 16-bit type IDs. Users can assign
this ID by specializingtype_id
manually (not recommended) or use the new
API for automatically assigning ascending IDs insideCAF_BEGIN_TYPE_ID_BLOCK
andCAF_END_TYPE_ID_BLOCK
code blocks. - The new typed view types
typed_message_view
andconst_typed_message_view
๐ make working withmessage
easier by providing astd::tuple
-like interface
(#1034). - The class
exit_msg
finally got its missingoperator==
(#1039). - ๐ The class
node_id
received an overload forparse
to allow users to convert
the output ofto_string
back to the original ID (#1058). - Actors can now
monitor
anddemonitor
CAF nodes (#1042). Monitoring a CAF
node causes the actor system to send anode_down_msg
to the observer when
losing connection to the monitored node. - In preparation of potential future API additions/changes, CAF now includes an
RFC4122-compliantuuid
class. - The new trait class
is_error_code_enum
allows users to enable conversion of
custom error code enums toerror
anderror_code
. - CAF now enables users to tap into internal CAF metrics as well as adding their
own instrumentation! Since this addition is too large to cover in a changelog
entry, please have a look at the new Metrics Section of the manual to learn
more.
๐ Deprecated
- 0๏ธโฃ The
to_string
output forerror
now renders the error code enum by default.
This renders the member functionsactor_system::render
and
actor_system_config::render
obsolete. - ๐ป Actors that die due to an unhandled exception now use
sec::runtime_error
consistently. This makesexit_reason::unhandled_exception
obsolete.
๐ Changed
- ๐ CAF now requires C++17 to build.
- On UNIX, CAF now uses visibility hidden by default. All API functions and
types that form the ABI are explicitly exported using module-specific macros.
๐ On Windows, this change finally enables building native DLL files. - ๐ We switched our coding style to the C++17 nested namespace syntax.
- CAF used to generate the same node ID when running on the same machine and
only differentiates actors systems by their process ID. When running CAF
instances in a container, this process ID is most likely the same for each
โ run. This means two containers can produce the same node ID and thus
equivalent actor IDs. In order to make it easier to use CAF in a containerized
environment, we now generate unique (random) node IDs (#970). - We did a complete redesign of all things serialization. The central class
๐data_processor
got removed. The two classes for binary serialization no
longer extend the generic interfacesserializer
anddeserializer
in order
to avoid the overhead of dynamic dispatching as well as the runtime cost of
error
return values. This set of changes leads so some code duplication,
because many CAF types now accept a generic(de)serializer
as well as a
๐binary_(de)serializer
but significantly boosts performance in the hot code
paths of CAF (#975). - ๐ With C++17, we no longer support compilers without support for
thread_local
.
๐ Consequently, we removed all workarounds and switched to the C++ keyword
(#996). - Our manual now uses
reStructuredText
instead ofLaTeX
. We hope this makes
extending the manual easier and lowers the barrier to entry for new
contributors. - A
stateful_actor
now forwards excess arguments to theState
rather than to
0๏ธโฃ theBase
. This enables states with non-default constructors. When using
stateful_actor<State>
as pointer type in function-based actors, nothing
๐ changes (i.e. the new API is backwards compatible for this case). However,
callingspawn<stateful_actor<State>>(xs...)
now initializes theState
with
the argument packxs...
(plus optionally aself
pointer as first
argument). Furthermore, the state class can now provide amake_behavior
member function to initialize the actor (this has no effect for function-based
actors). - In order to stay more consistent with naming conventions of the standard
library, we have renamed some values of thepec
enumeration:illegal_escape_sequence
=>invalid_escape_sequence
illegal_argument
=>invalid_argument
illegal_category
=>invalid_category
- CAF no longer automagically flattens
tuple
,optional
, orexpected
when
returning these types from message handlers. Users can simply replace
std::tuple<A, B, C>
withcaf::result<A, B, C>
for returning more than one
value from a message handler. - A
caf::result
can no longer representskip
. Whether a message gets skipped
0๏ธโฃ or not is now only for the default handler to decide. Consequently, default
๐ handlers now returnskippable_result
instead ofresult<message>
. A
skippable result is a variant overdelegated<message>
,message
,error
,
orskip_t
. The only good use case for message handlers that skip a message
in their body was in typed actors for getting around the limitation that a
typed behavior always must provide all message handlers (typed behavior assume
a complete implementation of the interface). This use case received direct
support: constructing a typed behavior withpartial_behavior_init
as first
argument suppresses the check for completeness. - In order to reduce complexity of typed actors, CAF defines interfaces as a set
of function signatures rather than using custom metaprogramming facilities.
Function signatures must always wrap the return type in aresult<T>
. For
example:typed_actor<result<double>(double)>
. We have reimplemented the
metaprogramming facilitiesracts_to<...>
andreplies_to<...>::with<...>
as an alternative way of writing the function signature. - All parsing functions in
actor_system_config
that take an input stream
๐ง exclusively use the new configuration syntax (please consult the manual for
๐ง details and examples for the configuration syntax). - The returned string of
name()
must not change during the lifetime of an
actor. Hence,stateful_actor
now only considers staticname
members in its
State
for overriding this function. CAF always assumed names belonging to
types, but did not enforce it because the name was only used for logging.
Since the new metrics use this name for filtering now, we enforce static names
in order to help avoid hard-to-find issues with the filtering mechanism. - The type inspection API received a complete overhaul. The new DSL for writing
inspect
functions exposes the entire structure of an object to CAF. This
enables inspectors to read and write a wider range of data formats. In
๐ง particular human-readable, structured data such as configuration files, JSON,
XML, etc. The inspection API received too many changes to list them here.
Please refer to the manual section on type inspection instead.
โ Removed
- A vendor-neutral API for GPGPU programming sure sounds great. Unfortunately,
OpenCL did not catch on in the way we had hoped. At this point, we can call
๐ OpenCL dead and gone. There is only legacy support available and recent
๐ versions of the standard were never implemented in the first place.
Consequently, we've dropped theopencl
module. - The old
duration
type is now superseded bytimespan
(#994). - The enum
match_result
became obsolete. Individual message handlers can no
longer skip messages. Hence, message handlers can only succeed (match) or not.
Consequently, invoking a message handler or behavior now returns a boolean. - โฑ All member functions of
scheduled_actor
for adding stream managers (such as
๐make_source
) were removed in favor their free-function equivalent, e.g.,
attach_stream_source
- ๐ง The configuration format of CAF has come a long way since first starting to
๐ allow user-defined configuration via.ini
files. Rather than sticking with
the weird hybrid that evolved over the years, we finally get rid of the last
pieces of INI syntax and go with the much cleaner, scoped syntax. The new
๐ง default file name for configuration files iscaf-application.conf
.
๐ Fixed
- ๐ Fix uninstall target when building CAF as CMake subdirectory.
- Using
inline_all_enqueues
in deterministic unit tests could result in
deadlocks when calling blocking functions in message handlers. This function
now behaves as expected (#1016). - Exceptions while handling requests now trigger error messages (#1055).
- The member function
demonitor
falsely refused typed actor handles. Actors
could monitor typed actors but not demonitoring it again. This member function
is now a template that accepts any actor handle in the same waymonitor
already did. - The
typed_actor_view
decorator lacked several member functions such as
link_to
,send_exit
, etc. These are now available. - Constructing a
typed_actor
handle from a pointer view failed du to a missing
constructor overload. This (explicit) overload now exists and the conversion
should work as expected. - Sending floating points to remote actors changed
infinity
andNaN
to
๐ garbage values (#1107). The fixed packing / unpacking routines for IEEE 754
values keep these non-numeric values intact now. It is worth mentioning that
โฌ๏ธ the new algorithm downgrades signaling NaN values to silent NaN values,
because the standard API does not provide predicates to distinguish between the
two. This should have no implications for real-world applications, because
๐ฆ actors that produce a signaling NaN trigger trap handlers before sending
the result to another actor. - ๐ The URI parser stored IPv4 addresses as strings (#1123). Users can now safely
๐ assume that the parsed URI fortcp://127.0.0.1:8080
returns an IP address
when callingauthority().host
.
- The new
-
v0.17.7
๐ Fixed
- Datagram servants of UDP socket managers were not added as children to their parent broker on creation, which prevented proper system shutdown in some cases. Adding all servants consistently to the broker should make sure UDP brokers terminate correctly (#1133).
- Backport stream manager fix from CAF 0.18 for fused downstream managers that prevent loss of messages during regular actor shutdown.
-
v0.17.5
May 13, 2020โ Added
- In order to allow users to start migrating towards upcoming API changes, CAF
0.17.5 includes a subset of the CAF 0.18type_id
API. Listing all
user-defined types betweenCAF_BEGIN_TYPE_ID_BLOCK
and
CAF_END_TYPE_ID_BLOCK
assigns ascending type IDs. Only one syntax for
โCAF_ADD_ATOM
exists, since the atom text is still mandatory. Assigning type
0๏ธโฃ IDs has no immediate effect by default. However, the new function
actor_system_config::add_message_types
accepts an ID block and adds
โ runtime-type information for all types in the block. - In order to opt into the compile-time checks for all message types, users can
set theCAF_ENABLE_TYPE_ID_CHECKS
CMake flag toON
(pass
๐--enable-type-id-checks
when using theconfigure
script). Building CAF
with this option causes compiler errors when sending a type without a type ID.
This option in conjunction with the newadd_message_types
function removes a
common source of bugs: forgetting to calladd_message_type<T>
for all types
that can cross the wire.
๐ Changed
- Our manual now uses
reStructuredText
instead ofLaTeX
(backport from
0.18).
๐ Fixed
- ๐ Fix handling of OS-specific threading dependency in CMake.
- ๐ Fix uninstall target when building CAF as CMake subdirectory (backport from
0.18). - Fix potential deadlock with
inline_all_enqueues
(backport from 0.18). - Exceptions while handling requests now trigger error messages (backport from
0.18). - ๐ Fix build on GCC 7.2
- ๐ Fix build error in the OpenSSL module under some MSVC configurations
- Serializer and deserializer now accept
std::chrono::time_point
for all clock
types instead of hard-wiringstd::system_clock
. - In some edge cases, actors failed to shut down properly when hosting a stream
๐ source (#1076). The handshake process for a graceful shutdown has been fixed. - ๐ Fixed a compiler error on Clang 10 (#1077).
- ๐ป Setting lists and dictionaries on the command line now properly overrides
๐ง default values and values from configuration files instead of appending to
them (#942). - Using unquoted strings in command-line arguments inside lists now works as
expected. For example,--foo=abc,def
is now equivalent to
--foo=["abc", "def"]
.
- In order to allow users to start migrating towards upcoming API changes, CAF
-
v0.17.4
February 08, 2019- Accept numbers as keys in the config syntax (#1014)
- Fix behavior of
inline_all_enqueues
in the testing DSL (#1016) - ๐ Make sure actors that receive stream input shut down properly (#1019)
- Fix undesired function hiding in
fused_downstream_manager
(#1020) - ๐ Improve
to_string
output forcaf::error
(#1021) - ๐ Fix path recognition in the URI parser, e.g.,
file:///
is now valid (#1013) - Properly report errors to users while connecting two CAF nodes (#1023)
- ๐ Simplify crosscompilation: remove build dependency on code generators (#1026)
- ๐ Leave CXX settings to the (CMake) parent when building as subdirectory (#1032)
- ๐ Build without documentation in subdirectory mode (#1037)
- Allow parents to set
OPENSSL_INCLUDE_DIR
in subdirectory mode (#1037) - โ Add
-pthread
flag on UNIX when looking forlibc++
support (#1038) - โ Add missing
operator==
forexit_msg
(#1039) - ๐ฒ Avoid producing unexpected log files (#1024)
-
v0.17.3
November 11, 2019- โ Add support for OpenBSD (#955)
- Provide uniform access to actor properties (#958)
- ๐ Fix bug in stream managers that caused finalizers to get called twice (#937)
- ๐ Fix verbosity level with disabled console output (#953)
- ๐ Fix excessive buffering in stream stages (#952)
- โ Add missing
to_string(pec)
(#940)
-
v0.17.2
October 20, 2019- โ Add
scheduled_send
for delayed sends with absolute timeout (#901) - ๐ Allow actors based on composable behaviors to use the streaming API (#902)
- ๐ Fix memory leak when deserializing
node_id
(#905) - ๐ Fix composition of statically typed actors using streams (#908)
- โฌ๏ธ Reduce stack usage of serializers (#912)
- ๐ Fix several warnings on GCC and Clang (#915)
- ๐ง Use default installation directories on GNU/Linux (#917)
- Fix
holds_alternative
andget_if
forsettings
(#920) - ๐ Support arbitrary list and map types in
config_value
(#925) - ๐ Allow users to extend
config_value
API (#929, #938) - ๐ Fix silent dropping of errors in response handlers (#935)
- ๐ Fix stall in
remote_group
on error (#933)
- โ Add
-
v0.17.1
August 31, 2019- ๐ Fix endless loop in config parser (#894)
- ๐ Fix debug build with Clang 7 on Linux (#861)
- ๐ Fix type-specific parsing of config options (#814)
- ๐ Improve CMake setup when building CAF as subfolder (#866)
- ๐ Fix potential deadlock in proxy registry (#880)
- ๐ Fix output of --dump-config (#876)
- ๐ Fix potential segfault when using streams with trace logging enabled (#878)
- Properly set CLI remainder (#871)
- ๐ Support nesting of group names in .ini files (#870)
- ๐ Support all alphanumeric characters in config group names (#869)
- ๐ Fix handling of containers with user-defined types (#867)
- Fix
defaulted_function_deleted
warning on Clang (#859)
-
v0.17.0
July 27, 2019- Parallelize deserialization of messages received over the network (#821).
Moving the deserialization out of the I/O loop significantly increases
๐ performance. In our benchmark, CAF now handles twice as many messages per
second. - โ Add marker to make categories optional on the CLI: Categories are great at
organizing program options. However, on the CLI they get in the way quickly.
This change allows developers to prefix category names with ? to make it
optional on the CLI. - ๐ Fix performance of thread-safe actor clock (#849). This clock type is used
whenever sending requests, delayed messages, receive timeouts etc. CAF can
๐ handle about 10x more timeouts per second after the patch. ๐ Relax ini syntax for maps by making
=
for defining maps and,
for
separating key-value pairs optional. For example, this change allows to
rewrite an entry like this:logger = { console-verbosity='trace', console='colored'}
to a slightly less noisy version such as this:
logger { console-verbosity='trace'console='colored'}
- ๐ Allow apps to always use the
caf::logger
, whether or not CAF was compiled
๐ฒ with logging enabled. - ๐ Fix over- and underflow checks in number parser (#852).
- ๐ Fix multicast address detection in
caf::ipv4_address.cpp
(#853). - ๐ Fix disconnect issue / WSAGetLastError usage on Windows (#846).
- ๐ Fix
--config-file
option (#841). - ๐ Fix parsing of CLI arguments for strings and atom values.
- โ Add conversion from
nullptr
to intrusive and COW pointer types. - ๐ Streamline direct node-to-node communication and support multiple app
identifiers. - Reimplement
binary_serializer
andbinary_deserializer
without STL-style
๐ stream buffers for better performance. - ๐ Support move-only behavior functions.
- ๐ Allow users to omit
global
in config files. - ๐ Allow IPO on GCC/Clang (#824).
- Parallelize deserialization of messages received over the network (#821).
-
v0.16.5
November 11, 2019โ Added
- ๐ Support for OpenBSD.