1 package MooseX::Runnable::Invocation::Plugin::Restart::Base;
3 use MooseX::Types::Moose qw(Int);
4 use namespace::autoclean;
9 clearer => 'clear_child_pid',
10 predicate => 'has_child_pid',
13 requires 'run_parent_loop';
15 my $is_debug = sub { return 1;
16 $_[0]->meta->does_role('MooseX::Runnable::Invocation::Plugin::Debug');
19 sub _restart_parent_setup {
25 return unless $self->has_child_pid;
26 eval { $self->_debug_message("Restarting...") };
27 kill 'HUP', $self->child_pid;
32 return unless $self->has_child_pid;
33 eval { $self->_debug_message("Killing ", $self->child_pid) };
35 kill 'KILL', $self->child_pid;
36 $self->clear_child_pid;
40 my ($next, $self, @args) = @_;
43 local $SIG{CHLD} = 'IGNORE';
46 $self->child_pid( $pid );
47 $self->_restart_parent_setup;
49 my $code = $self->run_parent_loop;
50 eval { $self->_debug_message("Shutting down.") };
56 # we go to all this effort so that the child process is always
57 # free of any "infection" by the parent (like the event loop,
58 # used by the parent to receive filesystem events or signals,
59 # which can't be cancelled by the child)
61 my $child_body; $child_body = sub {
65 # parent? wait for kid to die
66 local $SIG{HUP} = sub {
73 # child? actually do the work
74 exit $self->$next(@args);