From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id 4AC2F1381F3 for ; Sat, 8 Jun 2013 20:48:14 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 4834EE086B; Sat, 8 Jun 2013 20:48:09 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id C8DDEE086B for ; Sat, 8 Jun 2013 20:48:08 +0000 (UTC) Received: from hornbill.gentoo.org (hornbill.gentoo.org [94.100.119.163]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id C13BE33E6EE for ; Sat, 8 Jun 2013 20:48:07 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id 1FD82E468F for ; Sat, 8 Jun 2013 20:48:05 +0000 (UTC) From: "Zac Medico" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Zac Medico" Message-ID: <1370724325.8ee7bafff1c81d129f1a4392b4df7c5ded05c1bc.zmedico@gentoo> Subject: [gentoo-commits] proj/portage:master commit in: pym/_emerge/ X-VCS-Repository: proj/portage X-VCS-Files: pym/_emerge/actions.py pym/_emerge/main.py X-VCS-Directories: pym/_emerge/ X-VCS-Committer: zmedico X-VCS-Committer-Name: Zac Medico X-VCS-Revision: 8ee7bafff1c81d129f1a4392b4df7c5ded05c1bc X-VCS-Branch: master Date: Sat, 8 Jun 2013 20:48:05 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: 91421e57-88b6-461d-a27e-5eedcf3c91bd X-Archives-Hash: 59eee85a1dca167291e30ae81f6100dc commit: 8ee7bafff1c81d129f1a4392b4df7c5ded05c1bc Author: Zac Medico gentoo org> AuthorDate: Sat Jun 8 20:45:25 2013 +0000 Commit: Zac Medico gentoo org> CommitDate: Sat Jun 8 20:45:25 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=8ee7baff emerge_main: hold large objects in emerge_config This allows emerge_main to avoid having direct local references to large local objects (like "settings" and "trees"), making it easier to ensure that stale objects can be garbage collected when other functions refresh the config with calls to load_emerge_config(). This will be much more flexible than the "gc_locals" approach that was introduce in commit e9fd283aedf54e2effc73f4157524fe9a26993c0. --- pym/_emerge/actions.py | 61 ++++++++++++++++++++++++++++++++++++-------------- pym/_emerge/main.py | 13 ++++++----- 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 1629d92..c7139d4 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -55,6 +55,7 @@ from portage._sets.base import InternalPackageSet from portage.util import cmp_sort_key, writemsg, varexpand, \ writemsg_level, writemsg_stdout from portage.util.digraph import digraph +from portage.util.SlotObject import SlotObject from portage.util._async.run_main_scheduler import run_main_scheduler from portage.util._async.SchedulerInterface import SchedulerInterface from portage.util._eventloop.global_event_loop import global_event_loop @@ -3128,25 +3129,49 @@ def git_sync_timestamps(portdb, portdir): return os.EX_OK -def load_emerge_config(trees=None): +class _emerge_config(SlotObject): + + __slots__ = ('action', 'args', 'mtimedb', 'opts', 'settings', 'trees') + + # Support unpack as tuple, for load_emerge_config backward compatibility. + def __getitem__(self, index): + if index == 0: + return self.settings + elif index == 1: + return self.trees + elif index == 2: + return self.mtimedb + raise IndexError(index) + + def __len__(self): + return 3 + +def load_emerge_config(emerge_config=None, **kargs): + + if emerge_config is None: + emerge_config = _emerge_config(**kargs) + kwargs = {} for k, envvar in (("config_root", "PORTAGE_CONFIGROOT"), ("target_root", "ROOT")): v = os.environ.get(envvar, None) if v and v.strip(): kwargs[k] = v - trees = portage.create_trees(trees=trees, **portage._native_kwargs(kwargs)) + emerge_config.trees = portage.create_trees(trees=emerge_config.trees, + **portage._native_kwargs(kwargs)) - for root_trees in trees.values(): + for root_trees in emerge_config.trees.values(): settings = root_trees["vartree"].settings settings._init_dirs() setconfig = load_default_config(settings, root_trees) root_trees["root_config"] = RootConfig(settings, root_trees, setconfig) - settings = trees[trees._target_eroot]['vartree'].settings - mtimedbfile = os.path.join(settings['EROOT'], portage.CACHE_PATH, "mtimedb") - mtimedb = portage.MtimeDB(mtimedbfile) - QueryCommand._db = trees - return settings, trees, mtimedb + target_eroot = emerge_config.trees._target_eroot + emerge_config.settings = emerge_config.trees[target_eroot]['vartree'].settings + emerge_config.mtimedb = portage.MtimeDB( + os.path.join(target_eroot, portage.CACHE_PATH, "mtimedb")) + QueryCommand._db = emerge_config.trees + + return emerge_config def getgccversion(chost): """ @@ -3506,14 +3531,14 @@ def repo_name_duplicate_check(trees): return bool(ignored_repos) -def run_action(settings, trees, mtimedb, myaction, myopts, myfiles, - gc_locals=None): +def run_action(emerge_config): - # The caller may have its local variables garbage collected, so - # they don't consume any memory during this long-running function. - if gc_locals is not None: - gc_locals() - gc_locals = None + myaction = emerge_config.action + myfiles = emerge_config.args + mtimedb = emerge_config.mtimedb + myopts = emerge_config.opts + settings = emerge_config.settings + trees = emerge_config.trees # skip global updates prior to sync, since it's called after sync if myaction not in ('help', 'info', 'sync', 'version') and \ @@ -3521,7 +3546,8 @@ def run_action(settings, trees, mtimedb, myaction, myopts, myfiles, _global_updates(trees, mtimedb["updates"], quiet=("--quiet" in myopts)): mtimedb.commit() # Reload the whole config from scratch. - settings, trees, mtimedb = load_emerge_config(trees=trees) + settings, trees, mtimedb = \ + load_emerge_config(emerge_config=emerge_config) xterm_titles = "notitles" not in settings.features if xterm_titles: @@ -3531,7 +3557,8 @@ def run_action(settings, trees, mtimedb, myaction, myopts, myfiles, os.environ["FEATURES"] = os.environ.get("FEATURES","") + " digest" # Reload the whole config from scratch so that the portdbapi internal # config is updated with new FEATURES. - settings, trees, mtimedb = load_emerge_config(trees=trees) + settings, trees, mtimedb = \ + load_emerge_config(emerge_config=emerge_config) # NOTE: adjust_configs() can map options to FEATURES, so any relevant # options adjustments should be made prior to calling adjust_configs(). diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py index e066c87..4b9af7c 100644 --- a/pym/_emerge/main.py +++ b/pym/_emerge/main.py @@ -1041,17 +1041,18 @@ def emerge_main(args=None): os.umask(0o22) if myaction == "sync": portage._sync_disabled_warnings = True - settings, trees, mtimedb = load_emerge_config() - rval = profile_check(trees, myaction) + emerge_config = load_emerge_config( + action=myaction, args=myfiles, opts=myopts) + rval = profile_check(emerge_config.trees, emerge_config.action) if rval != os.EX_OK: return rval tmpcmdline = [] if "--ignore-default-opts" not in myopts: tmpcmdline.extend(portage.util.shlex_split( - settings.get("EMERGE_DEFAULT_OPTS", ""))) + emerge_config.settings.get("EMERGE_DEFAULT_OPTS", ""))) tmpcmdline.extend(args) - myaction, myopts, myfiles = parse_opts(tmpcmdline) + emerge_config.action, emerge_config.opts, emerge_config.args = \ + parse_opts(tmpcmdline) - return run_action(settings, trees, mtimedb, myaction, myopts, myfiles, - gc_locals=locals().clear) + return run_action(emerge_config)