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.
pull/607/head
David Wilson 6 years ago
parent 807cbef9ca
commit d6faff06c1

@ -2613,12 +2613,14 @@ class Waker(Protocol):
self.stream.transmit_side.fd) self.stream.transmit_side.fd)
self._lock.acquire() self._lock.acquire()
try: try:
if not self._deferred: should_wake = not self._deferred
self._wake()
self._deferred.append((func, args, kwargs)) self._deferred.append((func, args, kwargs))
finally: finally:
self._lock.release() self._lock.release()
if should_wake:
self._wake()
class IoLoggerProtocol(DelimitedProtocol): class IoLoggerProtocol(DelimitedProtocol):
""" """

Loading…
Cancel
Save