<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, May 23, 2018 at 7:46 AM, Yuya Nishihara <span dir="ltr"><<a href="mailto:yuya@tcha.org" target="_blank">yuya@tcha.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"># HG changeset patch<br>
# User Yuya Nishihara <<a href="mailto:yuya@tcha.org">yuya@tcha.org</a>><br>
# Date 1526646246 -32400<br>
# Fri May 18 21:24:06 2018 +0900<br>
# Branch stable<br>
# Node ID d99bba4101af58e3e83dab60b644bb<wbr>687794e6d9<br>
# Parent d46a38c07b1a2ba451e22e57aa22fd<wbr>1308f2046f<br>
lock: add internal config to not replace signal handlers while locking<br></blockquote><div><br></div><div>Queued for stable.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
signal.signal() is blocked in some WSGI environments, and a horrible warning<br>
is sent to the server log. So we need a way to disable it, and I think<br>
abusing ui.config is the simplest workaround.<br>
<br>
diff --git a/mercurial/configitems.py b/mercurial/configitems.py<br>
--- a/mercurial/configitems.py<br>
+++ b/mercurial/configitems.py<br>
@@ -1127,6 +1127,9 @@ coreconfigitem('ui', 'report_untrusted',<br>
coreconfigitem('ui', 'rollback',<br>
default=True,<br>
)<br>
+coreconfigitem('ui', 'signal-safe-lock',<br>
+ default=True,<br>
+)<br>
coreconfigitem('ui', 'slash',<br>
default=False,<br>
)<br>
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py<br>
--- a/mercurial/localrepo.py<br>
+++ b/mercurial/localrepo.py<br>
@@ -1693,12 +1693,15 @@ class localrepository(object):<br>
if wait:<br>
timeout = self.ui.configint("ui", "timeout")<br>
warntimeout = self.ui.configint("ui", "timeout.warn")<br>
+ # internal config: ui.signal-safe-lock<br>
+ signalsafe = self.ui.configbool('ui', 'signal-safe-lock')<br>
<br>
l = lockmod.trylock(self.ui, vfs, lockname, timeout, warntimeout,<br>
releasefn=releasefn,<br>
acquirefn=acquirefn, desc=desc,<br>
inheritchecker=inheritchecker,<br>
- parentlock=parentlock)<br>
+ parentlock=parentlock,<br>
+ signalsafe=signalsafe)<br>
return l<br>
<br>
def _afterlock(self, callback):<br>
diff --git a/mercurial/lock.py b/mercurial/lock.py<br>
--- a/mercurial/lock.py<br>
+++ b/mercurial/lock.py<br>
@@ -21,6 +21,7 @@ from . import (<br>
encoding,<br>
error,<br>
pycompat,<br>
+ util,<br>
)<br>
<br>
from .utils import (<br>
@@ -177,7 +178,7 @@ class lock(object):<br>
<br>
def __init__(self, vfs, fname, timeout=-1, releasefn=None, acquirefn=None,<br>
desc=None, inheritchecker=None, parentlock=None,<br>
- dolock=True):<br>
+ signalsafe=True, dolock=True):<br>
self.vfs = vfs<br>
self.f = fname<br>
self.held = 0<br>
@@ -189,6 +190,10 @@ class lock(object):<br>
self.parentlock = parentlock<br>
self._parentheld = False<br>
self._inherited = False<br>
+ if signalsafe:<br>
+ self._maybedelayedinterrupt = _delayedinterrupt<br>
+ else:<br>
+ self._maybedelayedinterrupt = util.nullcontextmanager<br>
self.postrelease = []<br>
self.pid = self._getpid()<br>
if dolock:<br>
@@ -244,7 +249,7 @@ class lock(object):<br>
while not self.held and retry:<br>
retry -= 1<br>
try:<br>
- with _delayedinterrupt():<br>
+ with self._maybedelayedinterrupt():<br>
self.vfs.makelock(lockname, self.f)<br>
self.held = 1<br>
except (OSError, IOError) as why:<br>
______________________________<wbr>_________________<br>
Mercurial-devel mailing list<br>
<a href="mailto:Mercurial-devel@mercurial-scm.org">Mercurial-devel@mercurial-scm.<wbr>org</a><br>
<a href="https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel" rel="noreferrer" target="_blank">https://www.mercurial-scm.org/<wbr>mailman/listinfo/mercurial-<wbr>devel</a><br>
</blockquote></div><br></div></div>