extern crate actix;
use actix::prelude::*;
struct CounterActor;
struct Count(u32);
const MAX_ITEMS: u32 = 256;
static mut N_ITEMS: u32 = 0;
struct TrackableItem;
impl TrackableItem {
fn new() -> TrackableItem {
unsafe {
N_ITEMS += 1;
}
TrackableItem {}
}
fn count() -> u32 {
unsafe { N_ITEMS }
}
}
impl Drop for TrackableItem {
fn drop(&mut self) {
unsafe {
N_ITEMS -= 1;
}
}
}
impl Message for Count {
type Result = TrackableItem;
}
impl Actor for CounterActor {
type Context = Context<Self>;
}
impl Handler<Count> for CounterActor {
type Result = MessageResult<Count>;
fn handle(&mut self, msg: Count, ctx: &mut Self::Context) -> Self::Result {
assert!(TrackableItem::count() <= MAX_ITEMS);
let my_address: Addr<Unsync, CounterActor> = ctx.address();
my_address.do_send(Count(msg.0 + 1));
MessageResult(TrackableItem::new())
}
}
#[test]
#[should_panic]
fn test_recursion() {
let system = actix::System::new("test");
let addr: Addr<Unsync, _> = CounterActor.start();
addr.do_send(Count(0));
system.run();
}