\lstinline^void on_sync_failure(auto fun)^& Sets a handler, i.e., a functor taking no arguments, for unexpected synchronous response messages (default action is to kill the actor for reason \lstinline^unhandled_sync_failure^) \\
\lstinline^void on_sync_failure(auto fun)^& Sets a handler, i.e., a functor taking no arguments, for unexpected synchronous response messages (default action is to kill the actor for reason \lstinline^unhandled_sync_failure^) \\
\hline
\hline
\lstinline^void on_sync_timeout(auto fun)^& Sets a handler, i.e., a functor taking no arguments, for \lstinline^timed_sync_send^ timeout messages (default action is to kill the actor for reason \lstinline^unhandled_sync_timeout^) \\
\hline
\lstinline^void monitor(actor whom)^& Unidirectionally monitors \lstinline^whom^ (see Section \ref{Sec::Management::Monitors}) \\
\lstinline^void monitor(actor whom)^& Unidirectionally monitors \lstinline^whom^ (see Section \ref{Sec::Management::Monitors}) \\
\hline
\hline
\lstinline^void demonitor(actor whom)^& Removes a monitor from \lstinline^whom^\\
\lstinline^void demonitor(actor whom)^& Removes a monitor from \lstinline^whom^\\
@@ -205,4 +205,6 @@ Besides, these function names were not a good choice in the first place, since `
...
@@ -205,4 +205,6 @@ Besides, these function names were not a good choice in the first place, since `
As a result, both functions are now deprecated.
As a result, both functions are now deprecated.
Their replacements are named \lstinline^current_message^ and \lstinline^current_sender^ (cf. Section \ref{Sec::Actors::Interfaces}).
Their replacements are named \lstinline^current_message^ and \lstinline^current_sender^ (cf. Section \ref{Sec::Actors::Interfaces}).
\subsubsection{0.13 $\Rightarrow$ 0.14}
The function \lstinline^timed_sync_send^ has been removed. It offered an alternative way of defining message handlers, which is inconsistent with the rest of the API.
A synchronous message is sent to the receiving actor's mailbox like any other (asynchronous) message.
A synchronous message is sent to the receiving actor's mailbox like any other (asynchronous) message. Only the response message is treated separately.
The response message, on the other hand, is treated separately.
The difference between \lstinline^sync_send^ and \lstinline^timed_sync_send^ is how timeouts are handled.
The behavior of \lstinline^sync_send^ is analogous to \lstinline^send^, i.e., timeouts are specified by using \lstinline^after(...)^ statements (see Section \ref{Sec::Receive::Timeouts}).
When using \lstinline^timed_sync_send^ function, \lstinline^after(...)^ statements are ignored and the actor will receive a \lstinline^sync_timeout_msg^ after the given duration instead.
\subsection{Error Messages}
\subsection{Additional Error Messages}
When using synchronous messaging, \lib's runtime environment will send ...
\begin{lstlisting}
struct sync_exited_msg {
actor_addr source;
uint32_t reason;
};
\end{lstlisting}
\begin{itemize}
When using synchronous messaging, \lib's runtime will send a \lstinline^sync_exited_msg^ message if the receiver is not alive. This is in addition to exit and down messages caused by linking or monitoring.
\item if the receiver is not alive:\newline\lstinline^sync_exited_msg { actor_addr source; std::uint32_t reason; };^
%\item \lstinline^{'VOID'}^ if the receiver handled the message but did not respond to it
\item if a message send by \lstinline^timed_sync_send^ timed out: \lstinline^sync_timeout_msg^
\end{itemize}
\clearpage
\subsection{Receive Response Messages}
\subsection{Receive Response Messages}
When sending a synchronous message, the response handler can be passed by either using \lstinline^then^ (event-based actors) or \lstinline^await^ (blocking actors).
When sending a synchronous message, the response handler can be passed by either using \lstinline^then^ (event-based actors) or \lstinline^await^ (blocking actors).
...
@@ -53,29 +42,24 @@ void foo(event_based_actor* self, actor testee) {
...
@@ -53,29 +42,24 @@ void foo(event_based_actor* self, actor testee) {
Similar to \lstinline^become^, the \lstinline^then^ function modifies an actor's behavior stack.
Similar to \lstinline^become^, the \lstinline^then^ function modifies an actor's behavior stack.
However, it is used as ``one-shot handler'' and automatically returns to the previous behavior afterwards.
However, it is used as ``one-shot handler'' and automatically returns to the previous behavior afterwards.
\clearpage
\subsection{Synchronous Failures and Error Handlers}
\subsection{Synchronous Failures and Error Handlers}
An unexpected response message, i.e., a message that is not handled by given behavior, will invoke the actor's \lstinline^on_sync_failure^ handler.
An unexpected response message, i.e., a message that is not handled by the ``one-shot-handler'', is considered as an error. The runtime will invoke the actor's \lstinline^on_sync_failure^, which kills the actor by calling \lstinline^self->quit(exit_reason::unhandled_sync_failure)^ per default. The error handler can be overridden by calling \lstinline^self->on_sync_failure(...)^ as shown below.
The default handler kills the actor by calling \lstinline^self->quit(exit_reason::unhandled_sync_failure)^.
The handler can be overridden by calling \lstinline^self->on_sync_failure(/*...*/)^.
Unhandled timeout messages trigger the \lstinline^on_sync_timeout^ handler.
The default handler kills the actor for reason \lstinline^exit_reason::unhandled_sync_failure^.
It is possible set both error handlers by calling \lstinline^self->on_sync_timeout_or_failure(/*...*)^.