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 )