Without commenting on the design of this, it does seem like you have a
typo in your start_tasks sub:
my $delay_id = $poe_kernel->delay_set("task_kill",$timeout,$task);
should be:
my $delay_id = $poe_kernel->delay_set("task_kill",$timeout,$task->ID);
After the change it seems to start working. I think you were catching
the wrong thing on your ARG0 in the task_kill handler. See?
On 6/7/05, phaidros <[EMAIL PROTECTED]> wrote:
> hi gurus, ; )
>
> I have taken an example from the cookbook and modified it, that it
> handles the childs after a certain timout. they shall get killed and the
> kernel shall end.
> I still have problems that the kernel never returns. I have read alot of
> urls friendly people pointed me to in #poe, but still are questions open.
> runninf the script with sub POE::Kernel::TRACE_REFCNT () { 1 }, shows me
> int the end 1 open event and 5 Files.
> I think the event is the sighandler I set up and the files are the
> Filter::References(?).
> as I'm not able to find out, how to address the left events and files to
> dereference, this as my question here:
> how do I get rid of the balast the kernel still is carriyng around?
>
> the code comes here:
>
> #!/usr/bin/perl -w
>
> $|=1; #unbuffered input
>
> use strict;
> use warnings;
>
> #sub POE::Kernel::TRACE_REFCNT () { 1 }
> use POE qw(Wheel::Run Filter::Reference);
>
> our %alarms;
> my @tasks = ("1_1","2_2","3_3","4_2","5_1");
> my $count = scalar @tasks;
> print "we have $count tasks to do\n";
> sub MAX_CONCURRENT_TASKS () { $count }
>
> # variables and stuff done here
>
> POE::Session->create
> ( inline_states =>
> { _start => \&start_tasks,
> next_task => \&start_tasks,
> task_result => \&handle_task_result,
> task_done => \&handle_task_done,
> task_debug => \&handle_task_debug,
> task_kill => \&handle_task_done,
> }
> );
>
> sub start_tasks {
> my $heap = $_[HEAP];
> $poe_kernel->sig(CHLD => 'reaper');
> while ( keys( %{ $heap->{task} } ) < MAX_CONCURRENT_TASKS ) {
> my $next_task = shift @tasks;
> last unless defined $next_task;
> my @task_args = split(/_/, $next_task);
> my $task = POE::Wheel::Run->new
> ( Program => sub { do_stuff($task_args[0], $task_args[1]) },
> StdoutFilter => POE::Filter::Reference->new(),
> StdoutEvent => "task_result",
> StderrEvent => "task_debug",
> CloseEvent => "task_done",
> );
> print "wheel $task is running with: name \"$task_args[0]\" and
> param \"$task_args[1]\"\n";
> my $timeout = 2;
> my $delay_id = $poe_kernel->delay_set("task_kill",$timeout,$task);
> $alarms{$task} = $delay_id ;
> $heap->{task}->{ $task->ID } = $task;
> }
> }
>
> sub reaper {
> my ($self, $kernel, $heap) = @_[OBJECT, KERNEL, HEAP];
> if ($heap->{task}->ID ) {
> print STDERR "child has died prematurely\n";
> } else {
> print STDERR "child has completed when the counter ran out\n";
> }
> #($self->{task}->ID) = undef;
> $kernel->sig_handled;
> }
>
> sub regx{
> #do sumthing
> my $result = shift;
> return("done");
> }
>
> sub do_stuff {
> my $name = shift;
> my $param = shift;
> my $filter = POE::Filter::Reference->new();
> # some dummy action here
> my $ergebnis = regx($name);
> my %result =
> ( task => $name,
> status => "$ergebnis"
> );
> my $output = $filter->put( [ \%result ] );
> print @$output;
> }
>
> sub handle_task_result {
> my $result = $_[ARG0];
> print "$result->{task} returned: $result->{status}\n";
> }
>
> sub handle_task_debug {
> my $result = $_[ARG0];
> print "Debug: $result\n";
> }
>
> sub handle_task_done {
> my ( $kernel, $heap, $task_id ) = @_[ KERNEL, HEAP, ARG0 ];
> delete $heap->{task}->{$task_id};
> }
>
> sub handle_task_kill {
> my ( $kernel, $heap, $task_id ) = @_[ KERNEL, HEAP, ARG0 ];
> $kernel->refcount_decrement( $heap->{task}->{$task_id} );
> $task_id->kill();
> delete $heap->{task}->{$task_id};
> my $delay_id = $alarms{$task_id};
> $kernel->alarm_remove($delay_id);
> }
>
> $poe_kernel->run();
> print STDERR "kernel now finished. we can continue with sumthin else\n";
> exit 0;
>
>
>
> regards,
> phai
>
> --
> better burn out than fade away ..
>