4333: memory leak in 3.2
svn: r16092
This commit is contained in:
parent
f1e2d15ebb
commit
1baf7070a3
@ -151,4 +151,7 @@ class LRU(object):
|
|||||||
"""
|
"""
|
||||||
Empties LRU
|
Empties LRU
|
||||||
"""
|
"""
|
||||||
|
for obj, node in self.data.iteritems():
|
||||||
|
node.prev = None
|
||||||
|
node.next = None
|
||||||
self.data.clear()
|
self.data.clear()
|
||||||
|
@ -92,6 +92,9 @@ class DbBookmarks(object):
|
|||||||
def insert(self, pos, item):
|
def insert(self, pos, item):
|
||||||
self.bookmarks.insert(pos, item)
|
self.bookmarks.insert(pos, item)
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
del self.bookmarks
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# GrampsDBReadCursor
|
# GrampsDBReadCursor
|
||||||
@ -169,7 +172,6 @@ class DbBsddbRead(DbReadBase, Callback):
|
|||||||
"""
|
"""
|
||||||
Create a new DbBsddbRead instance.
|
Create a new DbBsddbRead instance.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
DbReadBase.__init__(self)
|
DbReadBase.__init__(self)
|
||||||
Callback.__init__(self)
|
Callback.__init__(self)
|
||||||
|
|
||||||
@ -379,8 +381,24 @@ class DbBsddbRead(DbReadBase, Callback):
|
|||||||
|
|
||||||
The method needs to be overridden in the derived class.
|
The method needs to be overridden in the derived class.
|
||||||
"""
|
"""
|
||||||
pass
|
#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):
|
def is_open(self):
|
||||||
"""
|
"""
|
||||||
Return 1 if the database has been opened.
|
Return 1 if the database has been opened.
|
||||||
|
@ -414,6 +414,10 @@ class DbUndoBSDDB(DbUndo):
|
|||||||
Close the undo/redo database
|
Close the undo/redo database
|
||||||
"""
|
"""
|
||||||
self.undodb.close()
|
self.undodb.close()
|
||||||
|
self.undodb = None
|
||||||
|
self.mapbase = None
|
||||||
|
self.db = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
os.remove(self.path)
|
os.remove(self.path)
|
||||||
except OSError:
|
except OSError:
|
||||||
|
@ -1000,7 +1000,6 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
|||||||
def close(self):
|
def close(self):
|
||||||
if not self.db_is_open:
|
if not self.db_is_open:
|
||||||
return
|
return
|
||||||
|
|
||||||
self.env.txn_checkpoint()
|
self.env.txn_checkpoint()
|
||||||
|
|
||||||
self.__close_metadata()
|
self.__close_metadata()
|
||||||
@ -1045,6 +1044,24 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
|||||||
self.env = None
|
self.env = None
|
||||||
self.metadata = None
|
self.metadata = None
|
||||||
self.db_is_open = False
|
self.db_is_open = False
|
||||||
|
|
||||||
|
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.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:
|
try:
|
||||||
clear_lock_file(self.get_save_path())
|
clear_lock_file(self.get_save_path())
|
||||||
|
@ -40,6 +40,7 @@ import sys
|
|||||||
import types
|
import types
|
||||||
import traceback
|
import traceback
|
||||||
import inspect
|
import inspect
|
||||||
|
import copy
|
||||||
|
|
||||||
log = sys.stderr.write
|
log = sys.stderr.write
|
||||||
|
|
||||||
@ -311,8 +312,16 @@ class Callback(object):
|
|||||||
": %s with key: %s\n" % (signal_name,
|
": %s with key: %s\n" % (signal_name,
|
||||||
str(key)))
|
str(key)))
|
||||||
self.__callback_map[signal_name].remove(cb)
|
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()):
|
def emit(self, signal_name, args=tuple()):
|
||||||
"""
|
"""
|
||||||
Emit the signal called signal_name. The args must be a tuple of
|
Emit the signal called signal_name. The args must be a tuple of
|
||||||
|
@ -38,14 +38,18 @@ import ConfigParser
|
|||||||
import errno
|
import errno
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
try:
|
def safe_eval(exp):
|
||||||
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):
|
|
||||||
# restrict eval to empty environment
|
# restrict eval to empty environment
|
||||||
return eval(exp, {})
|
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, {})
|
||||||
|
|
||||||
#---------------------------------------------------------------
|
#---------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
@ -78,6 +78,8 @@ class NameEmbedList(GroupEmbeddedList):
|
|||||||
]
|
]
|
||||||
|
|
||||||
def __init__(self, dbstate, uistate, track, data, person, callback):
|
def __init__(self, dbstate, uistate, track, data, person, callback):
|
||||||
|
"""callback is the function to call when preferred name changes
|
||||||
|
on the namelist """
|
||||||
self.data = data
|
self.data = data
|
||||||
self.person = person
|
self.person = person
|
||||||
self.callback = callback
|
self.callback = callback
|
||||||
@ -86,6 +88,14 @@ class NameEmbedList(GroupEmbeddedList):
|
|||||||
NameModel, move_buttons=True)
|
NameModel, move_buttons=True)
|
||||||
self.tree.expand_all()
|
self.tree.expand_all()
|
||||||
|
|
||||||
|
def _cleanup_on_exit(self):
|
||||||
|
"""Unset all things that can block garbage collection.
|
||||||
|
Finalize rest
|
||||||
|
"""
|
||||||
|
self.person = None
|
||||||
|
self.callback = None
|
||||||
|
self.data = None
|
||||||
|
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
return ([self.person.get_primary_name()],
|
return ([self.person.get_primary_name()],
|
||||||
self.data)
|
self.data)
|
||||||
|
@ -425,6 +425,15 @@ class EditFamily(EditPrimary):
|
|||||||
else:
|
else:
|
||||||
self.add_parent = False
|
self.add_parent = False
|
||||||
|
|
||||||
|
def _cleanup_on_exit(self):
|
||||||
|
"""Unset all things that can block garbage collection.
|
||||||
|
Finalize rest
|
||||||
|
"""
|
||||||
|
#FIXME, we rebind show_all below, this prevents garbage collection of
|
||||||
|
# the dialog, fix the rebind
|
||||||
|
self.window.show_all = None
|
||||||
|
EditPrimary._cleanup_on_exit(self)
|
||||||
|
|
||||||
def empty_object(self):
|
def empty_object(self):
|
||||||
return gen.lib.Family()
|
return gen.lib.Family()
|
||||||
|
|
||||||
|
@ -248,16 +248,17 @@ class EditName(EditSecondary):
|
|||||||
notebook = self.top.get_object("notebook")
|
notebook = self.top.get_object("notebook")
|
||||||
|
|
||||||
self._add_tab(notebook, self.gennam)
|
self._add_tab(notebook, self.gennam)
|
||||||
|
self.track_ref_for_deletion("gennam")
|
||||||
|
|
||||||
self.srcref_list = self._add_tab(
|
self.srcref_list = SourceEmbedList(self.dbstate,self.uistate,self.track,self.obj)
|
||||||
notebook,
|
self._add_tab(notebook, self.srcref_list)
|
||||||
SourceEmbedList(self.dbstate,self.uistate,self.track,self.obj))
|
self.track_ref_for_deletion("srcref_list")
|
||||||
|
|
||||||
self.note_tab = self._add_tab(
|
self.note_tab = NoteTab(self.dbstate, self.uistate, self.track,
|
||||||
notebook,
|
|
||||||
NoteTab(self.dbstate, self.uistate, self.track,
|
|
||||||
self.obj.get_note_list(),
|
self.obj.get_note_list(),
|
||||||
notetype=NoteType.PERSONNAME))
|
notetype=NoteType.PERSONNAME)
|
||||||
|
self._add_tab(notebook, self.note_tab)
|
||||||
|
self.track_ref_for_deletion("note_tab")
|
||||||
|
|
||||||
self._setup_notebook_tabs( notebook)
|
self._setup_notebook_tabs( notebook)
|
||||||
|
|
||||||
@ -423,6 +424,7 @@ class EditName(EditSecondary):
|
|||||||
if closeit:
|
if closeit:
|
||||||
if self.callback:
|
if self.callback:
|
||||||
self.callback(self.obj)
|
self.callback(self.obj)
|
||||||
|
self.callback = None
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
def _cleanup_on_exit(self):
|
def _cleanup_on_exit(self):
|
||||||
@ -434,5 +436,7 @@ class EditName(EditSecondary):
|
|||||||
data must be saved, and also bug 1892 occurs on reopening of the editor.
|
data must be saved, and also bug 1892 occurs on reopening of the editor.
|
||||||
"""
|
"""
|
||||||
# can't use group_over, see Note in gen/lib/name/Name.set_group_as().
|
# can't use group_over, see Note in gen/lib/name/Name.set_group_as().
|
||||||
|
print 'cleaning up'
|
||||||
if not self.group_as.obj.get_editable():
|
if not self.group_as.obj.get_editable():
|
||||||
self.obj.set_group_as("")
|
self.obj.set_group_as("")
|
||||||
|
EditSecondary._cleanup_on_exit(self)
|
||||||
|
@ -754,6 +754,7 @@ class EditPerson(EditPrimary):
|
|||||||
self.close()
|
self.close()
|
||||||
if self.callback:
|
if self.callback:
|
||||||
self.callback(self.obj)
|
self.callback(self.obj)
|
||||||
|
self.callback = None
|
||||||
|
|
||||||
def _edit_name_clicked(self, obj):
|
def _edit_name_clicked(self, obj):
|
||||||
"""
|
"""
|
||||||
@ -889,10 +890,14 @@ class EditPerson(EditPrimary):
|
|||||||
return child_ref_list
|
return child_ref_list
|
||||||
|
|
||||||
def _cleanup_on_exit(self):
|
def _cleanup_on_exit(self):
|
||||||
|
"""Unset all things that can block garbage collection.
|
||||||
|
Finalize rest
|
||||||
|
"""
|
||||||
config.set('interface.prefix-suffix', self.prefix_suffix.active_key)
|
config.set('interface.prefix-suffix', self.prefix_suffix.active_key)
|
||||||
config.set('interface.patro-title', self.patro_title.active_key)
|
config.set('interface.patro-title', self.patro_title.active_key)
|
||||||
config.save()
|
config.save()
|
||||||
|
|
||||||
|
EditPrimary._cleanup_on_exit(self)
|
||||||
|
|
||||||
class GenderDialog(gtk.MessageDialog):
|
class GenderDialog(gtk.MessageDialog):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
|
@ -151,7 +151,13 @@ class EditPrimary(ManagedWindow.ManagedWindow, DbGUIElement):
|
|||||||
return page
|
return page
|
||||||
|
|
||||||
def _cleanup_on_exit(self):
|
def _cleanup_on_exit(self):
|
||||||
pass
|
"""Unset all things that can block garbage collection.
|
||||||
|
Finalize rest
|
||||||
|
"""
|
||||||
|
for tab in self.__tabs:
|
||||||
|
if hasattr(tab, '_cleanup_on_exit'):
|
||||||
|
tab._cleanup_on_exit()
|
||||||
|
self.__tabs = None
|
||||||
|
|
||||||
def object_is_empty(self):
|
def object_is_empty(self):
|
||||||
return cmp(self.obj.serialize()[1:],
|
return cmp(self.obj.serialize()[1:],
|
||||||
@ -173,7 +179,12 @@ class EditPrimary(ManagedWindow.ManagedWindow, DbGUIElement):
|
|||||||
self._cleanup_db_connects()
|
self._cleanup_db_connects()
|
||||||
self.dbstate.disconnect(self.dbstate_connect_key)
|
self.dbstate.disconnect(self.dbstate_connect_key)
|
||||||
self._cleanup_on_exit()
|
self._cleanup_on_exit()
|
||||||
|
self.get_from_handle = None
|
||||||
|
self.get_from_gramps_id = None
|
||||||
ManagedWindow.ManagedWindow.close(self)
|
ManagedWindow.ManagedWindow.close(self)
|
||||||
|
self.dbstate = None
|
||||||
|
self.uistate = None
|
||||||
|
self.db = None
|
||||||
|
|
||||||
def _cleanup_db_connects(self):
|
def _cleanup_db_connects(self):
|
||||||
"""
|
"""
|
||||||
@ -236,7 +247,9 @@ class EditPrimary(ManagedWindow.ManagedWindow, DbGUIElement):
|
|||||||
self.obj.serialize()[1:]) != 0
|
self.obj.serialize()[1:]) != 0
|
||||||
|
|
||||||
def save(self, *obj):
|
def save(self, *obj):
|
||||||
pass
|
""" Save changes and close. Inheriting classes must implement this
|
||||||
|
"""
|
||||||
|
self.close()
|
||||||
|
|
||||||
def set_contexteventbox(self, eventbox):
|
def set_contexteventbox(self, eventbox):
|
||||||
"""Set the contextbox that grabs button presses if not grabbed
|
"""Set the contextbox that grabs button presses if not grabbed
|
||||||
|
@ -106,7 +106,20 @@ class EditSecondary(ManagedWindow.ManagedWindow, DbGUIElement):
|
|||||||
return page
|
return page
|
||||||
|
|
||||||
def _cleanup_on_exit(self):
|
def _cleanup_on_exit(self):
|
||||||
pass
|
"""Unset all things that can block garbage collection.
|
||||||
|
Finalize rest
|
||||||
|
"""
|
||||||
|
for tab in self.__tabs:
|
||||||
|
if hasattr(tab, '_cleanup_on_exit'):
|
||||||
|
tab._cleanup_on_exit()
|
||||||
|
self.__tabs = None
|
||||||
|
self.dbstate = None
|
||||||
|
self.uistate = None
|
||||||
|
self.obj = None
|
||||||
|
self.db = None
|
||||||
|
if self.callman:
|
||||||
|
self.callman.database = None
|
||||||
|
self.callman = None
|
||||||
|
|
||||||
def define_ok_button(self,button,function):
|
def define_ok_button(self,button,function):
|
||||||
button.connect('clicked',function)
|
button.connect('clicked',function)
|
||||||
@ -121,8 +134,8 @@ class EditSecondary(ManagedWindow.ManagedWindow, DbGUIElement):
|
|||||||
|
|
||||||
def close(self,*obj):
|
def close(self,*obj):
|
||||||
self._cleanup_db_connects()
|
self._cleanup_db_connects()
|
||||||
self._cleanup_on_exit()
|
|
||||||
ManagedWindow.ManagedWindow.close(self)
|
ManagedWindow.ManagedWindow.close(self)
|
||||||
|
self._cleanup_on_exit()
|
||||||
|
|
||||||
def _cleanup_db_connects(self):
|
def _cleanup_db_connects(self):
|
||||||
"""
|
"""
|
||||||
|
@ -258,6 +258,9 @@ class ListView(NavigationView):
|
|||||||
filter_info = (False, value, value[0] in self.exact_search())
|
filter_info = (False, value, value[0] in self.exact_search())
|
||||||
|
|
||||||
if self.dirty or not self.model:
|
if self.dirty or not self.model:
|
||||||
|
if self.model:
|
||||||
|
self.list.set_model(None)
|
||||||
|
self.model.destroy()
|
||||||
self.model = self.make_model(self.dbstate.db, self.sort_col,
|
self.model = self.make_model(self.dbstate.db, self.sort_col,
|
||||||
search=filter_info,
|
search=filter_info,
|
||||||
sort_map=self.column_order())
|
sort_map=self.column_order())
|
||||||
|
@ -101,6 +101,17 @@ class EventModel(FlatBaseModel):
|
|||||||
FlatBaseModel.__init__(self, db, scol, order, tooltip_column=9,
|
FlatBaseModel.__init__(self, db, scol, order, tooltip_column=9,
|
||||||
search=search, skip=skip, sort_map=sort_map)
|
search=search, skip=skip, sort_map=sort_map)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
self.db = None
|
||||||
|
self.gen_cursor = None
|
||||||
|
self.map = None
|
||||||
|
self.fmap = None
|
||||||
|
self.smap = None
|
||||||
|
FlatBaseModel.destroy(self)
|
||||||
|
|
||||||
def on_get_n_columns(self):
|
def on_get_n_columns(self):
|
||||||
return len(self.fmap)+1
|
return len(self.fmap)+1
|
||||||
|
|
||||||
|
@ -90,6 +90,17 @@ class FamilyModel(FlatBaseModel):
|
|||||||
FlatBaseModel.__init__(self, db, scol, order, tooltip_column=6,
|
FlatBaseModel.__init__(self, db, scol, order, tooltip_column=6,
|
||||||
search=search, skip=skip, sort_map=sort_map)
|
search=search, skip=skip, sort_map=sort_map)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
self.db = None
|
||||||
|
self.gen_cursor = None
|
||||||
|
self.map = None
|
||||||
|
self.fmap = None
|
||||||
|
self.smap = None
|
||||||
|
FlatBaseModel.destroy(self)
|
||||||
|
|
||||||
def marker_column(self):
|
def marker_column(self):
|
||||||
"""
|
"""
|
||||||
Return the column for marker colour.
|
Return the column for marker colour.
|
||||||
|
@ -122,6 +122,14 @@ class FlatNodeMap(object):
|
|||||||
self._reverse = False
|
self._reverse = False
|
||||||
self.__corr = (0, 1)
|
self.__corr = (0, 1)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
self._index2hndl = None
|
||||||
|
self._fullhndl = None
|
||||||
|
self._hndl2index = None
|
||||||
|
|
||||||
def set_path_map(self, index2hndllist, fullhndllist, identical=True,
|
def set_path_map(self, index2hndllist, fullhndllist, identical=True,
|
||||||
reverse=False):
|
reverse=False):
|
||||||
"""
|
"""
|
||||||
@ -414,6 +422,18 @@ class FlatBaseModel(gtk.GenericTreeModel):
|
|||||||
_LOG.debug(self.__class__.__name__ + ' __init__ ' +
|
_LOG.debug(self.__class__.__name__ + ' __init__ ' +
|
||||||
str(time.clock() - cput) + ' sec')
|
str(time.clock() - cput) + ' sec')
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that prevent garbage collection
|
||||||
|
"""
|
||||||
|
self.db = None
|
||||||
|
self.sort_func = None
|
||||||
|
if self.node_map:
|
||||||
|
self.node_map.destroy()
|
||||||
|
self.node_map = None
|
||||||
|
self.rebuild_data = None
|
||||||
|
self.search = None
|
||||||
|
|
||||||
def set_search(self, search):
|
def set_search(self, search):
|
||||||
"""
|
"""
|
||||||
Change the search function that filters the data in the model.
|
Change the search function that filters the data in the model.
|
||||||
|
@ -83,6 +83,17 @@ class MediaModel(FlatBaseModel):
|
|||||||
FlatBaseModel.__init__(self, db, scol, order, tooltip_column=7,
|
FlatBaseModel.__init__(self, db, scol, order, tooltip_column=7,
|
||||||
search=search, skip=skip, sort_map=sort_map)
|
search=search, skip=skip, sort_map=sort_map)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
self.db = None
|
||||||
|
self.gen_cursor = None
|
||||||
|
self.map = None
|
||||||
|
self.fmap = None
|
||||||
|
self.smap = None
|
||||||
|
FlatBaseModel.destroy(self)
|
||||||
|
|
||||||
def on_get_n_columns(self):
|
def on_get_n_columns(self):
|
||||||
return len(self.fmap)+1
|
return len(self.fmap)+1
|
||||||
|
|
||||||
|
@ -78,6 +78,17 @@ class NoteModel(FlatBaseModel):
|
|||||||
FlatBaseModel.__init__(self, db, scol, order, search=search,
|
FlatBaseModel.__init__(self, db, scol, order, search=search,
|
||||||
skip=skip, sort_map=sort_map)
|
skip=skip, sort_map=sort_map)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
self.db = None
|
||||||
|
self.gen_cursor = None
|
||||||
|
self.map = None
|
||||||
|
self.fmap = None
|
||||||
|
self.smap = None
|
||||||
|
FlatBaseModel.destroy(self)
|
||||||
|
|
||||||
def marker_column(self):
|
def marker_column(self):
|
||||||
"""
|
"""
|
||||||
Return the column for marker colour.
|
Return the column for marker colour.
|
||||||
|
@ -146,6 +146,17 @@ class PeopleBaseModel(object):
|
|||||||
self.lru_bdate = LRU(PeopleBaseModel._CACHE_SIZE)
|
self.lru_bdate = LRU(PeopleBaseModel._CACHE_SIZE)
|
||||||
self.lru_ddate = LRU(PeopleBaseModel._CACHE_SIZE)
|
self.lru_ddate = LRU(PeopleBaseModel._CACHE_SIZE)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
self.db = None
|
||||||
|
self.gen_cursor = None
|
||||||
|
self.map = None
|
||||||
|
self.fmap = None
|
||||||
|
self.smap = None
|
||||||
|
self.clear_local_cache()
|
||||||
|
|
||||||
def marker_column(self):
|
def marker_column(self):
|
||||||
"""
|
"""
|
||||||
Return the column for marker colour.
|
Return the column for marker colour.
|
||||||
@ -454,7 +465,6 @@ class PersonListModel(PeopleBaseModel, FlatBaseModel):
|
|||||||
"""
|
"""
|
||||||
def __init__(self, db, scol=0, order=gtk.SORT_ASCENDING, search=None,
|
def __init__(self, db, scol=0, order=gtk.SORT_ASCENDING, search=None,
|
||||||
skip=set(), sort_map=None):
|
skip=set(), sort_map=None):
|
||||||
|
|
||||||
PeopleBaseModel.__init__(self, db)
|
PeopleBaseModel.__init__(self, db)
|
||||||
FlatBaseModel.__init__(self, db, search=search, skip=skip,
|
FlatBaseModel.__init__(self, db, search=search, skip=skip,
|
||||||
tooltip_column=12,
|
tooltip_column=12,
|
||||||
@ -464,6 +474,13 @@ class PersonListModel(PeopleBaseModel, FlatBaseModel):
|
|||||||
""" Clear the LRU cache """
|
""" Clear the LRU cache """
|
||||||
PeopleBaseModel.clear_local_cache(self, handle)
|
PeopleBaseModel.clear_local_cache(self, handle)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
PeopleBaseModel.destroy(self)
|
||||||
|
FlatBaseModel.destroy(self)
|
||||||
|
|
||||||
class PersonTreeModel(PeopleBaseModel, TreeBaseModel):
|
class PersonTreeModel(PeopleBaseModel, TreeBaseModel):
|
||||||
"""
|
"""
|
||||||
Hierarchical people model.
|
Hierarchical people model.
|
||||||
@ -475,6 +492,15 @@ class PersonTreeModel(PeopleBaseModel, TreeBaseModel):
|
|||||||
TreeBaseModel.__init__(self, db, 12, search=search, skip=skip,
|
TreeBaseModel.__init__(self, db, 12, search=search, skip=skip,
|
||||||
scol=scol, order=order, sort_map=sort_map)
|
scol=scol, order=order, sort_map=sort_map)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
PeopleBaseModel.destroy(self)
|
||||||
|
self.hmap = None
|
||||||
|
self.number_items = None
|
||||||
|
TreeBaseModel.destroy(self)
|
||||||
|
|
||||||
def _set_base_data(self):
|
def _set_base_data(self):
|
||||||
"""See TreeBaseModel, we also set some extra lru caches
|
"""See TreeBaseModel, we also set some extra lru caches
|
||||||
"""
|
"""
|
||||||
|
@ -117,6 +117,16 @@ class PlaceBaseModel(object):
|
|||||||
self.column_handle,
|
self.column_handle,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
self.db = None
|
||||||
|
self.gen_cursor = None
|
||||||
|
self.map = None
|
||||||
|
self.fmap = None
|
||||||
|
self.smap = None
|
||||||
|
|
||||||
def on_get_n_columns(self):
|
def on_get_n_columns(self):
|
||||||
return len(self.fmap)+1
|
return len(self.fmap)+1
|
||||||
|
|
||||||
@ -218,6 +228,13 @@ class PlaceListModel(PlaceBaseModel, FlatBaseModel):
|
|||||||
FlatBaseModel.__init__(self, db, scol, order, tooltip_column=14,
|
FlatBaseModel.__init__(self, db, scol, order, tooltip_column=14,
|
||||||
search=search, skip=skip, sort_map=sort_map)
|
search=search, skip=skip, sort_map=sort_map)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
PlaceBaseModel.destroy(self)
|
||||||
|
FlatBaseModel.destroy(self)
|
||||||
|
|
||||||
def column_name(self, data):
|
def column_name(self, data):
|
||||||
return unicode(data[2])
|
return unicode(data[2])
|
||||||
|
|
||||||
@ -240,6 +257,15 @@ class PlaceTreeModel(PlaceBaseModel, TreeBaseModel):
|
|||||||
nrgroups = 3,
|
nrgroups = 3,
|
||||||
group_can_have_handle = True)
|
group_can_have_handle = True)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
PlaceBaseModel.destroy(self)
|
||||||
|
self.hmap = None
|
||||||
|
self.number_items = None
|
||||||
|
TreeBaseModel.destroy(self)
|
||||||
|
|
||||||
def _set_base_data(self):
|
def _set_base_data(self):
|
||||||
"""See TreeBaseModel, for place, most have been set in init of
|
"""See TreeBaseModel, for place, most have been set in init of
|
||||||
PlaceBaseModel
|
PlaceBaseModel
|
||||||
|
@ -94,6 +94,18 @@ class RepositoryModel(FlatBaseModel):
|
|||||||
FlatBaseModel.__init__(self, db, scol, order, tooltip_column=14,
|
FlatBaseModel.__init__(self, db, scol, order, tooltip_column=14,
|
||||||
search=search, skip=skip, sort_map=sort_map)
|
search=search, skip=skip, sort_map=sort_map)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
self.db = None
|
||||||
|
self.gen_cursor = None
|
||||||
|
self.get_handles = None
|
||||||
|
self.map = None
|
||||||
|
self.fmap = None
|
||||||
|
self.smap = None
|
||||||
|
FlatBaseModel.destroy(self)
|
||||||
|
|
||||||
def on_get_n_columns(self):
|
def on_get_n_columns(self):
|
||||||
return len(self.fmap)+1
|
return len(self.fmap)+1
|
||||||
|
|
||||||
|
@ -77,6 +77,17 @@ class SourceModel(FlatBaseModel):
|
|||||||
FlatBaseModel.__init__(self,db,scol, order,tooltip_column=7,search=search,
|
FlatBaseModel.__init__(self,db,scol, order,tooltip_column=7,search=search,
|
||||||
skip=skip, sort_map=sort_map)
|
skip=skip, sort_map=sort_map)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
self.db = None
|
||||||
|
self.gen_cursor = None
|
||||||
|
self.map = None
|
||||||
|
self.fmap = None
|
||||||
|
self.smap = None
|
||||||
|
FlatBaseModel.destroy(self)
|
||||||
|
|
||||||
def on_get_n_columns(self):
|
def on_get_n_columns(self):
|
||||||
return len(self.fmap)+1
|
return len(self.fmap)+1
|
||||||
|
|
||||||
|
@ -173,6 +173,12 @@ class NodeMap(object):
|
|||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.id2node = {}
|
self.id2node = {}
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that can prevent garbage collection
|
||||||
|
"""
|
||||||
|
self.id2node.clear()
|
||||||
|
|
||||||
def add_node(self, node):
|
def add_node(self, node):
|
||||||
"""
|
"""
|
||||||
@ -321,6 +327,20 @@ class TreeBaseModel(gtk.GenericTreeModel):
|
|||||||
_LOG.debug(self.__class__.__name__ + ' __init__ ' +
|
_LOG.debug(self.__class__.__name__ + ' __init__ ' +
|
||||||
str(time.clock() - cput) + ' sec')
|
str(time.clock() - cput) + ' sec')
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""
|
||||||
|
Unset all elements that prevent garbage collection
|
||||||
|
"""
|
||||||
|
self.db = None
|
||||||
|
self.sort_func = None
|
||||||
|
if self.nodemap:
|
||||||
|
self.nodemap.destroy()
|
||||||
|
self.nodemap = None
|
||||||
|
self.rebuild_data = None
|
||||||
|
self._build_data = None
|
||||||
|
self.search = None
|
||||||
|
self.clear_cache()
|
||||||
|
|
||||||
def _set_base_data(self):
|
def _set_base_data(self):
|
||||||
"""
|
"""
|
||||||
This method must be overwritten in the inheriting class, setting
|
This method must be overwritten in the inheriting class, setting
|
||||||
|
Loading…
x
Reference in New Issue
Block a user