From 7b6d45c94231c30cd3ce280307269b5dc2367e22 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 11 Jun 2013 19:34:47 +0200 Subject: [PATCH] LibsolvSolver: Use Solvable only where necessary repo_internalize() apparently reorganizes the storage for Solvable objects so that our fSolvablePackages and fPackageSolvables maps could contain invalid pointers. Now the maps use the solvables' ID instead. Also use the IDs instead of the Solvable objects in most other places, which in some cases even simplifies the code a bit. --- src/kits/package/solver/LibsolvSolver.cpp | 84 ++++++++++------------- src/kits/package/solver/LibsolvSolver.h | 10 ++- 2 files changed, 40 insertions(+), 54 deletions(-) diff --git a/src/kits/package/solver/LibsolvSolver.cpp b/src/kits/package/solver/LibsolvSolver.cpp index 399ac6c62f..6b12780659 100644 --- a/src/kits/package/solver/LibsolvSolver.cpp +++ b/src/kits/package/solver/LibsolvSolver.cpp @@ -518,12 +518,11 @@ LibsolvSolver::GetResult(BSolverResult& _result) for (int i = 0; i < transaction->steps.count; i++) { Id solvableId = transaction->steps.elements[i]; - Solvable* solvable = pool_id2solvable(fPool, solvableId); switch (transaction_type(transaction, solvableId, SOLVER_TRANSACTION_RPM_ONLY)) { case SOLVER_TRANSACTION_ERASE: { - BSolverPackage* package = _GetPackage(solvable); + BSolverPackage* package = _GetPackage(solvableId); if (package == NULL) return B_ERROR; @@ -551,7 +550,7 @@ LibsolvSolver::GetResult(BSolverResult& _result) if (!foundPackage) continue; - BSolverPackage* package = _GetPackage(solvable); + BSolverPackage* package = _GetPackage(solvableId); if (package == NULL) return B_ERROR; @@ -719,11 +718,10 @@ LibsolvSolver::_AddRepositories() BSolverPackage* package = repository->PackageAt(k); Id solvableId = repo_add_haiku_package_info(repo, package->Info(), REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE); - Solvable* solvable = pool_id2solvable(fPool, solvableId); try { - fSolvablePackages[solvable] = package; - fPackageSolvables[package] = solvable; + fSolvablePackages[solvableId] = package; + fPackageSolvables[package] = solvableId; } catch (std::bad_alloc&) { return B_NO_MEMORY; } @@ -759,26 +757,18 @@ LibsolvSolver::_GetRepositoryInfo(BSolverRepository* repository) const BSolverPackage* -LibsolvSolver::_GetPackage(Solvable* solvable) const +LibsolvSolver::_GetPackage(Id solvableId) const { - SolvableMap::const_iterator it = fSolvablePackages.find(solvable); + SolvableMap::const_iterator it = fSolvablePackages.find(solvableId); return it != fSolvablePackages.end() ? it->second : NULL; } -BSolverPackage* -LibsolvSolver::_GetPackage(Id solvableId) const -{ - Solvable* solvable = pool_id2solvable(fPool, solvableId); - return solvable != NULL ? _GetPackage(solvable) : NULL; -} - - -Solvable* +Id LibsolvSolver::_GetSolvable(BSolverPackage* package) const { PackageMap::const_iterator it = fPackageSolvables.find(package); - return it != fPackageSolvables.end() ? it->second : NULL; + return it != fPackageSolvables.end() ? it->second : 0; } @@ -797,14 +787,13 @@ LibsolvSolver::_AddSpecifiedPackages( case BSolverPackageSpecifier::B_PACKAGE: { BSolverPackage* package = specifier.Package(); - Solvable* solvable; + Id solvableId; if (package == NULL - || (solvable = _GetSolvable(package)) == NULL) { + || (solvableId = _GetSolvable(package)) == 0) { return B_BAD_VALUE; } - queue_push2(fJobs, SOLVER_SOLVABLE, - solvable - fPool->solvables); + queue_push2(fJobs, SOLVER_SOLVABLE, solvableId); break; } @@ -1034,11 +1023,11 @@ LibsolvSolver::_AddSolutionElement(Solution* solution, Id sourceId, Id targetId) && fPool->solvables[what].repo == fInstalledRepository->SolvRepo()) { return _AddSolutionElement(solution, Element::B_DONT_KEEP, - fPool->solvables + what, NULL, NULL); + what, 0, NULL); } return _AddSolutionElement(solution, - Element::B_DONT_INSTALL, NULL, NULL, + Element::B_DONT_INSTALL, 0, 0, solver_select2str(fPool, select, what)); case SOLVER_ERASE: @@ -1048,33 +1037,32 @@ LibsolvSolver::_AddSolutionElement(Solution* solution, Id sourceId, Id targetId) || fPool->solvables[what].repo != fInstalledRepository->SolvRepo())) { return _AddSolutionElement(solution, - Element::B_DONT_FORBID_INSTALLATION, - fPool->solvables + what, NULL, NULL); + Element::B_DONT_FORBID_INSTALLATION, what, 0, NULL); } Element::BType type = select == SOLVER_SOLVABLE_PROVIDES ? Element::B_DONT_DEINSTALL_ALL : Element::B_DONT_DEINSTALL; - return _AddSolutionElement(solution, type, NULL, NULL, + return _AddSolutionElement(solution, type, 0, 0, solver_select2str(fPool, select, what)); } case SOLVER_UPDATE: return _AddSolutionElement(solution, - Element::B_DONT_INSTALL_MOST_RECENT, NULL, NULL, + Element::B_DONT_INSTALL_MOST_RECENT, 0, 0, solver_select2str(fPool, select, what)); case SOLVER_LOCK: - return _AddSolutionElement(solution, Element::B_DONT_LOCK, NULL, - NULL, solver_select2str(fPool, select, what)); + return _AddSolutionElement(solution, Element::B_DONT_LOCK, 0, 0, + solver_select2str(fPool, select, what)); default: - return _AddSolutionElement(solution, Element::B_UNSPECIFIED, - NULL, NULL, NULL); + return _AddSolutionElement(solution, Element::B_UNSPECIFIED, 0, + 0, NULL); } } Solvable* target = targetId != 0 ? fPool->solvables + targetId : NULL; - bool targetInstalled = target && fInstalledRepository + bool targetInstalled = target != NULL && fInstalledRepository && target->repo == fInstalledRepository->SolvRepo(); if (sourceId == SOLVER_SOLUTION_INFARCH) { @@ -1082,61 +1070,61 @@ LibsolvSolver::_AddSolutionElement(Solution* solution, Id sourceId, Id targetId) targetInstalled ? Element::B_KEEP_INFERIOR_ARCHITECTURE : Element::B_INSTALL_INFERIOR_ARCHITECTURE, - target, NULL, NULL); + targetId, 0, NULL); } if (sourceId == SOLVER_SOLUTION_DISTUPGRADE) { return _AddSolutionElement(solution, targetInstalled ? Element::B_KEEP_EXCLUDED : Element::B_INSTALL_EXCLUDED, - target, NULL, NULL); + targetId, 0, NULL); } if (sourceId == SOLVER_SOLUTION_BEST) { return _AddSolutionElement(solution, targetInstalled ? Element::B_KEEP_OLD : Element::B_INSTALL_OLD, - target, NULL, NULL); + targetId, 0, NULL); } // replace source with target Solvable* source = fPool->solvables + sourceId; if (target == NULL) { return _AddSolutionElement(solution, Element::B_ALLOW_DEINSTALLATION, - source, NULL, NULL); + sourceId, 0, NULL); } int illegalMask = policy_is_illegal(fSolver, source, target, 0); if ((illegalMask & POLICY_ILLEGAL_DOWNGRADE) != 0) { status_t error = _AddSolutionElement(solution, - Element::B_ALLOW_DOWNGRADE, source, target, NULL); + Element::B_ALLOW_DOWNGRADE, sourceId, targetId, NULL); if (error != B_OK) return error; } if ((illegalMask & POLICY_ILLEGAL_NAMECHANGE) != 0) { status_t error = _AddSolutionElement(solution, - Element::B_ALLOW_NAME_CHANGE, source, target, NULL); + Element::B_ALLOW_NAME_CHANGE, sourceId, targetId, NULL); if (error != B_OK) return error; } if ((illegalMask & POLICY_ILLEGAL_ARCHCHANGE) != 0) { status_t error = _AddSolutionElement(solution, - Element::B_ALLOW_ARCHITECTURE_CHANGE, source, target, NULL); + Element::B_ALLOW_ARCHITECTURE_CHANGE, sourceId, targetId, NULL); if (error != B_OK) return error; } if ((illegalMask & POLICY_ILLEGAL_VENDORCHANGE) != 0) { status_t error = _AddSolutionElement(solution, - Element::B_ALLOW_VENDOR_CHANGE, source, target, NULL); + Element::B_ALLOW_VENDOR_CHANGE, sourceId, targetId, NULL); if (error != B_OK) return error; } if (illegalMask == 0) { return _AddSolutionElement(solution, Element::B_ALLOW_REPLACEMENT, - source, target, NULL); + sourceId, targetId, NULL); } return B_OK; @@ -1145,19 +1133,19 @@ LibsolvSolver::_AddSolutionElement(Solution* solution, Id sourceId, Id targetId) status_t LibsolvSolver::_AddSolutionElement(Solution* solution, - BSolverProblemSolutionElement::BType type, Solvable* sourceSolvable, - Solvable* targetSolvable, const char* selectionString) + BSolverProblemSolutionElement::BType type, Id sourceSolvableId, + Id targetSolvableId, const char* selectionString) { BSolverPackage* sourcePackage = NULL; - if (sourceSolvable != NULL) { - sourcePackage = _GetPackage(sourceSolvable); + if (sourceSolvableId != 0) { + sourcePackage = _GetPackage(sourceSolvableId); if (sourcePackage == NULL) return B_ERROR; } BSolverPackage* targetPackage = NULL; - if (targetSolvable != NULL) { - targetPackage = _GetPackage(targetSolvable); + if (targetSolvableId != 0) { + targetPackage = _GetPackage(targetSolvableId); if (targetPackage == NULL) return B_ERROR; } diff --git a/src/kits/package/solver/LibsolvSolver.h b/src/kits/package/solver/LibsolvSolver.h index 2f61739bec..77bbc36289 100644 --- a/src/kits/package/solver/LibsolvSolver.h +++ b/src/kits/package/solver/LibsolvSolver.h @@ -72,8 +72,8 @@ private: typedef BObjectList RepositoryInfoList; typedef BObjectList ProblemList; - typedef std::map SolvableMap; - typedef std::map PackageMap; + typedef std::map SolvableMap; + typedef std::map PackageMap; private: status_t _InitPool(); @@ -88,9 +88,8 @@ private: status_t _AddRepositories(); RepositoryInfo* _GetRepositoryInfo( BSolverRepository* repository) const; - BSolverPackage* _GetPackage(Solvable* solvable) const; BSolverPackage* _GetPackage(Id solvableId) const; - Solvable* _GetSolvable(BSolverPackage* package) const; + Id _GetSolvable(BSolverPackage* package) const; status_t _AddSpecifiedPackages( const BSolverPackageSpecifierList& packages, @@ -103,8 +102,7 @@ private: Id sourceId, Id targetId); status_t _AddSolutionElement(Solution* solution, BSolverProblemSolutionElement::BType type, - Solvable* sourceSolvable, - Solvable* targetSolvable, + Id sourceSolvableId, Id targetSolvableId, const char* selectionString); status_t _GetResolvableExpression(Id id, BPackageResolvableExpression& _expression)