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