Acme-Sort-Sleep
view release on metacpan or search on metacpan
local/lib/perl5/IO/Async/PID.pm view on Meta::CPAN
sub configure
{
my $self = shift;
my %params = @_;
if( exists $params{pid} ) {
$self->loop and croak "Cannot configure 'pid' after adding to Loop";
$self->{pid} = delete $params{pid};
}
if( exists $params{on_exit} ) {
$self->{on_exit} = delete $params{on_exit};
undef $self->{cb};
if( my $loop = $self->loop ) {
$self->_remove_from_loop( $loop );
$self->_add_to_loop( $loop );
}
}
$self->SUPER::configure( %params );
}
sub _add_to_loop
{
my $self = shift;
my ( $loop ) = @_;
$self->pid or croak "Require a 'pid' in $self";
$self->SUPER::_add_to_loop( @_ );
# on_exit continuation gets passed PID value; need to replace that with
# $self
$self->{cb} ||= $self->_replace_weakself( sub {
my $self = shift or return;
my ( $exitcode ) = @_;
$self->invoke_event( on_exit => $exitcode );
# Since this is a oneshot, we'll have to remove it from the loop or
# parent Notifier
$self->remove_from_parent;
} );
$loop->watch_child( $self->pid, $self->{cb} );
}
sub _remove_from_loop
{
my $self = shift;
my ( $loop ) = @_;
$loop->unwatch_child( $self->pid );
}
sub notifier_name
{
my $self = shift;
if( length( my $name = $self->SUPER::notifier_name ) ) {
return $name;
}
return $self->{pid};
}
=head1 METHODS
=cut
=head2 pid
$process_id = $pid->pid
Returns the underlying process ID
=cut
sub pid
{
my $self = shift;
return $self->{pid};
}
=head2 kill
$pid->kill( $signal )
Sends a signal to the process
=cut
sub kill
{
my $self = shift;
my ( $signal ) = @_;
kill $signal, $self->pid or croak "Cannot kill() - $!";
}
=head1 AUTHOR
Paul Evans <leonerd@leonerd.org.uk>
=cut
0x55AA;
( run in 1.084 second using v1.01-cache-2.11-cpan-39bf76dae61 )