Fix a variety of memory leaks around the PeopleView and model

svn: r12791
This commit is contained in:
Gary Burton 2009-07-12 19:45:17 +00:00
parent d45f5970fb
commit 6c855de785
4 changed files with 34 additions and 10 deletions

View File

@ -2,6 +2,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2007 Donald N. Allingham
# Copyright (C) 2009 Gary Burton
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -88,6 +89,9 @@ class NodeTreeMap(object):
self.sortnames = {}
def clear_temp_data(self):
del self.temp_iter2path
del self.temp_path2iter
del self.temp_sname_sub
self.temp_iter2path = {}
self.temp_path2iter = {}
self.temp_sname_sub = {}
@ -240,6 +244,10 @@ class PeopleModel(gtk.GenericTreeModel):
self.db = db
self.in_build = False
self.lru_data = LRU(_CACHE_SIZE)
self.lru_name = LRU(_CACHE_SIZE)
self.lru_bdate = LRU(_CACHE_SIZE)
self.lru_ddate = LRU(_CACHE_SIZE)
Config.client.notify_add("/apps/gramps/preferences/todo-color",
self.update_todo)
@ -350,11 +358,8 @@ class PeopleModel(gtk.GenericTreeModel):
"""
Calculate the new path to node values for the model.
"""
self.clear_cache()
self.in_build = True
self.lru_data = LRU(_CACHE_SIZE)
self.lru_name = LRU(_CACHE_SIZE)
self.lru_bdate = LRU(_CACHE_SIZE)
self.lru_ddate = LRU(_CACHE_SIZE)
self.total = 0
self.displayed = 0
@ -373,10 +378,10 @@ class PeopleModel(gtk.GenericTreeModel):
self.in_build = False
def clear_cache(self):
self.lru_data = LRU(_CACHE_SIZE)
self.lru_name = LRU(_CACHE_SIZE)
self.lru_bdate = LRU(_CACHE_SIZE)
self.lru_ddate = LRU(_CACHE_SIZE)
self.lru_name.clear()
self.lru_data.clear()
self.lru_bdate.clear()
self.lru_ddate.clear()
def build_sub_entry(self, name):
self.mapper.build_sub_entry(name)

View File

@ -1,6 +1,7 @@
# This file is derived from the GPL program "PyPE"
#
# Copyright (C) 2003-2006 Josiah Carlson
# Copyright (C) 2009 Gary Burton
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -144,3 +145,9 @@ class LRU(object):
Return all items
"""
return [data[0] for data in self.iteritems()]
def clear(self):
"""
Empties LRU
"""
self.data.clear()

View File

@ -2,6 +2,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2007 Donald N. Allingham
# Copyright (C) 2009 Gary Burton
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -590,7 +591,11 @@ def probably_alive(person, db, current_date=None, limit=0):
# been alive in the current year then they must be dead.
try:
if descendants_too_old(person, _MIN_GENERATION_YEARS):
age_too_old = descendants_too_old(person, _MIN_GENERATION_YEARS)
# Set to None otherwise there is a memory leak as this function
# is recursive
descendants_too_old = None
if age_too_old:
return False
except RuntimeError:
raise Errors.DatabaseError(
@ -653,7 +658,11 @@ def probably_alive(person, db, current_date=None, limit=0):
# If there are ancestors that would be too old in the current year
# then assume our person must be dead too.
if ancestors_too_old (person, current_date.get_year()):
# Set to None otherwise there is a memory leak as this function
# is recursive
age_too_old = ancestors_too_old (person, current_date.get_year())
ancestors_too_old = None
if age_too_old:
return False
# If we can't find any reason to believe that they are dead we

View File

@ -2,6 +2,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2005 Donald N. Allingham
# Copyright (C) 2009 Gary Burton
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -258,6 +259,8 @@ class Callback(object):
# signal name clash
sys.stderr.write("Warning: signal name clash: %s\n" % str(k))
self.__signal_map[k] = v
# Set to None to prevent a memory leak in this recursive function
trav = None
# self.__signal_map now contains the connonical list
# of signals that this instance can emit.