Gtk2-CV

 view release on metacpan or  search on metacpan

lib/Gtk2/CV/Jobber.pm  view on Meta::CPAN

         my $update = $client->can ("jobber_update");
         $update->($client, $_) for @EVENT_BATCH;
      }

      @EVENT_BATCH = ();
      undef $EVENT_TIMER;
   };
}

sub Gtk2::CV::Jobber::Job::event {
   my ($job, $type, $path, $data, %arg) = @_;

   $arg{type} = $type;
   $arg{path} = $path;
   $arg{data} = $data;

   if (my $slave = $job->{slave}) {
      $slave->event (\%arg);
   } else {
      client_update \%arg;
   }
}

sub Gtk2::CV::Jobber::Job::finish {
   my ($job) = @_;

   if (my $slave = delete $job->{slave}) {
      $slave->finish ($job);
   } else {
      unless (delete $job->{event}) {
         my $type = $type{$job->{type}};
         ++$class_limit{$type->{class}};
         delete $hide{$job->{path}} if $type->{hide};
         delete $busy{$job->{path}};

         scheduler;
      }

      client_update $_[0];
   }
}

package Gtk2::CV::Jobber::Client;

=back

=head2 The Gtk2::CV::Jobber::Client class

=over 4

=item $self->jobber_register

To be called when creating a new object instance that wants to listen to
jobber updates.

=cut

sub jobber_register {
   my ($self) = @_;

   Scalar::Util::weaken ($Gtk2::CV::Jobber::client{$self} = $self);

   # nuke all invalid references
   delete $Gtk2::CV::Jobber::client{$_}
      for grep !$Gtk2::CV::Jobber::client{$_}, keys %Gtk2::CV::Jobber::client;
}

=item $self->jobber_update ($job)

The given job has finished.

=cut

sub jobber_update {
   my ($self, $job) = @_;
}

package Gtk2::CV::Jobber::Slave;

use Socket ();

sub new {
   my $class = shift;
   my $self = bless { @_ }, $class;

   $TEMPLATE ||= AnyEvent::Fork->new;

   my $rlen;
   my $rbuf;

   $TEMPLATE->fork->run ("Gtk2::CV::Jobber::Slave::run", sub {
      my ($fh) = @_;
      $self->{fh} = $fh;
      delete $self->{ww};
      $self->send;

      $self->{rw} = add_watch Glib::IO fileno $fh,
         in => sub {
            if (4 > length $rlen) {
               0 ne sysread $fh, $rlen, 4 - length $rlen, length $rlen
                  or die "FATAL: eof when reading from slave\n";
            }

            if (4 == length $rlen) {
               my $len = unpack "N", $rlen;

               0 ne sysread $fh, $rbuf, $len - length $rbuf, length $rbuf
                  or die "FATAL: eof when reading from slave\n";

               if ($len == length $rbuf) {
                  my $job = bless { unpack "(w/a*)*", $rbuf }, Gtk2::CV::Jobber::Job::;

                  $job->{stat} = [ split /\0/, $job->{stat} ];

                  undef $rlen;
                  undef $rbuf;

                  push @idle_slave, $self
                     unless $job->{event};

                  $job->finish;



( run in 1.192 second using v1.01-cache-2.11-cpan-39bf76dae61 )