MapLibre Native Core
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
mbgl::Actor< Object > Class Template Reference

#include <actor.hpp>

Public Member Functions

template<class... Args>
 Actor (Scheduler &scheduler, Args &&... args)
 
template<class... Args>
 Actor (std::shared_ptr< Scheduler > scheduler, Args &&... args)
 
 Actor (const Actor &)=delete
 
ActorRef< std::decay_t< Object > > self ()
 

Detailed Description

template<class Object>
class mbgl::Actor< Object >

An Actor<O> is an owning reference to an asynchronous object of type O: an "actor". Communication with an actor happens via message passing: you send a message to the object (using invoke), passing a pointer to the member function to call and arguments which are then forwarded to the actor.

The actor receives messages sent to it asynchronously, in a manner defined its Scheduler. To store incoming messages before their receipt, each actor has a Mailbox, which acts as a FIFO queue. Messages sent from actor S to actor R are guaranteed to be processed in the order sent. However, relative order of messages sent by two different actors S1 and S2 to R is not guaranteed (and can't be: S1 and S2 may be acting asynchronously with respect to each other).

An Actor<O> can be converted to an ActorRef<O>, a non-owning value object representing a (weak) reference to the actor. Messages can be sent via the Ref as well.

It's safe – and encouraged – to pass Refs between actors via messages. This is how two-way communication and other forms of collaboration between multiple actors is accomplished.

It's safe for a Ref to outlive its Actor – the reference is "weak", and does not extend the lifetime of the owning Actor, and sending a message to a Ref whose Actor has died is a no-op. (In the future, a dead-letters queue or log may be implemented.)

Construction and destruction of an Actor is synchronous: the corresponding O object is constructed synchronously by the Actor constructor, and destructed synchronously by the ~Actor destructor, after ensuring that the O is not currently receiving an asynchronous message. The constructor of O is passed an ActorRef<O> referring to itself (which it can use to self-send messages), followed by the forwarded arguments passed to Actor<O>. Asynchronous object construction can be accomplished by directly using the lower-level types, AspiringActor<O> and EstablishedActor<O>.

Please don't send messages that contain shared pointers or references. That subverts the purpose of the actor model: prohibiting direct concurrent access to shared state.

Definition at line 52 of file actor.hpp.

Constructor & Destructor Documentation

◆ Actor() [1/3]

template<class Object >
template<class... Args>
mbgl::Actor< Object >::Actor ( Scheduler scheduler,
Args &&...  args 
)
inline

Definition at line 55 of file actor.hpp.

◆ Actor() [2/3]

template<class Object >
template<class... Args>
mbgl::Actor< Object >::Actor ( std::shared_ptr< Scheduler scheduler,
Args &&...  args 
)
inline

Definition at line 59 of file actor.hpp.

◆ Actor() [3/3]

template<class Object >
mbgl::Actor< Object >::Actor ( const Actor< Object > &  )
delete

Member Function Documentation

◆ self()

template<class Object >
ActorRef<std::decay_t<Object> > mbgl::Actor< Object >::self ( )
inline

Definition at line 64 of file actor.hpp.


The documentation for this class was generated from the following file: