summaryrefslogtreecommitdiff
path: root/IkiWiki
diff options
context:
space:
mode:
authorJoey Hess <joey@kodama.kitenet.net>2008-10-26 15:13:04 -0400
committerJoey Hess <joey@kodama.kitenet.net>2008-10-26 15:13:04 -0400
commitd3d399941061d95cd4aae6ae2cf7594a4e5e7452 (patch)
tree7bf4eef2282129ad83027df18d6cebc2b75f5d53 /IkiWiki
parent7ddea03684df47c861c264216b83e7653d6784fd (diff)
do no-op post_commit test in wrapper
This speeds up web commits by 1/4th of a second or so, since perl does not have to start up for the post commit hook. perl's locking is completly FuBar, since it's impossible to tell what perl flock() really does, and thus difficult to write code in other languages that interoperates with perl's locking. (Let alone interoperating with existing fcntl locking from perl...) In this particular case, I think I was able to find a way to avoid the insanity, mostly. The C code does a true flock(2), and if perl is using an incompatable lock method that does not use the same locking primative at the kernel level, then the C code's test will fail, and it will go ahead and run the perl code. Then the perl code's test will test the right thing. On Debian, at least lately, perl's flock() does a true flock(2), so the optimisation does work.
Diffstat (limited to 'IkiWiki')
-rw-r--r--IkiWiki/Wrapper.pm31
1 files changed, 30 insertions, 1 deletions
diff --git a/IkiWiki/Wrapper.pm b/IkiWiki/Wrapper.pm
index fd8a0e5b0..99237d3b5 100644
--- a/IkiWiki/Wrapper.pm
+++ b/IkiWiki/Wrapper.pm
@@ -31,7 +31,7 @@ sub gen_wrapper () { #{{{
HTTP_COOKIE REMOTE_USER HTTPS} if $config{cgi};
my $envsave="";
foreach my $var (@envsave) {
- $envsave.=<<"EOF"
+ $envsave.=<<"EOF";
if ((s=getenv("$var")))
addenv("$var", s);
EOF
@@ -43,6 +43,31 @@ EOF
$test_receive=IkiWiki::Receive::gen_wrapper();
}
+ my $check_commit_hook="";
+ if ($config{post_commit}) {
+ # Optimise checking !commit_hook_enabled() ,
+ # so that ikiwiki does not have to be started if the
+ # hook is disabled.
+ #
+ # Note that perl's flock may be implemented using fcntl
+ # or lockf on some systems. If so, and if there is no
+ # interop between the locking systems, the true C flock will
+ # always succeed, and this optimisation won't work.
+ # The perl code will later correctly check the lock,
+ # so the right thing will still happen, though without
+ # the benefit of this optimisation.
+ $check_commit_hook=<<"EOF";
+ {
+ int fd=open("$config{wikistatedir}/commitlock", O_CREAT | O_RDWR);
+ if (fd != -1) {
+ if (flock(fd, LOCK_SH | LOCK_NB) != 0)
+ exit(0);
+ close(fd);
+ }
+ }
+EOF
+ }
+
$Data::Dumper::Indent=0; # no newlines
my $configstring=Data::Dumper->Dump([\%config], ['*config']);
$configstring=~s/\\/\\\\/g;
@@ -56,9 +81,12 @@ EOF
/* A wrapper for ikiwiki, can be safely made suid. */
#include <stdio.h>
#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/file.h>
extern char **environ;
char *newenviron[$#envsave+6];
@@ -75,6 +103,7 @@ addenv(char *var, char *val) {
int main (int argc, char **argv) {
char *s;
+$check_commit_hook
$test_receive
$envsave
newenviron[i++]="HOME=$ENV{HOME}";