* aggregate: Fork a child process to handle the aggregation. This simplifies
authorJoey Hess <joey@kodama.kitenet.net>
Thu, 24 Jan 2008 22:22:39 +0000 (17:22 -0500)
committerJoey Hess <joey@kodama.kitenet.net>
Thu, 24 Jan 2008 22:22:39 +0000 (17:22 -0500)
  the code, since that process can change internal state as needed, and
  it will automatically be cleaned up for the parent process, which proceeds
  to render the changes.

IkiWiki/Plugin/aggregate.pm
debian/changelog

index 0da527f25e7bff733b0f64473e6fc7f67d323982..09ea5902938b16030ab75ced886288a4e5497454 100644 (file)
@@ -37,14 +37,25 @@ sub checkconfig () { #{{{
                        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();
        }
 } #}}}
@@ -211,12 +222,6 @@ sub savestate () { #{{{
                error("rename $newfile: $!", $cleanup);
 } #}}}
 
-sub clearstate () { #{{{
-       %feeds=();
-       %guids=();
-       $state_loaded=0;
-} #}}}
-
 sub expire () { #{{{
        foreach my $feed (values %feeds) {
                next unless $feed->{expireage} || $feed->{expirecount};
index f5e0b242ebe61903c21e86483c89fe27b2feb02e..d2fed8767372ba33855986b74a1395f1085fb7ed 100644 (file)
@@ -5,6 +5,10 @@ ikiwiki (2.21) UNRELEASED; urgency=low
     those older versions too.
   * aggregate: Don't let feeds set creation times for pages in the future.
   * Add full parser for git diff-tree output (Brian Downing)
+  * aggregate: Fork a child process to handle the aggregation. This simplifies
+    the code, since that process can change internal state as needed, and 
+    it will automatically be cleaned up for the parent process, which proceeds
+    to render the changes.
 
  -- Joey Hess <joeyh@debian.org>  Fri, 11 Jan 2008 15:09:37 -0500