4333: memory leak in 3.2
svn: r16089
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, {})
|
||||
|
||||
#---------------------------------------------------------------
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user