diff options
author | David Kalnischkies <david@kalnischkies.de> | 2021-03-18 17:37:49 +0100 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2021-04-26 13:00:24 +0200 |
commit | d6f3458badf2cfea3ca7de7632ae31daff5742be (patch) | |
tree | 7acc19c1e590fe8c2c81ef6609fa1a5a863d90da /apt-pkg/depcache.cc | |
parent | 9a54e70c1040379fb06827bacb461c61e341e694 (diff) |
Call MarkAndSweep only manually in apt-get for autoremove
An interactive tool like aptitude needs these flags current far more
often than we do as a user can see them in apt only in one very well
defined place – the autoremove display block – so we don't need to run
it up to four times while a normal "apt install" is processed as that is
just busywork.
The effect on runtime is minimal, as a single run doesn't take too long
anyhow, but it cuts down tremendously on debug output at the expense of
requiring some manual handholding.
This is opt-in so that aptitude doesn't need to change nor do we need to
change our own tools like "apt list" where it is working correctly as
intended.
A special flag and co is needed as we want to prevent the ActionGroup
inside pkgDepCache::Init to be inhibited already so we need to insert
ourselves while the DepCache is still in the process of being built.
This is also the reason why the debug output in some tests changed to
all unmarked, but that is fine as the marking could have been already
obsoleted by the actions taken, just inhibited by a proper action group.
Diffstat (limited to 'apt-pkg/depcache.cc')
-rw-r--r-- | apt-pkg/depcache.cc | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index 13beeb713..a958e6c76 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -88,31 +88,35 @@ ConfigValueInSubTree(const char* SubTree, const char *needle) pkgDepCache::ActionGroup::ActionGroup(pkgDepCache &cache) : /*{{{*/ d(NULL), cache(cache), released(false) { - ++cache.group_level; + cache.IncreaseActionGroupLevel(); } void pkgDepCache::ActionGroup::release() { - if(!released) - { - if(cache.group_level == 0) - std::cerr << "W: Unbalanced action groups, expect badness" << std::endl; - else - { - --cache.group_level; - - if(cache.group_level == 0) - cache.MarkAndSweep(); - } - - released = true; - } + if(released) + return; + released = true; + if (cache.DecreaseActionGroupLevel() == 0) + cache.MarkAndSweep(); } pkgDepCache::ActionGroup::~ActionGroup() { release(); } +int pkgDepCache::IncreaseActionGroupLevel() +{ + return ++group_level; +} +int pkgDepCache::DecreaseActionGroupLevel() +{ + if(group_level == 0) + { + std::cerr << "W: Unbalanced action groups, expect badness\n"; + return -1; + } + return --group_level; +} /*}}}*/ // DepCache::pkgDepCache - Constructors /*{{{*/ // --------------------------------------------------------------------- |