diff --git a/lib/sessions/downloader.pm b/lib/sessions/downloader.pm index bdc831cae9f115aada13743f93a294d1bc37b19e..0195c5e11a071bd15a8fd692e0d1bbb6918fad39 100644 --- a/lib/sessions/downloader.pm +++ b/lib/sessions/downloader.pm @@ -18,13 +18,16 @@ POE::Session->create( filename => \&sessions::downloader::ddl::filename, signal_filename => \&sessions::downloader::ddl::signal_filename, signal_ddl => \&sessions::downloader::ddl::signal_ddl, + end_task => \&sessions::downloader::ddl::end_task, }, ); sub on_start { - my $kernel = $_[KERNEL]; + my ($kernel, $heap) = @_[KERNEL, HEAP]; $kernel->alias_set('downloader'); + $heap->{ddl}->{tasks} = []; + $log->info("session started"); } diff --git a/lib/sessions/downloader/ddl.pm b/lib/sessions/downloader/ddl.pm index 57aa46126e813702914de634f65223e8a2c4c5ef..05bb2685b68cf1b4208339ccc93b172de10110f6 100644 --- a/lib/sessions/downloader/ddl.pm +++ b/lib/sessions/downloader/ddl.pm @@ -27,6 +27,14 @@ sub exec { return if (not $id or not $url); $log->debug("DDL '$id' '$url' "); + # is there already a task running ? + if ($heap->{ddl}->{running}) { + push $heap->{ddl}->{tasks}, [$id, $url]; + return; + } + + $heap->{ddl}->{running} = 1; + # first we need to got filename my $child = POE::Wheel::Run->new( Program => [ @@ -75,6 +83,7 @@ sub signal_filename { $log->error("error getting filename for $id : $status"); $heap->{ddl}->{pb}->{$id}->{child} = undef; + $kernel->yield("end_task"); return; } @@ -103,7 +112,7 @@ sub signal_filename { sub signal_ddl { $log->debug("DDL"); - my ($heap, $pid, $status) = @_[HEAP, ARG1, ARG2]; + my ($kernel, $heap, $pid, $status) = @_[KERNEL, HEAP, ARG1, ARG2]; my $child = delete $heap->{ddl}->{pid}->{$pid}; my $id = delete $heap->{ddl}->{wid}->{$child->ID}; @@ -111,13 +120,26 @@ sub signal_ddl { if ($status ne "0") { $log->error("error downloading $id : $status"); - return; + } + else { + eval { + utils::db::set_filename($id, $heap->{ddl}->{pb}->{$id}->{filename}); + }; + $log->error($@) if ($@); } - eval { - utils::db::set_filename($id, $heap->{ddl}->{pb}->{$id}->{filename}); - }; - $log->error($@) if ($@); + $kernel->yield("end_task"); +} + +sub end_task { + my ($kernel, $heap) = @_[KERNEL, HEAP]; + + $heap->{ddl}->{running} = 0; + + if (@{ $heap->{ddl}->{tasks} }) { + my $task = shift $heap->{ddl}->{tasks}; + $kernel->yield(ddl => $task->[0], $task->[1]); + } } 1;