unsigned int now;
int oldmistakes = solv->cleandeps_mistakes ? solv->cleandeps_mistakes->count : 0;
Id extraflags = -1;
+ int decisioncnt_update;
+ int decisioncnt_keep;
+ int decisioncnt_resolve;
+ int decisioncnt_weak;
+ int decisioncnt_orphan;
now = solv_timems(0);
queue_init(&redoq);
- /* save decisionq, decisionq_why, decisionmap */
+ /* save decisionq, decisionq_why, decisionmap, and decisioncnt */
for (i = 0; i < solv->decisionq.count; i++)
{
Id p = solv->decisionq.elements[i];
queue_push(&redoq, solv->decisionq_why.elements[i]);
queue_push(&redoq, solv->decisionmap[p > 0 ? p : -p]);
}
+ decisioncnt_update = solv->decisioncnt_update;
+ decisioncnt_keep = solv->decisioncnt_keep;
+ decisioncnt_resolve = solv->decisioncnt_resolve;
+ decisioncnt_weak = solv->decisioncnt_weak;
+ decisioncnt_orphan = solv->decisioncnt_orphan;
+
/* save problems queue */
problems_save = solv->problems;
memset(&solv->problems, 0, sizeof(solv->problems));
solv->decisionmap[p > 0 ? p : -p] = redoq.elements[i + 2];
}
queue_free(&redoq);
+ solv->decisioncnt_update = decisioncnt_update;
+ solv->decisioncnt_keep = decisioncnt_keep;
+ solv->decisioncnt_resolve = decisioncnt_resolve;
+ solv->decisioncnt_weak = decisioncnt_weak;
+ solv->decisioncnt_orphan = decisioncnt_orphan;
+
/* restore problems */
queue_free(&solv->problems);
solv->problems = problems_save;
queue_empty(&solv->decisionq);
solv->recommends_index = -1;
solv->propagate_index = 0;
+ solv->decisioncnt_update = solv->decisioncnt_keep = solv->decisioncnt_resolve = solv->decisioncnt_weak = solv->decisioncnt_orphan = 0;
queue_empty(&solv->branches);
/* adapt learnt rule status to new set of enabled/disabled rules */
solv->branches.count--;
}
solv->recommends_index = -1;
+ if (solv->decisionq.count < solv->decisioncnt_update)
+ solv->decisioncnt_update = 0;
+ if (solv->decisionq.count < solv->decisioncnt_keep)
+ solv->decisioncnt_keep = 0;
+ if (solv->decisionq.count < solv->decisioncnt_resolve)
+ solv->decisioncnt_resolve = 0;
+ if (solv->decisionq.count < solv->decisioncnt_weak)
+ solv->decisioncnt_weak= 0;
+ if (solv->decisionq.count < solv->decisioncnt_orphan)
+ solv->decisioncnt_orphan = 0;
}
systemlevel = level + 1;
if (i < solv->jobrules_end)
continue;
- solv->decisioncnt_update = solv->decisionq.count;
- solv->decisioncnt_keep = solv->decisionq.count;
+ if (!solv->decisioncnt_update)
+ solv->decisioncnt_update = solv->decisionq.count;
}
/*
{
int passlevel = level;
Id *multiversionupdaters = solv->multiversion.size ? solv->multiversionupdaters : 0;
- if (pass == 1)
+ if (pass == 1 && !solv->decisioncnt_keep)
solv->decisioncnt_keep = solv->decisionq.count;
/* start with installedpos, the position that gave us problems the last time */
for (i = installedpos, n = installed->start; n < installed->end; i++, n++)
if (pass < 2)
continue; /* had trouble, retry */
}
+ if (!solv->decisioncnt_keep)
+ solv->decisioncnt_keep = solv->decisionq.count;
if (level < systemlevel)
systemlevel = level;
/*
* decide
*/
- solv->decisioncnt_resolve = solv->decisionq.count;
+ if (!solv->decisioncnt_resolve)
+ solv->decisioncnt_resolve = solv->decisionq.count;
POOL_DEBUG(SOLV_DEBUG_POLICY, "deciding unresolved rules\n");
for (i = 1, n = 1; n < solv->nrules; i++, n++)
{
continue;
}
- solv->decisioncnt_weak = solv->decisionq.count;
+ if (!solv->decisioncnt_weak)
+ solv->decisioncnt_weak = solv->decisionq.count;
if (doweak)
{
int qcount;
}
}
- solv->decisioncnt_orphan = solv->decisionq.count;
+ if (!solv->decisioncnt_orphan)
+ solv->decisioncnt_orphan = solv->decisionq.count;
if (solv->dupmap_all && solv->installed)
{
int installedone = 0;
Id why;
why = solv->decisionq_why.elements[i];
if (why)
- continue; /* forced by unit rule */
+ continue; /* forced by unit rule or dep resolving */
p = solv->decisionq.elements[i];
if (p < 0)
continue;
if (i == solv->decisionq.count) /* just in case... */
return SOLVER_REASON_UNRELATED;
why = solv->decisionq_why.elements[i];
+ if (infop)
+ *infop = why > 0 ? why : -why;
if (why > 0)
- {
- if (infop)
- *infop = why;
- return SOLVER_REASON_UNIT_RULE;
- }
+ return SOLVER_REASON_UNIT_RULE;
why = -why;
if (i < solv->decisioncnt_update)
{
if (i == 0)
return SOLVER_REASON_KEEP_INSTALLED;
- if (infop)
- *infop = why;
return SOLVER_REASON_RESOLVE_JOB;
}
if (i < solv->decisioncnt_keep)
{
if (why == 0 && pp < 0)
return SOLVER_REASON_CLEANDEPS_ERASE;
- if (infop)
- *infop = why;
return SOLVER_REASON_UPDATE_INSTALLED;
}
if (i < solv->decisioncnt_resolve)
{
if (why == 0 && pp < 0)
return SOLVER_REASON_CLEANDEPS_ERASE;
- if (infop)
- *infop = why;
return SOLVER_REASON_KEEP_INSTALLED;
}
- if (i < solv->decisioncnt_weak)
- {
- if (infop)
- *infop = why;
- return SOLVER_REASON_RESOLVE;
- }
+ if (why > 0)
+ return SOLVER_REASON_RESOLVE;
+ /* weak or orphaned */
if (solv->decisionq.count < solv->decisioncnt_orphan)
return SOLVER_REASON_WEAKDEP;
return SOLVER_REASON_RESOLVE_ORPHAN;