Hello community, here is the log from the commit of package perl-Mojo-IOLoop-ReadWriteProcess for openSUSE:Factory checked in at 2018-02-26 23:26:28 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/perl-Mojo-IOLoop-ReadWriteProcess (Old) and /work/SRC/openSUSE:Factory/.perl-Mojo-IOLoop-ReadWriteProcess.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Mojo-IOLoop-ReadWriteProcess" Mon Feb 26 23:26:28 2018 rev:3 rq:580200 version:0.19 Changes: -------- --- /work/SRC/openSUSE:Factory/perl-Mojo-IOLoop-ReadWriteProcess/perl-Mojo-IOLoop-ReadWriteProcess.changes 2018-02-20 17:55:33.637415858 +0100 +++ /work/SRC/openSUSE:Factory/.perl-Mojo-IOLoop-ReadWriteProcess.new/perl-Mojo-IOLoop-ReadWriteProcess.changes 2018-02-26 23:26:31.647365981 +0100 @@ -1,0 +2,20 @@ +Mon Feb 26 09:20:31 UTC 2018 - edigiaci...@suse.com + +- updated to 0.19 + + 0.19 2018-02-22T13:41:50Z + + - Minor bugfixes to Session + - Make session constructor fixed + + 0.18 2018-02-21T12:01:07Z + + - Guard stop() from possible race conditions + - Fix typo in Session, it caused orphan processes to not be resolved correctly + + 0.17 2018-02-20T14:01:59Z + + - Fix minor issue in tests, stabilize serialize test and events + - Reset session and subreaper bit on forked child process + +------------------------------------------------------------------- Old: ---- Mojo-IOLoop-ReadWriteProcess-0.16.tar.gz New: ---- Mojo-IOLoop-ReadWriteProcess-0.19.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ perl-Mojo-IOLoop-ReadWriteProcess.spec ++++++ --- /var/tmp/diff_new_pack.vYPwMt/_old 2018-02-26 23:26:32.511334909 +0100 +++ /var/tmp/diff_new_pack.vYPwMt/_new 2018-02-26 23:26:32.515334764 +0100 @@ -17,7 +17,7 @@ Name: perl-Mojo-IOLoop-ReadWriteProcess -Version: 0.16 +Version: 0.19 Release: 0 %define cpan_name Mojo-IOLoop-ReadWriteProcess Summary: Execute external programs or internal code blocks as separate process ++++++ Mojo-IOLoop-ReadWriteProcess-0.16.tar.gz -> Mojo-IOLoop-ReadWriteProcess-0.19.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.16/Changes new/Mojo-IOLoop-ReadWriteProcess-0.19/Changes --- old/Mojo-IOLoop-ReadWriteProcess-0.16/Changes 2018-02-19 14:36:01.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.19/Changes 2018-02-22 14:44:36.000000000 +0100 @@ -1,5 +1,20 @@ Revision history for Perl extension Mojo-IOLoop-ReadWriteProcess +0.19 2018-02-22T13:41:50Z + + - Minor bugfixes to Session + - Make session constructor fixed + +0.18 2018-02-21T12:01:07Z + + - Guard stop() from possible race conditions + - Fix typo in Session, it caused orphan processes to not be resolved correctly + +0.17 2018-02-20T14:01:59Z + + - Fix minor issue in tests, stabilize serialize test and events + - Reset session and subreaper bit on forked child process + 0.16 2018-02-19T13:32:54Z - Fix minor issue in event test that made them unstable diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.16/META.json new/Mojo-IOLoop-ReadWriteProcess-0.19/META.json --- old/Mojo-IOLoop-ReadWriteProcess-0.16/META.json 2018-02-19 14:36:01.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.19/META.json 2018-02-22 14:44:36.000000000 +0100 @@ -55,7 +55,7 @@ "provides" : { "Mojo::IOLoop::ReadWriteProcess" : { "file" : "lib/Mojo/IOLoop/ReadWriteProcess.pm", - "version" : "0.16" + "version" : "0.19" }, "Mojo::IOLoop::ReadWriteProcess::Exception" : { "file" : "lib/Mojo/IOLoop/ReadWriteProcess/Exception.pm" @@ -81,7 +81,7 @@ "web" : "https://github.com/mudler/Mojo-IOLoop-ReadWriteProcess" } }, - "version" : "0.16", + "version" : "0.19", "x_contributors" : [ "Ettore Di Giacinto <mud...@gentoo.org>", "Ettore Di Giacinto <mud...@users.noreply.github.com>" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.16/META.yml new/Mojo-IOLoop-ReadWriteProcess-0.19/META.yml --- old/Mojo-IOLoop-ReadWriteProcess-0.16/META.yml 2018-02-19 14:36:01.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.19/META.yml 2018-02-22 14:44:36.000000000 +0100 @@ -27,7 +27,7 @@ provides: Mojo::IOLoop::ReadWriteProcess: file: lib/Mojo/IOLoop/ReadWriteProcess.pm - version: '0.16' + version: '0.19' Mojo::IOLoop::ReadWriteProcess::Exception: file: lib/Mojo/IOLoop/ReadWriteProcess/Exception.pm Mojo::IOLoop::ReadWriteProcess::Pool: @@ -42,7 +42,7 @@ bugtracker: https://github.com/mudler/Mojo-IOLoop-ReadWriteProcess/issues homepage: https://github.com/mudler/Mojo-IOLoop-ReadWriteProcess repository: git://github.com/mudler/Mojo-IOLoop-ReadWriteProcess.git -version: '0.16' +version: '0.19' x_contributors: - 'Ettore Di Giacinto <mud...@gentoo.org>' - 'Ettore Di Giacinto <mud...@users.noreply.github.com>' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.16/lib/Mojo/IOLoop/ReadWriteProcess/Session.pm new/Mojo-IOLoop-ReadWriteProcess-0.19/lib/Mojo/IOLoop/ReadWriteProcess/Session.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.16/lib/Mojo/IOLoop/ReadWriteProcess/Session.pm 2018-02-19 14:36:01.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.19/lib/Mojo/IOLoop/ReadWriteProcess/Session.pm 2018-02-22 14:44:36.000000000 +0100 @@ -24,7 +24,8 @@ has 'handler'; my $singleton; -sub new { $singleton ||= shift->SUPER::new(@_); } + +sub new { $singleton ||= __PACKAGE__->SUPER::new } sub disable { $singleton->_protect(sub { $SIG{CHLD} = $singleton->handler() }); @@ -91,12 +92,12 @@ my ($el, $w) = (pop, pop); return exists $singleton->{$w}->{$el} ? - $el eq 'orphan' + $w eq 'orphans' ? $singleton->{$w}->{$el} : ${$singleton->{$w}->{$el}} : undef; } -sub orphan { _resolve(orphan => pop()) } +sub orphan { _resolve(orphans => pop()) } sub resolve { _resolve(process_table => pop()) } sub clean { @@ -119,22 +120,17 @@ $singleton->all->grep(sub { $_->pid eq $pid })->size == 1; } -sub reset { - $_[0]->{events} = {}; - $_[0]->orphans({}); - shift->process_table({}); -} +sub reset { @{+shift}{qw(events orphans process_table)} = ({}, {}, {}) } +# XXX: This should be replaced by PR_GET_CHILD_SUBREAPER sub disable_subreaper { - $singleton->subreaper(1) - unless $singleton->_prctl(PR_SET_CHILD_SUBREAPER, 0) == 0; - $singleton; + $singleton->subreaper( + $singleton->_prctl(PR_SET_CHILD_SUBREAPER, 0) == 0 ? 0 : 1); } sub enable_subreaper { - $singleton->subreaper(0) - unless $singleton->_prctl(PR_SET_CHILD_SUBREAPER, 1) == 0; - $singleton; + $singleton->subreaper( + $singleton->_prctl(PR_SET_CHILD_SUBREAPER, 1) == 0 ? 1 : 0); } sub _get_prctl_syscall { @@ -449,7 +445,7 @@ =head2 register() use Mojo::IOLoop::ReadWriteProcess::Session qw(session); - my $process = session->register(Mojo::IOLoop::ReadWriteProcess->new); + my $process = session->register('pid' => Mojo::IOLoop::ReadWriteProcess->new); Register the L<Mojo::IOLoop::ReadWriteProcess> process to the session. @@ -463,7 +459,7 @@ =head2 collect() use Mojo::IOLoop::ReadWriteProcess::Session qw(session); - my $process = session->collect(123342, 0, undef); + my $process = session->collect(123342 => 0 => undef); Collect the status for the given pid. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.16/lib/Mojo/IOLoop/ReadWriteProcess.pm new/Mojo-IOLoop-ReadWriteProcess-0.19/lib/Mojo/IOLoop/ReadWriteProcess.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.16/lib/Mojo/IOLoop/ReadWriteProcess.pm 2018-02-19 14:36:01.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.19/lib/Mojo/IOLoop/ReadWriteProcess.pm 2018-02-22 14:44:36.000000000 +0100 @@ -1,6 +1,6 @@ package Mojo::IOLoop::ReadWriteProcess; -our $VERSION = '0.16'; +our $VERSION = '0.19'; use Mojo::Base 'Mojo::EventEmitter'; use Mojo::File 'path'; @@ -97,7 +97,7 @@ return unless $self; - $self->_status($? // $e); + $self->_status($e // $?) unless defined $self->_status; $self->_diag("Forked code Process Exit status: " . $self->exit_status) if DEBUG; @@ -139,9 +139,16 @@ sub _collect { my ($self, $pid) = @_; $pid //= $self->pid; - waitpid $pid, 0; - return $self->_open_collect_status($pid) if $self->execute; - return $self->_fork_collect_status($pid) if $self->code; + + $self->session->_protect( + sub { + local $?; + waitpid $pid, 0 unless defined $self->_status; + return $self->_open_collect_status($pid) if $self->execute; + return $self->_fork_collect_status($pid) if $self->code; + }); + + $self; } sub _fork_collect_status { @@ -154,7 +161,7 @@ my $rt; my @result_error; - $self->_status($? // $e); + $self->_status($e // $?) unless defined $self->_status; $self->_diag("Forked code Process Exit status: " . $self->exit_status) if DEBUG; @@ -295,6 +302,8 @@ for qw(read_stream error_stream write_stream channel_in channel_out); } $self->session->reset; + $self->session->subreaper(0); # Subreaper bit does not persist in fork + $! = 0; my $rt; eval { $rt = [$code->($self, @args)]; }; @@ -353,8 +362,12 @@ sub wait_stop { shift->wait->stop } sub errored { !!@{shift->error} ? 1 : 0 } sub exit_status { defined $_[0]->_status ? shift->_status >> 8 : undef } -sub restart { $_[0]->is_running ? $_[0]->stop->start : $_[0]->start; } -sub is_running { $_[0]->process_id ? kill 0 => $_[0]->process_id : 0; } + +sub restart { + $_[0]->{_status} = undef; + $_[0]->is_running ? $_[0]->stop->start : $_[0]->start; +} +sub is_running { $_[0]->process_id ? kill 0 => $_[0]->process_id : 0; } sub write_pidfile { my ($self, $pidfile) = @_; @@ -444,7 +457,7 @@ } sub send_signal { - my $self = shift; + my $self = shift; my $signal = shift // $self->_default_kill_signal; return unless $self->is_running; $self->_diag("Sending signal '$signal' to " . $self->process_id) if DEBUG; @@ -454,6 +467,11 @@ sub stop { my $self = shift; + + return $self unless defined $self->pid; + + $self->_diag("Stopping " . $self->pid) if DEBUG; + return $self->_shutdown(1) unless $self->is_running; my $ret; @@ -468,9 +486,13 @@ . $self->pid) if DEBUG; sleep $self->sleeptime_during_kill if $self->sleeptime_during_kill; - $self->send_signal(); - $ret = waitpid($self->process_id, WNOHANG); - $self->_status($?); + $self->session->_protect( + sub { + local $?; + $self->send_signal(); + $ret = waitpid($self->process_id, WNOHANG); + $self->_status($?) if $ret == $self->process_id; + }); $attempt++; } @@ -480,9 +502,12 @@ $self->_diag( "Could not kill process id: " . $self->process_id . ", blocking attempt") if DEBUG; - $self->emit('process_stuck')->send_signal($self->_default_blocking_signal); - waitpid($self->process_id, 0); - $self->_status($?); + $self->emit('process_stuck'); + + ### XXX: avoid to protect on blocking. + $self->send_signal($self->_default_blocking_signal); + $ret = waitpid($self->process_id, 0); + $self->_status($?) if $ret == $self->process_id; } elsif ($self->is_running) { $self->_diag("Could not kill process id: " . $self->process_id) if DEBUG; @@ -493,13 +518,23 @@ } sub _shutdown { - my $self = shift; - waitpid $self->pid, 0 if pop && $self->pid; - $self->emit('collect_status') if !defined $self->_status; + my ($self, $wait) = @_; + return $self unless $self->pid; + + $self->_diag("Shutdown " . $self->pid) if DEBUG; + $self->session->_protect( + sub { + local $?; + waitpid $self->pid, 0; + $self->emit('collect_status'); + }) if $wait && !defined $self->_status; + + $self->emit('collect_status') unless defined $self->_status; $self->_clean_pidfile; $self->emit('process_error', $self->error) if $self->error && $self->error->size > 0; $self->unsubscribe('collect_status'); + return $self->emit('stop'); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.16/t/02_parallel.t new/Mojo-IOLoop-ReadWriteProcess-0.19/t/02_parallel.t --- old/Mojo-IOLoop-ReadWriteProcess-0.16/t/02_parallel.t 2018-02-19 14:36:01.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.19/t/02_parallel.t 2018-02-22 14:44:36.000000000 +0100 @@ -133,16 +133,19 @@ plan skip_all => "set STRESS_TEST=1 (be careful)" unless $ENV{STRESS_TEST}; # Push the maximum_processes boundaries and let's see events are fired. - my $n_proc = 100; + my $n_proc = 2000; my $fired; my $p = pool; $p->maximum_processes($n_proc); - $p->add(code => sub { sleep 3; exit(20) }, internal_pipes => 0, set_pipes => 0) - for 1 .. $n_proc; + $p->add( + code => sub { sleep 3; exit(20) }, + internal_pipes => 0, + set_pipes => 0 + ) for 1 .. $n_proc; $p->once(stop => sub { $fired++ }); $p->start->wait; is $fired, $n_proc; - $p->each(sub {is $_->exit_status,"20"}); + $p->each(sub { is $_->exit_status, "20" }); }; done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.16/t/04_queues.t new/Mojo-IOLoop-ReadWriteProcess-0.19/t/04_queues.t --- old/Mojo-IOLoop-ReadWriteProcess-0.16/t/04_queues.t 2018-02-19 14:36:01.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.19/t/04_queues.t 2018-02-22 14:44:36.000000000 +0100 @@ -157,4 +157,44 @@ is(Mojo::IOLoop::ReadWriteProcess::Session->singleton->all->size, 40); is(Mojo::IOLoop::ReadWriteProcess::Session->singleton->all_orphans->size, 0); +subtest stress_test => sub { + plan skip_all => "set STRESS_TEST=1 (be careful)" unless $ENV{STRESS_TEST}; + Mojo::IOLoop::ReadWriteProcess::Session->singleton->reset; + + my $q = queue(); + $q->pool->maximum_processes(50); + $q->queue->maximum_processes(100000); + my $proc = 200; + my $fired; + my %output; + my $i = 1; + +# Started as long as resources allows (maximum_processes of the main pool) +# That requires then to subscribe for each process event's separately (manually) + for (1 .. $proc) { + my $p = process(sub { shift; sleep 4; exit shift() })->set_pipes(0) + ->internal_pipes(0)->args($i); + $p->once( + stop => sub { + $fired++; + $output{shift->exit_status}++; + }); + $q->add($p); + $i++; + } + + is $q->pool->maximum_processes, 50; + $q->consume; + is $q->queue->size, 0; + is $q->pool->size, 0; + is $q->done->size, $proc; + is $fired, $proc; + $i = 1; + for (1 .. $proc) { + is $output{$i}, 1 or diag explain \%output; + $i++; + } + is(Mojo::IOLoop::ReadWriteProcess::Session->singleton->all->size, 200); +}; + done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.16/t/05_serialize.t new/Mojo-IOLoop-ReadWriteProcess-0.19/t/05_serialize.t --- old/Mojo-IOLoop-ReadWriteProcess-0.16/t/05_serialize.t 2018-02-19 14:36:01.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.19/t/05_serialize.t 2018-02-22 14:44:36.000000000 +0100 @@ -21,44 +21,4 @@ is_deeply $p->return_status, [qw(12 13 14)] or diag explain $p->return_status; -my $q = queue; -$q->pool->maximum_processes(2); -$q->queue->maximum_processes(800); - -my $proc = 10; -my $fired; - -my $i = 1; -for (1 .. $proc) { - $q->add( - process( - serialize => 1, - code => sub { - shift; - return {$_[0] => $_[0]}; - } - )->args($i)); - $i++; -} - -my @output; -$q->once( - stop => sub { - $fired++; - push @output, shift->return_status; - }); -is $q->queue->size, $proc - $q->pool->maximum_processes; -is $q->pool->size, 2; -is $q->pool->maximum_processes, 2; -$q->consume; -is $fired, $proc; -is $q->queue->size, 0; -is $q->pool->size, 0; - -$i = 0; -for ($proc .. 1) { - is_deeply $output[$i], [{$i => $i}] or diag explain $output[$i]; - $i++; -} - done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.16/t/06_events.t new/Mojo-IOLoop-ReadWriteProcess-0.19/t/06_events.t --- old/Mojo-IOLoop-ReadWriteProcess-0.16/t/06_events.t 2018-02-19 14:36:01.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.19/t/06_events.t 2018-02-22 14:44:36.000000000 +0100 @@ -20,7 +20,7 @@ "You do not seem to have $test_script. The script is required to run the test" unless -e $test_script; my $reached; - my $collect; + my $collect = 0; my $p = process(sub { print "Hello\n" }); $p->session->collect_status(0); @@ -33,17 +33,14 @@ }); $p->start; - attempt { - attempts => 10, + attempts => 20, condition => sub { defined $reached && $reached == 1 }, - cb => sub { sleep 1 } + cb => sub { $p->signal(POSIX::SIGTERM); sleep 1; } }; - $p->stop; - is $reached, 1, 'SIG_CHLD fired'; - is $collect, 1, 'collect_status fired once'; + is $collect, 0, 'collect_status not fired'; is(Mojo::IOLoop::ReadWriteProcess::Session->singleton->all_orphans->size, 0); is(Mojo::IOLoop::ReadWriteProcess::Session->singleton->all->size, 1); @@ -52,6 +49,8 @@ my $p2 = process(execute => $test_script); $p2->session->collect_status(1); + $reached = 0; + $p2->on( SIG_CHLD => sub { my $self = shift; @@ -61,14 +60,13 @@ $p2->start; attempt { - attempts => 10, - condition => sub { defined $reached && $reached == 2 }, - cb => sub { sleep 1 } + attempts => 20, + condition => sub { defined $reached && $reached == 1 }, + cb => sub { $p2->signal(POSIX::SIGTERM); sleep 1; } }; - $p2->stop; - - is $reached, 2, 'SIG_CHLD fired'; + is $reached, 1, 'SIG_CHLD fired'; + ok defined($p2->exit_status), 'SIG_CHLD fired'; is(Mojo::IOLoop::ReadWriteProcess::Session->singleton->all_orphans->size, 0); is(Mojo::IOLoop::ReadWriteProcess::Session->singleton->all->size, 1); @@ -77,11 +75,9 @@ subtest collect_status => sub { session->reset; - my $collect; my $sigcld; my $p = process(sub { print "Hello\n" }); $p->session->collect_status(0); - $p->session->on(collect_status => sub { $collect++ }); $p->session->on( SIG_CHLD => sub { $sigcld++; @@ -92,12 +88,10 @@ attempt { attempts => 10, condition => sub { defined $sigcld && $sigcld == 1 }, - cb => sub { sleep 1 } + cb => sub { $p->signal(POSIX::SIGTERM); sleep 1 } }; - $p->stop(); - is $collect, undef, 'No collect_status fired'; - is $sigcld, 1, 'SIG_CHLD fired'; + is $sigcld, 1, 'SIG_CHLD fired'; is(Mojo::IOLoop::ReadWriteProcess::Session->singleton->all_orphans->size, 0); is(Mojo::IOLoop::ReadWriteProcess::Session->singleton->all->size, 1); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.16/t/09_session.t new/Mojo-IOLoop-ReadWriteProcess-0.19/t/09_session.t --- old/Mojo-IOLoop-ReadWriteProcess-0.16/t/09_session.t 2018-02-19 14:36:01.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.19/t/09_session.t 2018-02-22 14:44:36.000000000 +0100 @@ -6,7 +6,7 @@ use POSIX; use FindBin; use Mojo::File qw(tempfile path); -use lib ("$FindBin::Bin/lib", "../lib", "lib"); +use lib ( "$FindBin::Bin/lib", "../lib", "lib" ); use Mojo::IOLoop::ReadWriteProcess qw(process); use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt); @@ -15,51 +15,71 @@ use Mojo::IOLoop::ReadWriteProcess::Session qw(session); subtest register => sub { - my $s = Mojo::IOLoop::ReadWriteProcess::Session->singleton; - my $p = process(sub { }); - $s->register(1 => $p); + my $s = session; + my $p = process( sub { } ); + $s->register( 1 => $p ); - is_deeply ${$s->process_table()->{1}}, $p, 'Equal' or die diag explain $s; + is_deeply ${ $s->process_table()->{1} }, $p, 'Equal' or die diag explain $s; - ${$s->process_table()->{1}}->{foo} = 'bar'; + ${ $s->process_table()->{1} }->{foo} = 'bar'; - is $p->{foo}, 'bar'; + is $p->{foo}, 'bar'; - session->resolve(1)->{foo} = 'kaboom'; + session->resolve(1)->{foo} = 'kaboom'; - is $p->{foo}, 'kaboom'; + is $p->{foo}, 'kaboom'; }; - subtest unregister => sub { - session->clean(); + session->clean(); - my $p = process(sub { }); - session->register(1 => $p); + my $p = process( sub { } ); + session->register( 1 => $p ); - is_deeply ${session->process_table()->{1}}, $p, 'Equal' - or die diag explain session(); + is_deeply ${ session->process_table()->{1} }, $p, 'Equal' + or die diag explain session(); - session->unregister(1); - is session->all()->size, 0; - is session->resolve(1), undef; + session->unregister(1); + is session->all()->size, 0; + is session->resolve(1), undef; - session->register(1 => $p); - is session->all()->size, 1; + session->register( 1 => $p ); + is session->all()->size, 1; - session->clean(); - is session->all()->size, 0; + session->clean(); + is session->all()->size, 0; }; subtest disable => sub { - local $SIG{CHLD} = 'DEFAULT'; + local $SIG{CHLD} = 'DEFAULT'; + + session->enable(); + is session->handler, 'DEFAULT', 'previous handler saved'; + + isnt $SIG{CHLD}, 'DEFAULT', 'Handler has changed'; + session->disable(); + is $SIG{CHLD}, 'DEFAULT', 'handler restored'; +}; + +subtest reset => sub { + session->reset; + + session->register( 1 => process( sub { } ) ); + session->register( 2 => process( sub { } ) ); + session->register( 3 => process( sub { } ) ); + session->orphans->{5} = 1; + + is session->all->size, 4, 'There are 4 processes'; + session->reset(); + + is session->all->size, 0, 'Reset cleaned up processes'; + + session->on( foo => sub { 'bar' } ); - session->enable(); - is session->handler, 'DEFAULT', 'previous handler saved'; + is( ( values %{ session->{events} } ), 1, '1 event is present' ); + session->reset(); + is( ( values %{ session->{events} } ), 0, '0 events are present' ); - isnt $SIG{CHLD}, 'DEFAULT', 'Handler has changed'; - session->disable(); - is $SIG{CHLD}, 'DEFAULT', 'handler restored'; }; done_testing();