Padre
view release on metacpan or search on metacpan
lib/Padre/TaskManager.pm view on Meta::CPAN
}
}
# We are now active
$self->{active} = 1;
# Take one initial spin through the dispatch loop to run anything
# that queued up before we were started.
$self->run;
}
=pod
=head2 stop
$manager->stop;
The C<stop> method shuts down the task manager, signalling active workers that
they should do an elegant shutdown.
=cut
sub stop {
TRACE( $_[0] ) if DEBUG;
my $self = shift;
# Disable and clear pending tasks
$self->{active} = 0;
$self->{queue} = [];
# Shut down the master thread
# NOTE: We ignore the status of the thread master settings here and
# act only on the basis of whether or not a master thread is running.
if ($Padre::TaskWorker::VERSION) {
if ( Padre::TaskWorker->master_running ) {
Padre::TaskWorker->master->send_stop;
}
}
# Stop all of our workers
foreach ( 0 .. $#{ $self->{workers} } ) {
$self->stop_worker($_);
}
# Empty task handles
# TODO: is this the right way of doing it?
$self->{handles} = {};
return 1;
}
=pod
=head2 schedule
The C<schedule> method is used to give a task to the task manager and indicate
it should be run as soon as possible.
This may be immediately (with the task sent to a worker before the method
returns) or it may be delayed until some time in the future if all workers
are busy.
As a convenience, this method returns true if the task could be dispatched
immediately, or false if it was queued for future execution.
=cut
sub schedule {
TRACE( $_[1] ) if DEBUG;
my $self = shift;
my $task = Params::Util::_INSTANCE( shift, 'Padre::Task' );
unless ($task) {
die "Invalid task scheduled!"; # TO DO: grace
}
# Add to the queue of pending events
push @{ $self->{queue} }, $task;
# Dispatch this task and anything else waiting from a previous call.
$self->run;
}
=pod
=head2 cancelled
$manager->cancelled( $owner );
The C<cancelled> method is used with the "task ownership" feature of the
L<Padre::Task> 3.0 API to signal tasks running in the background that
were created by a particular object that they should voluntarily abort as
their results are no longer wanted.
=cut
sub cancel {
# TRACE( $_[0] ) if DEBUG;
my $self = shift;
my $owner = shift;
my $queue = $self->{queue};
# Remove any tasks from the pending queue
@$queue = grep { !defined $_->{owner} or $_->{owner} != $owner } @$queue;
# Signal any active tasks to cooperatively abort themselves
foreach my $handle ( values %{ $self->{handles} } ) {
my $task = $handle->{task} or next;
next unless $task->{owner};
next unless $task->{owner} == $owner;
$handle->cancel;
foreach my $worker ( grep { defined $_ } @{ $self->{workers} } ) {
next unless defined $handle->{worker};
next unless $worker->{wid} == $handle->{worker};
TRACE("Sending 'cancel' message to worker $worker->{wid}") if DEBUG;
$worker->send_cancel;
return 1;
}
}
return 1;
( run in 2.655 seconds using v1.01-cache-2.11-cpan-99c4e6809bf )