aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Wrapper.pm
diff options
context:
space:
mode:
authorJoey Hess <joey@kodama.kitenet.net>2008-11-11 20:48:02 -0500
committerJoey Hess <joey@kodama.kitenet.net>2008-11-11 20:48:02 -0500
commitecd4f0ee553cc3e11491f236763d6cc7cd6dd8a1 (patch)
tree6e70ee141d13b0822adcb7c86c8122b25fbb8660 /IkiWiki/Wrapper.pm
parent521d76e5082b5d32bf1fe85b55d85f54f2030090 (diff)
downloadikiwiki-ecd4f0ee553cc3e11491f236763d6cc7cd6dd8a1.tar
ikiwiki-ecd4f0ee553cc3e11491f236763d6cc7cd6dd8a1.tar.gz
make unlockwiki drop the cgilock
This is necessary so that things that fork to the background, like pinger, and inline ping, don't block other cgis from running. Note that websetup also calls unlockwiki, before refreshing / rebuilding the wiki. It makes perfect sense for that not to block other cgis.
Diffstat (limited to 'IkiWiki/Wrapper.pm')
-rw-r--r--IkiWiki/Wrapper.pm10
1 files changed, 7 insertions, 3 deletions
diff --git a/IkiWiki/Wrapper.pm b/IkiWiki/Wrapper.pm
index 7a2d4381a..31e30ad2e 100644
--- a/IkiWiki/Wrapper.pm
+++ b/IkiWiki/Wrapper.pm
@@ -72,12 +72,16 @@ EOF
# Avoid more than one ikiwiki cgi running at a time by
# taking a cgi lock. Since ikiwiki uses several MB of
# memory, a pile up of processes could cause thrashing
- # otherwise.
+ # otherwise. The fd of the lock is stored in
+ # IKIWIKI_CGILOCK_FD so unlockwiki can close it.
$pre_exec=<<"EOF";
{
int fd=open("$config{wikistatedir}/cgilock", O_CREAT | O_RDWR, 0666);
- if (fd != -1)
- flock(fd, LOCK_EX);
+ if (fd != -1 && flock(fd, LOCK_EX) == 0) {
+ char *fd_s;
+ asprintf(&fd_s, "%i", fd);
+ setenv("IKIWIKI_CGILOCK_FD", fd_s, 1);
+ }
}
EOF
}