diff options
| author | Julian Andres Klode <julian.klode@canonical.com> | 2025-02-06 12:40:01 +0100 |
|---|---|---|
| committer | Julian Andres Klode <julian.klode@canonical.com> | 2025-02-07 20:59:43 +0100 |
| commit | cce96b85691fac0bbbbb84a501c6f39a0c9125c0 (patch) | |
| tree | 1cb6c6a3524e35381e96896cc337d3778694fa14 /apt-pkg/solver3.cc | |
| parent | 8f4c09bb58b047a73328f935b9abeb4fe0b03ae1 (diff) | |
solver3: Avoid std::vector for statically sized arrays
The bounds checking on the vector accesses is killing performance,
so switch from vector to a basic array, given that we don't actually
need _any_ functionality from vector...
Of course while we are at it, let us define a safe wrapper around
it so we cannot accidentally index arrays for package IDs with
version IDs and whatnot.
Diffstat (limited to 'apt-pkg/solver3.cc')
| -rw-r--r-- | apt-pkg/solver3.cc | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/apt-pkg/solver3.cc b/apt-pkg/solver3.cc index 36bdd9aeb..ed9beb828 100644 --- a/apt-pkg/solver3.cc +++ b/apt-pkg/solver3.cc @@ -198,11 +198,11 @@ APT::Solver::Solver(pkgCache &cache, pkgDepCache::Policy &policy) : cache(cache), policy(policy), rootState(new State), - pkgStates(cache.Head().PackageCount), - verStates(cache.Head().VersionCount), - pkgObsolete(cache.Head().PackageCount), - priorities(cache.Head().VersionCount), - candidates(cache.Head().PackageCount) + pkgStates(cache), + verStates(cache), + pkgObsolete(cache), + priorities(cache), + candidates(cache) { // Ensure trivially static_assert(std::is_trivially_destructible_v<Work>); @@ -295,7 +295,7 @@ bool APT::Solver::ObsoletedByNewerSourceVersion(pkgCache::VerIterator cand) cons if (priority == 0 || priority < candPriority) continue; - pkgObsolete[pkg->ID] = 2; + pkgObsolete[pkg] = 2; if (debug >= 3) std::cerr << "Obsolete: " << cand.ParentPkg().FullName() << "=" << cand.VerStr() << " due to " << ver.ParentPkg().FullName() << "=" << ver.VerStr() << "\n"; return true; @@ -306,8 +306,8 @@ bool APT::Solver::ObsoletedByNewerSourceVersion(pkgCache::VerIterator cand) cons bool APT::Solver::Obsolete(pkgCache::PkgIterator pkg) const { - if (pkgObsolete[pkg->ID] != 0) - return pkgObsolete[pkg->ID] == 2; + if (pkgObsolete[pkg] != 0) + return pkgObsolete[pkg] == 2; auto ver = GetCandidateVer(pkg); @@ -317,7 +317,7 @@ bool APT::Solver::Obsolete(pkgCache::PkgIterator pkg) const { if (debug >= 3) std::cerr << "Obsolete: " << pkg.FullName() << " - not installable\n"; - pkgObsolete[pkg->ID] = 2; + pkgObsolete[pkg] = 2; return true; } @@ -327,12 +327,12 @@ bool APT::Solver::Obsolete(pkgCache::PkgIterator pkg) const for (auto file = ver.FileList(); !file.end(); file++) if ((file.File()->Flags & pkgCache::Flag::NotSource) == 0) { - pkgObsolete[pkg->ID] = 1; + pkgObsolete[pkg] = 1; return false; } if (debug >= 3) std::cerr << "Obsolete: " << ver.ParentPkg().FullName() << "=" << ver.VerStr() << " - not installable\n"; - pkgObsolete[pkg->ID] = 2; + pkgObsolete[pkg] = 2; return true; } bool APT::Solver::Assume(Var var, bool decision, Var reason) |
