diff options
author | Joey Hess <joey@kodama.kitenet.net> | 2008-10-26 15:13:04 -0400 |
---|---|---|
committer | Joey Hess <joey@kodama.kitenet.net> | 2008-10-26 15:13:04 -0400 |
commit | d3d399941061d95cd4aae6ae2cf7594a4e5e7452 (patch) | |
tree | 7bf4eef2282129ad83027df18d6cebc2b75f5d53 /IkiWiki | |
parent | 7ddea03684df47c861c264216b83e7653d6784fd (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.pm | 31 |
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}"; |