Index: Modules/_bsddb.c =================================================================== --- Modules/_bsddb.c (revision 77804) +++ Modules/_bsddb.c (working copy) @@ -2382,8 +2382,6 @@ args = BuildValue_SS(leftKey->data, leftKey->size, rightKey->data, rightKey->size); if (args != NULL) { - /* XXX(twouters) I highly doubt this INCREF is correct */ - Py_INCREF(self); result = PyEval_CallObject(self->btCompareCallback, args); } if (args == NULL || result == NULL) { @@ -2432,10 +2430,12 @@ if (result == NULL) return NULL; if (!NUMBER_Check(result)) { + Py_DECREF(result); PyErr_SetString(PyExc_TypeError, "callback MUST return an int"); return NULL; } else if (NUMBER_AsLong(result) != 0) { + Py_DECREF(result); PyErr_SetString(PyExc_TypeError, "callback failed to return 0 on two empty strings"); return NULL; @@ -5776,6 +5776,8 @@ free(listp); return NULL; } + Py_DECREF(key); + Py_DECREF(tuple); } free(listp); return stats; @@ -7578,4 +7580,3 @@ return PyInit__bsddb(); /* Note the two underscores */ #endif } - Index: Lib/bsddb/test/test_replication.py =================================================================== --- Lib/bsddb/test/test_replication.py (revision 77804) +++ Lib/bsddb/test/test_replication.py (working copy) @@ -4,6 +4,7 @@ import os import time import unittest +import weakref from test_all import db, test_support, have_threads, verbose, \ get_new_environment_path, get_new_database_path @@ -34,13 +35,16 @@ | db.DB_INIT_LOG | db.DB_INIT_MPOOL | db.DB_INIT_LOCK | db.DB_INIT_REP | db.DB_RECOVER | db.DB_THREAD, 0666) + wr = weakref.ref(self) self.confirmed_master=self.client_startupdone=False def confirmed_master(a,b,c) : if b==db.DB_EVENT_REP_MASTER : + self = wr() self.confirmed_master=True def client_startupdone(a,b,c) : if b==db.DB_EVENT_REP_STARTUPDONE : + self = wr() self.client_startupdone=True self.dbenvMaster.set_event_notify(confirmed_master) @@ -213,12 +217,15 @@ class DBBaseReplication(DBReplicationManager): def setUp(self) : DBReplicationManager.setUp(self) + wr = weakref.ref(self) def confirmed_master(a,b,c) : if (b == db.DB_EVENT_REP_MASTER) or (b == db.DB_EVENT_REP_ELECTED) : + self = wr() self.confirmed_master = True def client_startupdone(a,b,c) : if b == db.DB_EVENT_REP_STARTUPDONE : + self = wr() self.client_startupdone = True self.dbenvMaster.set_event_notify(confirmed_master) @@ -231,9 +238,11 @@ # There are only two nodes, so we don't need to # do any routing decision def m2c(dbenv, control, rec, lsnp, envid, flags) : + self = wr() self.m2c.put((control, rec)) def c2m(dbenv, control, rec, lsnp, envid, flags) : + self = wr() self.c2m.put((control, rec)) self.dbenvMaster.rep_set_transport(13,m2c) @@ -250,10 +259,12 @@ #self.dbenvClient.set_verbose(db.DB_VERB_FILEOPS_ALL, True) def thread_master() : + self = wr() return self.thread_do(self.dbenvMaster, self.c2m, 3, self.master_doing_election, True) def thread_client() : + self = wr() return self.thread_do(self.dbenvClient, self.m2c, 13, self.client_doing_election, False) Index: Lib/bsddb/test/test_compare.py =================================================================== --- Lib/bsddb/test/test_compare.py (revision 77804) +++ Lib/bsddb/test/test_compare.py (working copy) @@ -193,6 +193,7 @@ errorOut = temp.getvalue() if not successRe.search(errorOut): self.fail("unexpected stderr output:\n"+errorOut) + sys.exc_traceback = sys.last_traceback = None def _test_compare_function_exception (self): self.startTest () @@ -238,12 +239,7 @@ self.startTest () self.createDB (my_compare) - try: - self.db.set_bt_compare (my_compare) - self.assert_(0, "this set should fail") - - except RuntimeError, msg: - pass + self.assertRaises (RuntimeError, self.db.set_bt_compare, my_compare) def test_suite (): res = unittest.TestSuite ()