From: Claudio Freire Date: Wed, 2 Sep 2015 18:07:55 +0000 (-0300) Subject: Fix comments around add_callback X-Git-Tag: v4.3.0b1~35^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8fffe30026e77f390620ab737899a3f8910e2167;p=thirdparty%2Ftornado.git Fix comments around add_callback Update the comments on the rationale for lock usage, and make sure to always check self._closing --- diff --git a/tornado/ioloop.py b/tornado/ioloop.py index 388d91b12..6068802e0 100644 --- a/tornado/ioloop.py +++ b/tornado/ioloop.py @@ -909,20 +909,24 @@ class PollIOLoop(IOLoop): self._cancellations += 1 def add_callback(self, callback, *args, **kwargs): + # The check doesn't need to be guarded by the callback lock, + # since the GIL makes all access to it atomic, and it can + # only ever transition to True + if self._closing: + raise RuntimeError("IOLoop is closing") if thread.get_ident() != self._thread_ident: + # If we're not on the IOLoop's thread, we need to synchronize + # with other threads, or waking logic will induce a race. with self._callback_lock: - if self._closing: - raise RuntimeError("IOLoop is closing") list_empty = not self._callbacks self._callbacks.append(functools.partial( stack_context.wrap(callback), *args, **kwargs)) if list_empty: - # If we're in the IOLoop's thread, we know it's not currently - # polling. If we're not, and we added the first callback to an - # empty list, we may need to wake it up (it may wake up on its - # own, but an occasional extra wake is harmless). Waking - # up a polling IOLoop is relatively expensive, so we try to - # avoid it when we can. + # If we're not in the IOLoop's thread, and we added the + # first callback to an empty list, we may need to wake it + # up (it may wake up on its own, but an occasional extra + # wake is harmless). Waking up a polling IOLoop is + # relatively expensive, so we try to avoid it when we can. self._waker.wake() else: # If we're on the IOLoop's thread, we don't need the lock,