-Sample patch, with stub functions for the new lock:
-
-[[toggle text="expand patch"]]
-[[toggleable text="""
-<pre>
-Index: IkiWiki/CGI.pm
-===================================================================
---- IkiWiki/CGI.pm (revision 2774)
-+++ IkiWiki/CGI.pm (working copy)
-@@ -494,9 +494,14 @@
- $content=~s/\r\n/\n/g;
- $content=~s/\r/\n/g;
-
-+ lockwc_exclusive();
-+
- $config{cgi}=0; # avoid cgi error message
- eval { writefile($file, $config{srcdir}, $content) };
- $config{cgi}=1;
-+
-+ lockwc_shared();
-+
- if ($@) {
- $form->field(name => "rcsinfo", value => rcs_prepedit($file),
- force => 1);
-Index: IkiWiki/Plugin/poll.pm
-===================================================================
---- IkiWiki/Plugin/poll.pm (revision 2770)
-+++ IkiWiki/Plugin/poll.pm (working copy)
-@@ -120,7 +120,9 @@
- $content =~ s{(\\?)\[\[poll\s+([^]]+)\s*\]\]}{$edit->($1, $2)}seg;
-
- # Store their vote, update the page, and redirect to it.
-+ IkiWiki::lockwc_exclusive();
- writefile($pagesources{$page}, $config{srcdir}, $content);
-+ IkiWiki::lockwc_shared();
- $session->param($choice_param, $choice);
- IkiWiki::cgi_savesession($session);
- $oldchoice=$session->param($choice_param);
-@@ -130,6 +132,10 @@
- IkiWiki::rcs_commit($pagesources{$page}, "poll vote ($choice)",
- IkiWiki::rcs_prepedit($pagesources{$page}),
- $session->param("name"), $ENV{REMOTE_ADDR});
-+ # Make sure that the repo is up-to-date;
-+ # locking prevents the post-commit hook
-+ # from updating it.
-+ rcs_update();
- }
- else {
- require IkiWiki::Render;
-Index: ikiwiki.in
-===================================================================
---- ikiwiki.in (revision 2770)
-+++ ikiwiki.in (working copy)
-@@ -121,6 +121,7 @@
- lockwiki();
- loadindex();
- require IkiWiki::Render;
-+ lockwc_shared();
- rcs_update();
- refresh();
- rcs_notify() if $config{notify};
-Index: IkiWiki.pm
-===================================================================
---- IkiWiki.pm (revision 2770)
-+++ IkiWiki.pm (working copy)
-@@ -617,6 +617,29 @@
- close WIKILOCK;
- } #}}}
-
-+sub lockwc_exclusive () { #{{{
-+ # Take an exclusive lock on the working copy.
-+ # The lock will be dropped on program exit.
-+ # Note: This lock should only be taken _after_ the main wiki
-+ # lock.
-+
-+ # TODO
-+} #}}}
-+
-+sub lockwc_shared () { #{{{
-+ # Take a shared lock on the working copy. If an exclusive lock
-+ # already exists, downgrade it to a shared lock.
-+ # The lock will be dropped on program exit.
-+ # Note: This lock should only be taken _after_ the main wiki
-+ # lock.
-+
-+ # TODO
-+} #}}}
-+
-+sub unlockwc () { #{{{
-+ close WIKIWCLOCK;
-+} #}}}
-+
- sub loadindex () { #{{{
- open (IN, "$config{wikistatedir}/index") || return;
- while (<IN>) {
-</pre>
-"""]]