[Python-checkins] python/dist/src/Lib threading.py,1.44,1.45

tim_one at users.sourceforge.net tim_one at users.sourceforge.net
Wed Jul 21 05:36:54 CEST 2004


Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3345/Lib

Modified Files:
	threading.py 
Log Message:
Thread.__delete:  Discussion of internal obscurities belongs in comments
rather than in docstrings.  Rewrote so that _active_limbo_lock is released
no matter what happens (it could have been left locked if _sys got None'd
out).  Use "in" in preference to has_key() for dict lookup.  Don't bother
looking for 'dummy_threading' in sys.modules unless KeyError is raised.
Since the heart of the method is the del, do that in only one place.


Index: threading.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/threading.py,v
retrieving revision 1.44
retrieving revision 1.45
diff -C2 -d -r1.44 -r1.45
*** threading.py	21 Jul 2004 02:21:57 -0000	1.44
--- threading.py	21 Jul 2004 03:36:52 -0000	1.45
***************
*** 494,532 ****
  
      def __delete(self):
!         """Remove the current thread from the dict of currently running
!         threads.
! 
!         Must take care to not raise an exception if dummy_thread is being used
!         (and thus this module is being used as an instance of dummy_threading).
!         Since dummy_thread.get_ident() always returns -1 since there is only one
!         thread if dummy_thread is being used.  This means that if any Thread
!         instances are created they will overwrite any other threads registered.
! 
!         This is an issue with this method, though, since an instance of
!         _MainThread is always created by 'threading'.  This gets overwritten the
!         instant an instance of Thread is created; both threads will have -1 as
!         their value from dummy_thread.get_ident() and thus have the same key in
!         the dict.  This means that when the _MainThread instance created by
!         'threading' tries to clean itself up when atexit calls this method it
!         gets a key error if another Thread instance was created since that
!         removed the only thing with the key of -1.
  
!         This all means that KeyError from trying to delete something from
!         _active if dummy_threading is being used is a red herring.  But since
!         it isn't if dummy_threading is *not* being used then don't hide the
!         exception.  Also don't need to worry about issues from interpreter
!         shutdown and sys not being defined because the call is protected by a
!         blanket try/except block where that could be a problem.
  
-         """
          _active_limbo_lock.acquire()
!         if _sys.modules.has_key('dummy_threading'):
              try:
                  del _active[_get_ident()]
              except KeyError:
!                 pass
!         else:
!             del _active[_get_ident()]
!         _active_limbo_lock.release()
  
      def join(self, timeout=None):
--- 494,529 ----
  
      def __delete(self):
!         "Remove current thread from the dict of currently running threads."
  
!         # Notes about running with dummy_thread:
!         #
!         # Must take care to not raise an exception if dummy_thread is being
!         # used (and thus this module is being used as an instance of
!         # dummy_threading).  dummy_thread.get_ident() always returns -1 since
!         # there is only one thread if dummy_thread is being used.  Thus
!         # len(_active) is always <= 1 here, and any Thread instance created
!         # overwrites the (if any) thread currently registered in _active.
!         #
!         # An instance of _MainThread is always created by 'threading'.  This
!         # gets overwritten the instant an instance of Thread is created; both
!         # threads return -1 from dummy_thread.get_ident() and thus have the
!         # same key in the dict.  So when the _MainThread instance created by
!         # 'threading' tries to clean itself up when atexit calls this method
!         # it gets a KeyError if another Thread instance was created.
!         #
!         # This all means that KeyError from trying to delete something from
!         # _active if dummy_threading is being used is a red herring.  But
!         # since it isn't if dummy_threading is *not* being used then don't
!         # hide the exception.
  
          _active_limbo_lock.acquire()
!         try:
              try:
                  del _active[_get_ident()]
              except KeyError:
!                 if 'dummy_threading' not in _sys.modules:
!                     raise
!         finally:
!             _active_limbo_lock.release()
  
      def join(self, timeout=None):



More information about the Python-checkins mailing list