[Python-checkins] python/dist/src/Lib/test test_bsddb.py,1.15,1.16

greg at users.sourceforge.net greg at users.sourceforge.net
Sun Nov 2 20:04:43 EST 2003


Update of /cvsroot/python/python/dist/src/Lib/test
In directory sc8-pr-cvs1:/tmp/cvs-serv10424/Lib/test
Modified Files:
	test_bsddb.py 
Log Message:
* Use weakref's of DBCursor objects for the iterator cursors to avoid a
 memory leak that would've occurred for all iterators that were
 destroyed before having iterated until they raised StopIteration.
* Simplify some code.
* Add new test cases to check for the memleak and ensure that mixing
 iteration with modification of the values for existing keys works.
Index: test_bsddb.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_bsddb.py,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** test_bsddb.py	2 Nov 2003 09:10:16 -0000	1.15
--- test_bsddb.py	3 Nov 2003 01:04:41 -0000	1.16
***************
*** 4,7 ****
--- 4,8 ----
 """
 import os, sys
+ import copy
 import bsddb
 import dbhash # Just so we know it's imported
***************
*** 65,68 ****
--- 66,119 ----
 self.assertSetEquals(d.iteritems(), f.iteritems())
 
+ def test_iter_while_modifying_values(self):
+ if not hasattr(self.f, '__iter__'):
+ return
+ 
+ di = iter(self.d)
+ while 1:
+ try:
+ key = di.next()
+ self.d[key] = 'modified '+key
+ except StopIteration:
+ break
+ 
+ # it should behave the same as a dict. modifying values
+ # of existing keys should not break iteration. (adding
+ # or removing keys should)
+ fi = iter(self.f)
+ while 1:
+ try:
+ key = fi.next()
+ self.f[key] = 'modified '+key
+ except StopIteration:
+ break
+ 
+ self.test_mapping_iteration_methods()
+ 
+ def test_iteritems_while_modifying_values(self):
+ if not hasattr(self.f, 'iteritems'):
+ return
+ 
+ di = self.d.iteritems()
+ while 1:
+ try:
+ k, v = di.next()
+ self.d[k] = 'modified '+v
+ except StopIteration:
+ break
+ 
+ # it should behave the same as a dict. modifying values
+ # of existing keys should not break iteration. (adding
+ # or removing keys should)
+ fi = self.f.iteritems()
+ while 1:
+ try:
+ k, v = fi.next()
+ self.f[k] = 'modified '+v
+ except StopIteration:
+ break
+ 
+ self.test_mapping_iteration_methods()
+ 
 def test_first_next_looping(self):
 items = [self.f.first()]
***************
*** 112,118 ****
 
 # test the iterator interface (if present)
! if hasattr(self, 'iteritems'):
 if debug: print "D"
! k,v = self.f.iteritems()
 if debug: print "E"
 self.f[k] = "please don't deadlock"
--- 163,170 ----
 
 # test the iterator interface (if present)
! if hasattr(self.f, 'iteritems'):
 if debug: print "D"
! i = self.f.iteritems()
! k,v = i.next()
 if debug: print "E"
 self.f[k] = "please don't deadlock"
***************
*** 120,124 ****
 while 1:
 try:
! k,v = self.f.iteritems()
 except StopIteration:
 break
--- 172,176 ----
 while 1:
 try:
! k,v = i.next()
 except StopIteration:
 break
***************
*** 144,147 ****
--- 196,220 ----
 self.f[k] = "be gone with ye deadlocks"
 self.assert_(self.f[k], "be gone with ye deadlocks")
+ 
+ def test_for_cursor_memleak(self):
+ if not hasattr(self.f, 'iteritems'):
+ return
+ 
+ # do the bsddb._DBWithCursor _iter_mixin internals leak cursors?
+ nc1 = len(self.f._cursor_refs)
+ # create iterator
+ i = self.f.iteritems()
+ nc2 = len(self.f._cursor_refs)
+ # use the iterator (should run to the first yeild, creating the cursor)
+ k, v = i.next()
+ nc3 = len(self.f._cursor_refs)
+ # destroy the iterator; this should cause the weakref callback
+ # to remove the cursor object from self.f._cursor_refs
+ del i
+ nc4 = len(self.f._cursor_refs)
+ 
+ self.assertEqual(nc1, nc2)
+ self.assertEqual(nc1, nc4)
+ self.assert_(nc3 == nc1+1)
 
 def test_popitem(self):


More information about the Python-checkins mailing list

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