debug("wiki is locked by another process, not aggregating");
exit 1;
}
-
- loadstate();
- IkiWiki::loadindex();
- aggregate();
- expire();
- savestate();
- clearstate();
-
+
+ # Fork a child process to handle the aggregation.
+ # The parent process will then handle building the result.
+ # This avoids messy code to clear state accumulated while
+ # aggregating.
+ defined(my $pid = fork) or error("Can't fork: $!");
+ if (! $pid) {
+ loadstate();
+ IkiWiki::loadindex();
+ aggregate();
+ expire();
+ savestate();
+ exit 0;
+ }
+ waitpid($pid,0);
+ if ($?) {
+ error "aggregation failed with code $?";
+ }
+
IkiWiki::unlockwiki();
}
} #}}}
error("rename $newfile: $!", $cleanup);
} #}}}
-sub clearstate () { #{{{
- %feeds=();
- %guids=();
- $state_loaded=0;
-} #}}}
-
sub expire () { #{{{
foreach my $feed (values %feeds) {
next unless $feed->{expireage} || $feed->{expirecount};