* If the proof contains at least one weak rule, we disable the
* last of them.
*
- * Otherwise we return 0 if disablerules is not set or disable
- * _all_ of the problem rules and return 1.
+ * Otherwise we return -1 if disablerules is not set or disable
+ * _all_ of the problem rules and return 0.
*
- * return: 1 - disabled some rules, try again
- * 0 - hopeless
+ * return: 0 - disabled some rules, try again
+ * -1 - hopeless
*/
static int
if (v < 0)
solver_reenablepolicyrules(solv, -v);
solver_reset(solv);
- return 1;
+ return 0;
}
if (solv->allowuninstall && (v = autouninstall(solv, solv->problems.elements + oldproblemcount + 1)) != 0)
solv->problems.count = oldproblemcount;
solv->learnt_pool.count = oldlearntpoolcount;
solver_reset(solv);
- return 1;
+ return 0;
}
/* finish proof */
solver_disableproblem(solv, solv->problems.elements[i]);
/* XXX: might want to enable all weak rules again */
solver_reset(solv);
- return 1;
+ return 0;
}
POOL_DEBUG(SOLV_DEBUG_UNSOLVABLE, "UNSOLVABLE\n");
- return 0;
+ return -1;
}
* rule to learnt rule set, make decision from learnt
* rule (always unit) and re-propagate.
*
- * returns the new solver level or 0 if unsolvable
+ * returns the new solver level or -1 if unsolvable
*
*/
Pool *pool = solv->pool;
Rule *r, *lr;
- assert(ruleid >= 0);
if (decision)
{
level++;
queue_push(&solv->decisionq, decision);
queue_push(&solv->decisionq_why, -ruleid); /* <= 0 -> free decision */
}
+ assert(ruleid >= 0 && level > 0);
for (;;)
{
r = propagate(solv, level);
break;
if (level == 1)
{
- if (!analyze_unsolvable(solv, r, disablerules))
- return 0;
+ if (analyze_unsolvable(solv, r, disablerules) < 0)
+ return -1;
continue; /* propagate initial decisions */
}
POOL_DEBUG(SOLV_DEBUG_ANALYZE, "conflict with rule #%d\n", (int)(r - solv->rules));
POOL_DEBUG(SOLV_DEBUG_PROPAGATE, "propagating (propagate_index: %d; size decisionq: %d)...\n", solv->propagate_index, solv->decisionq.count);
if ((r = propagate(solv, level)) != 0)
{
- if (analyze_unsolvable(solv, r, disablerules))
+ if (analyze_unsolvable(solv, r, disablerules) >= 0)
continue;
- level = 0;
+ level = -1;
break; /* unsolvable */
}
}
level = resolve_jobrules(solv, level, disablerules, &dq);
if (level < olevel)
{
- if (level == 0)
+ if (level < 0)
break; /* unsolvable */
continue;
}
{
olevel = level;
level = selectandinstall(solv, level, &dq, disablerules, rr - solv->rules);
- if (level == 0)
- {
- queue_free(&dq);
- queue_free(&dqs);
- return;
- }
+ if (level < 0)
+ break;
if (level <= olevel)
{
if (level == 1 || level < passlevel)
POOL_DEBUG(SOLV_DEBUG_POLICY, "keeping %s\n", pool_solvid2str(pool, i));
level = setpropagatelearn(solv, level, i, disablerules, r - solv->rules);
}
- if (level == 0)
+ if (level < 0)
break;
if (level <= olevel)
{
}
installedpos = installed->start; /* reset installedpos */
}
- if (level == 0)
+ if (level < 0)
break; /* unsolvable */
systemlevel = level + 1;
if (pass < 2)
olevel = level;
level = selectandinstall(solv, level, &dq, disablerules, r - solv->rules);
- if (level == 0)
+ if (level < 0)
break; /* unsolvable */
if (level < systemlevel || level == 1)
break; /* trouble */
if (n < solv->nrules) /* ran into trouble? */
{
- if (level == 0)
+ if (level < 0)
break; /* unsolvable */
continue; /* start over */
}
else
POOL_DEBUG(SOLV_DEBUG_POLICY, "installing recommended %s\n", pool_solvid2str(pool, p));
level = setpropagatelearn(solv, level, p, 0, 0);
- if (level == 0)
+ if (level < 0)
break;
continue; /* back to main loop */
}
if (i < dqs.count || solv->decisionq.count < decisioncount)
{
map_free(&dqmap);
- if (level == 0)
+ if (level < 0)
break;
continue;
}
break; /* had a problem above, quit loop */
}
map_free(&dqmap);
- if (level == 0)
+ if (level < 0)
break;
continue; /* back to main loop so that all deps are checked */
}
}
if (installedone || i < solv->orphaned.count)
{
- if (level == 0)
+ if (level < 0)
break;
continue; /* back to main loop */
}
}
if (i < solv->orphaned.count)
{
- if (level == 0)
+ if (level < 0)
break;
continue; /* back to main loop */
}
if (level < olevel)
break;
}
- if (level == 0)
+ if (level < 0)
break;
continue;
}
}
if (p < solv->installed->end)
{
- if (level == 0)
+ if (level < 0)
break;
continue; /* back to main loop */
}
while (i > 0 && solv->branches.elements[i - 1] > 0)
i--;
level = takebranch(solv, i, endi, "branching", disablerules);
- if (level == 0)
+ if (level < 0)
break;
continue;
}
{
minimizationsteps++;
level = takebranch(solv, lasti, lastiend, "minimizing", disablerules);
- if (level == 0)
+ if (level < 0)
break;
continue; /* back to main loop */
}
POOL_DEBUG(SOLV_DEBUG_STATS, "done solving.\n\n");
queue_free(&dq);
queue_free(&dqs);
- if (level == 0)
+ if (level < 0)
{
/* unsolvable */
solv->decisioncnt_jobs = solv->decisionq.count;