diff --git a/libmamba/include/mamba/core/solver.hpp b/libmamba/include/mamba/core/solver.hpp index 9271e0ca2e..aff90ad83c 100644 --- a/libmamba/include/mamba/core/solver.hpp +++ b/libmamba/include/mamba/core/solver.hpp @@ -22,12 +22,10 @@ #include "mamba/core/pool.hpp" #include "mamba/core/satisfiability_error.hpp" #include "mamba/solver/request.hpp" -#include "mamba/specs/match_spec.hpp" #include "mamba/specs/package_info.hpp" namespace mamba::solv { - class ObjQueue; class ObjSolver; } @@ -104,7 +102,6 @@ namespace mamba MPool m_pool; // Temporary Pimpl all libsolv to keep it private std::unique_ptr m_solver; - std::unique_ptr m_jobs; Flags m_flags = {}; bool m_is_solved; diff --git a/libmamba/src/core/solver.cpp b/libmamba/src/core/solver.cpp index bf47c74b0e..374f5097fa 100644 --- a/libmamba/src/core/solver.cpp +++ b/libmamba/src/core/solver.cpp @@ -33,7 +33,6 @@ namespace mamba : m_libsolv_flags(std::move(flags)) , m_pool(std::move(pool)) , m_solver(nullptr) - , m_jobs(std::make_unique()) , m_is_solved(false) { } @@ -208,39 +207,6 @@ namespace mamba void MSolver::set_request(Request request) { - const auto& chan_params = m_pool.channel_context().params(); - for (const auto& item : request.items) - { - std::visit( - [&](const auto& r) - { - if constexpr (std::is_same_v, Request::Pin>) - { - add_job_impl(r, *m_jobs, m_pool.pool(), chan_params, m_flags.force_reinstall) - .or_else([](mamba_error&& error) { throw std::move(error); }); - } - }, - item - ); - } - // Fragile: Pins add solvables to Pol and hence require a call to create_whatprovides. - // Channel specific MatchSpec write to whatprovides and hence require it is not modified - // afterwards. - m_pool.create_whatprovides(); - for (const auto& item : request.items) - { - std::visit( - [&](const auto& r) - { - if constexpr (!std::is_same_v, Request::Pin>) - { - add_job_impl(r, *m_jobs, m_pool.pool(), chan_params, m_flags.force_reinstall) - .or_else([](mamba_error&& error) { throw std::move(error); }); - } - }, - item - ); - } m_request = std::move(request); } @@ -295,10 +261,46 @@ namespace mamba bool MSolver::try_solve() { + auto solv_jobs = solv::ObjQueue(); + + const auto& chan_params = m_pool.channel_context().params(); + for (const auto& item : m_request.items) + { + std::visit( + [&](const auto& r) + { + if constexpr (std::is_same_v, Request::Pin>) + { + add_job_impl(r, solv_jobs, m_pool.pool(), chan_params, m_flags.force_reinstall) + .or_else([](mamba_error&& error) { throw std::move(error); }); + } + }, + item + ); + } + // Fragile: Pins add solvables to Pol and hence require a call to create_whatprovides. + // Channel specific MatchSpec write to whatprovides and hence require it is not modified + // afterwards. + m_pool.create_whatprovides(); + for (const auto& item : m_request.items) + { + std::visit( + [&](const auto& r) + { + if constexpr (!std::is_same_v, Request::Pin>) + { + add_job_impl(r, solv_jobs, m_pool.pool(), chan_params, m_flags.force_reinstall) + .or_else([](mamba_error&& error) { throw std::move(error); }); + } + }, + item + ); + } + m_solver = std::make_unique(m_pool.pool()); apply_libsolv_flags(); - const bool success = solver().solve(m_pool.pool(), *m_jobs); + const bool success = solver().solve(m_pool.pool(), solv_jobs); m_is_solved = true; LOG_INFO << "Problem count: " << solver().problem_count(); Console::instance().json_write({ { "success", success } });