/lib/Teto/Coro/MarkedChannel.pm

http://github.com/motemen/Teto · Perl · 45 lines · 33 code · 12 blank · 0 comment · 3 complexity · 66b631dc163d1af578799904c09769d4 MD5 · raw file

  1. package Teto::Coro::MarkedChannel;
  2. use strict;
  3. use warnings;
  4. use Mouse;
  5. use Coro::Semaphore;
  6. has size => ( is => 'rw', isa => 'Int', default => sub { 1 } );
  7. has data => ( is => 'rw', isa => 'ArrayRef', default => sub { [] } );
  8. has read_sem => ( is => 'rw', default => sub { Coro::Semaphore->new(0) } );
  9. has mark_sem => ( is => 'rw', default => sub { Coro::Semaphore->new($_[0]->size) } );
  10. no Mouse;
  11. __PACKAGE__->meta->make_immutable;
  12. use constant MARK => \0;
  13. sub put {
  14. my ($self, $data) = @_;
  15. push @{ $self->data }, $data;
  16. $self->read_sem->up;
  17. }
  18. sub put_mark {
  19. my $self = shift;
  20. $self->put(MARK);
  21. $self->mark_sem->down;
  22. }
  23. sub get {
  24. my $self = shift;
  25. $self->read_sem->down;
  26. my $data = shift @{ $self->data };
  27. if (ref $data && $data == MARK) {
  28. $self->mark_sem->up;
  29. return $self->get;
  30. }
  31. return $data;
  32. }
  33. 1;