Mercurial > hg
comparison mercurial/lock.py @ 38038:8c828beb7543 stable
lock: add internal config to not replace signal handlers while locking
signal.signal() is blocked in some WSGI environments, and a horrible warning
is sent to the server log. So we need a way to disable it, and I think
abusing ui.config is the simplest workaround.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Fri, 18 May 2018 21:24:06 +0900 |
parents | 575f59cdd8a1 |
children | ead71b15efd5 |
comparison
equal
deleted
inserted
replaced
38037:d46a38c07b1a | 38038:8c828beb7543 |
---|---|
19 | 19 |
20 from . import ( | 20 from . import ( |
21 encoding, | 21 encoding, |
22 error, | 22 error, |
23 pycompat, | 23 pycompat, |
24 util, | |
24 ) | 25 ) |
25 | 26 |
26 from .utils import ( | 27 from .utils import ( |
27 procutil, | 28 procutil, |
28 ) | 29 ) |
175 | 176 |
176 _host = None | 177 _host = None |
177 | 178 |
178 def __init__(self, vfs, fname, timeout=-1, releasefn=None, acquirefn=None, | 179 def __init__(self, vfs, fname, timeout=-1, releasefn=None, acquirefn=None, |
179 desc=None, inheritchecker=None, parentlock=None, | 180 desc=None, inheritchecker=None, parentlock=None, |
180 dolock=True): | 181 signalsafe=True, dolock=True): |
181 self.vfs = vfs | 182 self.vfs = vfs |
182 self.f = fname | 183 self.f = fname |
183 self.held = 0 | 184 self.held = 0 |
184 self.timeout = timeout | 185 self.timeout = timeout |
185 self.releasefn = releasefn | 186 self.releasefn = releasefn |
187 self.desc = desc | 188 self.desc = desc |
188 self._inheritchecker = inheritchecker | 189 self._inheritchecker = inheritchecker |
189 self.parentlock = parentlock | 190 self.parentlock = parentlock |
190 self._parentheld = False | 191 self._parentheld = False |
191 self._inherited = False | 192 self._inherited = False |
193 if signalsafe: | |
194 self._maybedelayedinterrupt = _delayedinterrupt | |
195 else: | |
196 self._maybedelayedinterrupt = util.nullcontextmanager | |
192 self.postrelease = [] | 197 self.postrelease = [] |
193 self.pid = self._getpid() | 198 self.pid = self._getpid() |
194 if dolock: | 199 if dolock: |
195 self.delay = self.lock() | 200 self.delay = self.lock() |
196 if self.acquirefn: | 201 if self.acquirefn: |
242 lockname = '%s:%d' % (lock._host, self.pid) | 247 lockname = '%s:%d' % (lock._host, self.pid) |
243 retry = 5 | 248 retry = 5 |
244 while not self.held and retry: | 249 while not self.held and retry: |
245 retry -= 1 | 250 retry -= 1 |
246 try: | 251 try: |
247 with _delayedinterrupt(): | 252 with self._maybedelayedinterrupt(): |
248 self.vfs.makelock(lockname, self.f) | 253 self.vfs.makelock(lockname, self.f) |
249 self.held = 1 | 254 self.held = 1 |
250 except (OSError, IOError) as why: | 255 except (OSError, IOError) as why: |
251 if why.errno == errno.EEXIST: | 256 if why.errno == errno.EEXIST: |
252 locker = self._readlock() | 257 locker = self._readlock() |