public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/portage:master commit in: pym/portage/dbapi/, pym/portage/tests/resolver/
@ 2013-06-08 11:09 Zac Medico
  0 siblings, 0 replies; only message in thread
From: Zac Medico @ 2013-06-08 11:09 UTC (permalink / raw
  To: gentoo-commits

commit:     1c9627e3749553a792de609c7931d17930738aed
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sat Jun  8 11:08:47 2013 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sat Jun  8 11:08:47 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=1c9627e3

close_portdbapi_caches: portage.db atexit hook

The python interpreter does _not_ guarantee that destructors are
called for objects that remain when the interpreter exits, so we
use an atexit hook to call destructors for any global portdbapi
instances that may have been constructed.

---
 pym/portage/dbapi/porttree.py                    | 37 +++++++++++++++++++++---
 pym/portage/tests/resolver/ResolverPlayground.py |  3 ++
 2 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py
index b106de7..fc3fc03 100644
--- a/pym/portage/dbapi/porttree.py
+++ b/pym/portage/dbapi/porttree.py
@@ -53,6 +53,39 @@ if sys.hexversion >= 0x3000000:
 	basestring = str
 	long = int
 
+def close_portdbapi_caches():
+	# The python interpreter does _not_ guarantee that destructors are
+	# called for objects that remain when the interpreter exits, so we
+	# use an atexit hook to call destructors for any global portdbapi
+	# instances that may have been constructed.
+	try:
+		portage._legacy_globals_constructed
+	except AttributeError:
+		pass
+	else:
+		if "db" in portage._legacy_globals_constructed:
+			try:
+				db = portage.db
+			except AttributeError:
+				pass
+			else:
+				if isinstance(db, dict):
+					for x in db.values():
+						try:
+							if "porttree" in x.lazy_items:
+								continue
+						except (AttributeError, TypeError):
+							continue
+						try:
+							x = x.pop("porttree").dbapi
+						except (AttributeError, KeyError):
+							continue
+						if not isinstance(x, portdbapi):
+							continue
+						x.close_caches()
+
+portage.process.atexit_register(close_portdbapi_caches)
+
 # It used to be necessary for API consumers to remove portdbapi instances
 # from portdbapi_instances, in order to avoid having accumulated instances
 # consume memory. Now, portdbapi_instances is just an empty dummy list, so
@@ -67,10 +100,6 @@ class _dummy_list(list):
 		except ValueError:
 			pass
 
-def close_portdbapi_caches():
-	# Since portdbapi_instances is a dummy list, there's nothing to do here.
-	pass
-
 class portdbapi(dbapi):
 	"""this tree will scan a portage directory located at root (passed to init)"""
 	portdbapi_instances = _dummy_list()

diff --git a/pym/portage/tests/resolver/ResolverPlayground.py b/pym/portage/tests/resolver/ResolverPlayground.py
index 15ef95d..bff4512 100644
--- a/pym/portage/tests/resolver/ResolverPlayground.py
+++ b/pym/portage/tests/resolver/ResolverPlayground.py
@@ -544,6 +544,9 @@ class ResolverPlayground(object):
 				return
 
 	def cleanup(self):
+		for eroot in self.trees:
+			portdb = self.trees[eroot]["porttree"].dbapi
+			portdb.close_caches()
 		if self.debug:
 			print("\nEROOT=%s" % self.eroot)
 		else:


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2013-06-08 11:09 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-08 11:09 [gentoo-commits] proj/portage:master commit in: pym/portage/dbapi/, pym/portage/tests/resolver/ Zac Medico

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox