Mercurial > hg
comparison mercurial/lock.py @ 43077:687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Done with
python3.7 contrib/byteify-strings.py -i $(hg files 'set:mercurial/**.py - mercurial/thirdparty/** + hgext/**.py - hgext/fsmonitor/pywatchman/** - mercurial/__init__.py')
black -l 80 -t py33 -S $(hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**" - hgext/fsmonitor/pywatchman/**')
# skip-blame mass-reformatting only
Differential Revision: https://phab.mercurial-scm.org/D6972
author | Augie Fackler <augie@google.com> |
---|---|
date | Sun, 06 Oct 2019 09:48:39 -0400 |
parents | 2372284d9457 |
children | c59eb1560c44 |
comparison
equal
deleted
inserted
replaced
43076:2372284d9457 | 43077:687b865b95ad |
---|---|
33 It's useful to detect "dead" processes and remove stale locks with | 33 It's useful to detect "dead" processes and remove stale locks with |
34 confidence. Typically it's just hostname. On modern linux, we include an | 34 confidence. Typically it's just hostname. On modern linux, we include an |
35 extra Linux-specific pid namespace identifier. | 35 extra Linux-specific pid namespace identifier. |
36 """ | 36 """ |
37 result = encoding.strtolocal(socket.gethostname()) | 37 result = encoding.strtolocal(socket.gethostname()) |
38 if pycompat.sysplatform.startswith('linux'): | 38 if pycompat.sysplatform.startswith(b'linux'): |
39 try: | 39 try: |
40 result += '/%x' % os.stat('/proc/self/ns/pid').st_ino | 40 result += b'/%x' % os.stat(b'/proc/self/ns/pid').st_ino |
41 except OSError as ex: | 41 except OSError as ex: |
42 if ex.errno not in (errno.ENOENT, errno.EACCES, errno.ENOTDIR): | 42 if ex.errno not in (errno.ENOENT, errno.EACCES, errno.ENOTDIR): |
43 raise | 43 raise |
44 return result | 44 return result |
45 | 45 |
74 raiseinterrupt(num) | 74 raiseinterrupt(num) |
75 | 75 |
76 try: | 76 try: |
77 # save handlers first so they can be restored even if a setup is | 77 # save handlers first so they can be restored even if a setup is |
78 # interrupted between signal.signal() and orighandlers[] =. | 78 # interrupted between signal.signal() and orighandlers[] =. |
79 for name in ['CTRL_C_EVENT', 'SIGINT', 'SIGBREAK', 'SIGHUP', 'SIGTERM']: | 79 for name in [ |
80 b'CTRL_C_EVENT', | |
81 b'SIGINT', | |
82 b'SIGBREAK', | |
83 b'SIGHUP', | |
84 b'SIGTERM', | |
85 ]: | |
80 num = getattr(signal, name, None) | 86 num = getattr(signal, name, None) |
81 if num and num not in orighandlers: | 87 if num and num not in orighandlers: |
82 orighandlers[num] = signal.getsignal(num) | 88 orighandlers[num] = signal.getsignal(num) |
83 try: | 89 try: |
84 for num in orighandlers: | 90 for num in orighandlers: |
112 the held lock while trying to acquires it.""" | 118 the held lock while trying to acquires it.""" |
113 | 119 |
114 def printwarning(printer, locker): | 120 def printwarning(printer, locker): |
115 """issue the usual "waiting on lock" message through any channel""" | 121 """issue the usual "waiting on lock" message through any channel""" |
116 # show more details for new-style locks | 122 # show more details for new-style locks |
117 if ':' in locker: | 123 if b':' in locker: |
118 host, pid = locker.split(":", 1) | 124 host, pid = locker.split(b":", 1) |
119 msg = _( | 125 msg = _( |
120 "waiting for lock on %s held by process %r on host %r\n" | 126 b"waiting for lock on %s held by process %r on host %r\n" |
121 ) % ( | 127 ) % ( |
122 pycompat.bytestr(l.desc), | 128 pycompat.bytestr(l.desc), |
123 pycompat.bytestr(pid), | 129 pycompat.bytestr(pid), |
124 pycompat.bytestr(host), | 130 pycompat.bytestr(host), |
125 ) | 131 ) |
126 else: | 132 else: |
127 msg = _("waiting for lock on %s held by %r\n") % ( | 133 msg = _(b"waiting for lock on %s held by %r\n") % ( |
128 l.desc, | 134 l.desc, |
129 pycompat.bytestr(locker), | 135 pycompat.bytestr(locker), |
130 ) | 136 ) |
131 printer(msg) | 137 printer(msg) |
132 | 138 |
157 delay += 1 | 163 delay += 1 |
158 | 164 |
159 l.delay = delay | 165 l.delay = delay |
160 if l.delay: | 166 if l.delay: |
161 if 0 <= warningidx <= l.delay: | 167 if 0 <= warningidx <= l.delay: |
162 ui.warn(_("got lock after %d seconds\n") % l.delay) | 168 ui.warn(_(b"got lock after %d seconds\n") % l.delay) |
163 else: | 169 else: |
164 ui.debug("got lock after %d seconds\n" % l.delay) | 170 ui.debug(b"got lock after %d seconds\n" % l.delay) |
165 if l.acquirefn: | 171 if l.acquirefn: |
166 l.acquirefn() | 172 l.acquirefn() |
167 return l | 173 return l |
168 | 174 |
169 | 175 |
266 if self.held: | 272 if self.held: |
267 self.held += 1 | 273 self.held += 1 |
268 return | 274 return |
269 if lock._host is None: | 275 if lock._host is None: |
270 lock._host = _getlockprefix() | 276 lock._host = _getlockprefix() |
271 lockname = '%s:%d' % (lock._host, self.pid) | 277 lockname = b'%s:%d' % (lock._host, self.pid) |
272 retry = 5 | 278 retry = 5 |
273 while not self.held and retry: | 279 while not self.held and retry: |
274 retry -= 1 | 280 retry -= 1 |
275 try: | 281 try: |
276 with self._maybedelayedinterrupt(): | 282 with self._maybedelayedinterrupt(): |
305 | 311 |
306 if not self.held: | 312 if not self.held: |
307 # use empty locker to mean "busy for frequent lock/unlock | 313 # use empty locker to mean "busy for frequent lock/unlock |
308 # by many processes" | 314 # by many processes" |
309 raise error.LockHeld( | 315 raise error.LockHeld( |
310 errno.EAGAIN, self.vfs.join(self.f), self.desc, "" | 316 errno.EAGAIN, self.vfs.join(self.f), self.desc, b"" |
311 ) | 317 ) |
312 | 318 |
313 def _readlock(self): | 319 def _readlock(self): |
314 """read lock and return its value | 320 """read lock and return its value |
315 | 321 |
325 | 331 |
326 def _testlock(self, locker): | 332 def _testlock(self, locker): |
327 if locker is None: | 333 if locker is None: |
328 return None | 334 return None |
329 try: | 335 try: |
330 host, pid = locker.split(":", 1) | 336 host, pid = locker.split(b":", 1) |
331 except ValueError: | 337 except ValueError: |
332 return locker | 338 return locker |
333 if host != lock._host: | 339 if host != lock._host: |
334 return locker | 340 return locker |
335 try: | 341 try: |
339 if procutil.testpid(pid): | 345 if procutil.testpid(pid): |
340 return locker | 346 return locker |
341 # if locker dead, break lock. must do this with another lock | 347 # if locker dead, break lock. must do this with another lock |
342 # held, or can race and break valid lock. | 348 # held, or can race and break valid lock. |
343 try: | 349 try: |
344 l = lock(self.vfs, self.f + '.break', timeout=0) | 350 l = lock(self.vfs, self.f + b'.break', timeout=0) |
345 self.vfs.unlink(self.f) | 351 self.vfs.unlink(self.f) |
346 l.release() | 352 l.release() |
347 except error.LockError: | 353 except error.LockError: |
348 return locker | 354 return locker |
349 | 355 |
369 Communicating this string to the subprocess needs to be done separately | 375 Communicating this string to the subprocess needs to be done separately |
370 -- typically by an environment variable. | 376 -- typically by an environment variable. |
371 """ | 377 """ |
372 if not self.held: | 378 if not self.held: |
373 raise error.LockInheritanceContractViolation( | 379 raise error.LockInheritanceContractViolation( |
374 'inherit can only be called while lock is held' | 380 b'inherit can only be called while lock is held' |
375 ) | 381 ) |
376 if self._inherited: | 382 if self._inherited: |
377 raise error.LockInheritanceContractViolation( | 383 raise error.LockInheritanceContractViolation( |
378 'inherit cannot be called while lock is already inherited' | 384 b'inherit cannot be called while lock is already inherited' |
379 ) | 385 ) |
380 if self._inheritchecker is not None: | 386 if self._inheritchecker is not None: |
381 self._inheritchecker() | 387 self._inheritchecker() |
382 if self.releasefn: | 388 if self.releasefn: |
383 self.releasefn() | 389 self.releasefn() |