Commit | Line | Data |
469bd410 |
1 | package MooseX::Runnable::Invocation::Plugin::Restart; |
2 | use Moose::Role; |
3 | use MooseX::Types::Moose qw(Str); |
4 | use AnyEvent; |
5 | use namespace::autoclean; |
6 | |
2828ce0c |
7 | with 'MooseX::Runnable::Invocation::Plugin::Restart::Base', |
8 | 'MooseX::Runnable::Invocation::Plugin::Role::CmdlineArgs'; |
469bd410 |
9 | |
10 | has 'completion_condvar' => ( |
11 | is => 'ro', |
12 | isa => 'AnyEvent::CondVar', |
13 | required => 1, |
14 | default => sub { AnyEvent->condvar }, |
15 | ); |
16 | |
17 | has 'kill_signal' => ( |
18 | is => 'ro', |
19 | isa => Str, |
20 | required => 1, |
21 | default => sub { 'INT' }, |
22 | ); |
23 | |
24 | has 'restart_signal' => ( |
25 | is => 'ro', |
26 | isa => Str, |
27 | required => 1, |
28 | default => sub { 'HUP' }, |
29 | ); |
30 | |
a496e4e5 |
31 | sub _build_initargs_from_cmdline { |
32 | my ($class, @args) = @_; |
33 | confess 'Bad args passed to Restart plugin' |
34 | unless @args % 2 == 0; |
35 | |
36 | my %args = @args; |
37 | |
38 | my %res; |
39 | if(my $kill = $args{'--kill-signal'}){ |
40 | $res{kill_signal} = $kill; |
41 | } |
42 | if(my $res = $args{'--restart-signal'}){ |
43 | $res{restart_signal} = $res; |
44 | } |
45 | return \%res; |
46 | } |
47 | |
469bd410 |
48 | after '_restart_parent_setup' => sub { |
49 | my $self = shift; |
469bd410 |
50 | my ($kw, $rw); |
51 | $kw = AnyEvent->signal( signal => $self->kill_signal, cb => sub { |
52 | $self->kill_child; |
53 | undef $kw; |
54 | $self->completion_condvar->send(0); # parent exit code |
55 | }); |
56 | |
57 | $rw = AnyEvent->signal( signal => $self->restart_signal, cb => sub { |
58 | $rw = $rw; # closes over $rw and prevents it from being GC'd |
59 | $self->restart; |
60 | }); |
61 | }; |
62 | |
63 | sub run_parent_loop { |
64 | my $self = shift; |
65 | print {*STDERR} "Control pid is $$\n"; |
66 | return $self->completion_condvar->wait; |
67 | } |
68 | |
69 | 1; |