use crate::common::tsafe::TSafe;
use crate::actors::dispatcher::Dispatcher;
use crate::actors::mailbox::Mailbox;
use crate::actors::actor_context::ActorContext;
use crate::actors::actor::Actor;
use crate::actors::actor_path::ActorPath;
use crate::actors::actor_system::ActorSystem;
use crate::actors::envelope::Envelope;
use crate::actors::actor_ref::ActorRef;
use std::sync::{Arc, Mutex};
use std::any::Any;
pub struct ActorCell {
pub dispatcher: TSafe<Dispatcher + Send>,
pub mailbox: TSafe<Mailbox + Send>,
pub bid: u32,
pub actor: TSafe<Actor + Send>,
pub path: TSafe<ActorPath>,
pub system: TSafe<ActorSystem>,
pub suspended: bool,
pub stopped: bool
}
impl ActorCell {
pub fn new(system: TSafe<ActorSystem>,
path: TSafe<ActorPath>,
actor: TSafe<Actor + Send>,
bid: u32,
dispatcher: TSafe<Dispatcher + Send>,
mailbox: TSafe<Mailbox + Send>) -> ActorCell {
ActorCell {
actor,
bid,
dispatcher,
mailbox,
path,
system,
suspended: false,
stopped: true
}
}
pub fn start(self: &mut Self, boxed_self: TSafe<ActorCell>) {
self.bid = self.dispatcher.lock().unwrap().obtain_bid();
let self_ = ActorRef::new(boxed_self, self.path.clone());
let sender = self.system.lock().unwrap().dead_letters();
let system = self.system.clone();
let ctx = ActorContext::new(sender, self_, system);
self.actor.lock().unwrap().pre_start(ctx);
self.stopped = false;
}
pub fn stop(self: &mut Self, boxed_self: TSafe<ActorCell>) {
self.stopped = true;
let self_ = ActorRef::new(boxed_self, self.path.clone());
let sender = self.system.lock().unwrap().dead_letters();
let system = self.system.clone();
let ctx = ActorContext::new(sender, self_, system);
self.actor.lock().unwrap().post_stop(ctx);
}
pub fn suspend(self: &mut Self) {
self.suspended = true;
}
pub fn send(self: &mut Self,
boxed_self: &TSafe<ActorCell>,
msg: Box<Any + Send + 'static>,
rself: Option<ActorRef>,
to_ref: ActorRef) {
if self.stopped || self.suspended {
let dead_letters = self.system.lock().unwrap().dead_letters();
dead_letters.cell.lock().unwrap().send(&dead_letters.cell,
msg, rself,
to_ref);
} else {
let envelope = Envelope::new(
msg,
rself,
to_ref,
self.system.clone());
self.dispatcher.lock().unwrap().dispatch(
boxed_self.clone(),
self.bid,
self.mailbox.clone(),
self.actor.clone(), envelope);
}
}
pub fn force_send(self: &mut Self,
boxed_self: TSafe<ActorCell>,
msg: Box<Any + Send + 'static>,
rself: Option<ActorRef>,
to_ref: ActorRef) {
let envelope = Envelope::new(
msg,
rself,
to_ref,
self.system.clone());
self.dispatcher.lock().unwrap().dispatch(
boxed_self,
self.bid,
self.mailbox.clone(),
self.actor.clone(), envelope);
}
}