[Python-checkins] python/dist/src/Lib threading.py, 1.38.6.2, 1.38.6.3

bcannon at users.sourceforge.net bcannon at users.sourceforge.net
Wed Jul 21 04:55:56 CEST 2004


Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29871/Lib
Modified Files:
 Tag: release23-maint
	threading.py 
Log Message:
dummy_threading when run with -O would raise a KeyError in Thread.__delete()
when called by atexit thanks to dummy_thread always returning -1 for
dummy_thread.get_ident(). Since exception was not an issue, it is now caught
and tossed.
Closes bug #993394.
Index: threading.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/threading.py,v
retrieving revision 1.38.6.2
retrieving revision 1.38.6.3
diff -C2 -d -r1.38.6.2 -r1.38.6.3
*** threading.py	4 Jul 2004 18:35:56 -0000	1.38.6.2
--- threading.py	21 Jul 2004 02:55:54 -0000	1.38.6.3
***************
*** 493,498 ****
 
 def __delete(self):
 _active_limbo_lock.acquire()
! del _active[_get_ident()]
 _active_limbo_lock.release()
 
--- 493,530 ----
 
 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()
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /