4333: memory leak in 3.2

svn: r16089
This commit is contained in:
Benny Malengier
2010-10-31 07:33:17 +00:00
parent fd73514004
commit 1fee4971f4
25 changed files with 416 additions and 24 deletions

View File

@@ -129,6 +129,9 @@ class DbBookmarks(object):
def insert(self, pos, item):
self.bookmarks.insert(pos, item)
def close(self):
del self.bookmarks
#-------------------------------------------------------------------------
#
# GrampsDBReadCursor
@@ -206,7 +209,6 @@ class DbBsddbRead(DbReadBase, Callback):
"""
Create a new DbBsddbRead instance.
"""
DbReadBase.__init__(self)
Callback.__init__(self)
@@ -427,8 +429,26 @@ class DbBsddbRead(DbReadBase, Callback):
The method needs to be overridden in the derived class.
"""
pass
#remove circular dependance
self.basedb = None
#remove links to functions
self.disconnect_all()
for key in self._tables:
for subkey in self._tables[key]:
self._tables[key][subkey] = None
del self._tables[key][subkey]
self._tables[key] = None
del self._tables
## self.bookmarks = None
## self.family_bookmarks = None
## self.event_bookmarks = None
## self.place_bookmarks = None
## self.source_bookmarks = None
## self.repo_bookmarks = None
## self.media_bookmarks = None
## self.note_bookmarks = None
def is_open(self):
"""
Return 1 if the database has been opened.

View File

@@ -400,6 +400,10 @@ class DbUndoBSDDB(DbUndo):
Close the undo/redo database
"""
self.undodb.close()
self.undodb = None
self.mapbase = None
self.db = None
try:
os.remove(self.path)
except OSError:

View File

@@ -1013,7 +1013,6 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
def close(self):
if not self.db_is_open:
return
self.env.txn_checkpoint()
self.__close_metadata()
@@ -1060,6 +1059,26 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.env = None
self.metadata = None
self.db_is_open = False
self.surname_lis = None
DbBsddbRead.close(self)
self.person_map = None
self.family_map = None
self.repository_map = None
self.note_map = None
self.place_map = None
self.source_map = None
self.media_map = None
self.event_map = None
self.tag_map = None
self.reference_map_primary_map = None
self.reference_map_referenced_map = None
self.reference_map = None
self.undo_callback = None
self.redo_callback = None
self.undo_history_callback = None
self.undodb = None
try:
clear_lock_file(self.get_save_path())

View File

@@ -40,6 +40,7 @@ import sys
import types
import traceback
import inspect
import copy
log = sys.stderr.write
@@ -311,8 +312,16 @@ class Callback(object):
": %s with key: %s\n" % (signal_name,
str(key)))
self.__callback_map[signal_name].remove(cb)
def disconnect_all(self):# Find the key in the callback map.
for signal_name in self.__callback_map:
keymap = copy.copy(self.__callback_map[signal_name])
for key in keymap:
self.__callback_map[signal_name].remove(key)
self.__callback_map[signal_name] = None
self.__callback_map = None
del self.__callback_map
def emit(self, signal_name, args=tuple()):
"""
Emit the signal called signal_name. The args must be a tuple of

View File

@@ -38,14 +38,18 @@ import ConfigParser
import errno
import copy
try:
from ast import literal_eval as safe_eval
except:
# PYTHON2.5 COMPATIBILITY: no ast present
# not as safe as literal_eval, but works for python2.5:
def safe_eval(exp):
def safe_eval(exp):
# restrict eval to empty environment
return eval(exp, {})
##try:
## from ast import literal_eval as safe_eval
## # this leaks memory !!
##except:
## # PYTHON2.5 COMPATIBILITY: no ast present
## # not as safe as literal_eval, but works for python2.5:
## def safe_eval(exp):
## # restrict eval to empty environment
## return eval(exp, {})
#---------------------------------------------------------------
#