Skip to content
Permalink
Browse files

core: wake Waker outside of lock.

Given:

- Broker asleep in poll()
- thread B calling Latch.put()

Previously,

- B takes lock,
- B wakes socket by dropping GIL and writing to it
- Broker wakes from poll(), acquires GIL only to find Latch._lock is held
- Broker drops GIL, sleeps on futex() for _lock
- B wakes, acquires GIL, releases _lock
- Broker wakes from futex(), acquires lock

Now,

- B takes lock, updates state, releases lock
- B wakes socket by droppping GIL and writing to it
- Broker wakes from poll(), acquires GIL and _lock
- Everyone lives happily ever after.
  • Loading branch information...
dw committed Feb 24, 2019
1 parent 807cbef commit d6faff06c1a60c6d95486ada12c65749f403cf2d
Showing with 4 additions and 2 deletions.
  1. +4 −2 mitogen/core.py
@@ -2613,12 +2613,14 @@ def defer(self, func, *args, **kwargs):
self.stream.transmit_side.fd)
self._lock.acquire()
try:
if not self._deferred:
self._wake()
should_wake = not self._deferred
self._deferred.append((func, args, kwargs))
finally:
self._lock.release()

if should_wake:
self._wake()


class IoLoggerProtocol(DelimitedProtocol):
"""

0 comments on commit d6faff0

Please sign in to comment.
You can’t perform that action at this time.