class bounded_buffer : actor { int buf[MAX]; int in, out; behavior: empty_buffer = { put() }; full_buffer = { get() }; partial_buffer = {get(),put()}; public: bounded_buffer() { in=0; out=0; } int get() { reply buf[out++]; out %= MAX; if (in == out) become empty_buffer; else become partial_buffer; } void put( int item ) { buf[in++] = item; in %= MAX; if (in == out ) become full_buffer; else become partial_buffer; } };
class extended_buffer : bounded_buffer { behavior: full_buffer = {get(), get_rear()}; partial_buffer = {get(), get_rear(), put()}; public: int get_rear() { reply buf[--in%MAX]; out %= MAX; if (in == out) become empty_buffer; else become partial_buffer; } };
active class P { ... public: P() { ... } active m1 () { ... } active m2 () { ... } };
active class special : public bounded { public: special() : bounded() { for(;;) accept( rear:used>0 ); } int rear() { ... } };