Am 10.10.2012 03:16, schrieb MRAB:
On 2012-10-10 01:32, Wenhua Zhao wrote:
Hi list,

I just noticed that in /usr/lib/python2.7/threading.py

class _Condition(_Verbose):
     ...
     def _is_owned(self):
         # Return True if lock is owned by current_thread.
         # This method is called only if __lock doesn't have
         # _is_owned().
         if self.__lock.acquire(0):
             self.__lock.release()
             return False
         else:
             return True

The return values seem to be wrong.  They should be swapped:

     def _is_owned(self):
         if self.__lock.acquire(0):
             self.__lock.release()
             return True
         else:
             return False

Or I understood it wrong here?

The .acquire method will return True if the attempt to acquire has been
successful. This can occur only if it is not currently owned.

The comment clearly states "owned by current thread", not "owned by any thread". The latter would also be useless, as that can change concurrently at any time when owned by a different thread, so making decisions on this state is futile. Also, acquire() can also return true when locking recursively, at least that's how I read the sources.

I think that this is really a bug, but it doesn't surface often because the built-in lock has its own _is_owned() function which is used instead of this flawed logic.

Uli

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to