#include <string.h>
#include "bitmap.h"
+#include "util.h"
void
mapinit(Map *m, int n)
{
m->size = (n + 7) >> 3;
- m->map = calloc(m->size, 1);
+ m->map = xcalloc(m->size, 1);
}
// free space allocated
void
mapfree(Map *m)
{
- free(m->map);
- m->map = 0;
+ m->map = xfree(m->map);
m->size = 0;
}
clonemap(Map *t, Map *s)
{
t->size = s->size;
- t->map = malloc(s->size);
+ t->map = xmalloc(s->size);
memcpy(t->map, s->map, t->size);
}
Pool *pool = solv->pool;
int i, j;
Solvable *s;
- Id sup, *supp;
+ Id p, *pp, sup, *supp, rec, *recp;
+ if (solv->recommends_index < 0)
+ {
+ MAPZERO(&solv->recommends);
+ solv->recommends_index = 0;
+ }
+ while (solv->recommends_index < solv->decisionq.count)
+ {
+ p = solv->decisionq.elements[solv->recommends_index++];
+ if (p < 0)
+ continue;
+ s = pool->solvables + p;
+ if (!(recp = s->recommends))
+ continue;
+ while ((rec = *recp++) != 0)
+ FOR_PROVIDES(p, pp, rec)
+ MAPSET(&solv->recommends, p);
+ }
for (i = j = 0; i < plist->count; i++)
{
- s = pool->solvables + plist->elements[i];
+ p = plist->elements[i];
+ if (MAPTST(&solv->recommends, p))
+ {
+ plist->elements[j++] = p;
+ continue;
+ }
+ s = pool->solvables + p;
if (!s->supplements && !s->freshens)
continue;
if ((supp = s->supplements) != 0)
return r;
/* direct conflict! */
for (i = 0; i < solv->decisionq.count; i++)
- {
if (solv->decisionq.elements[i] == -p)
break;
- }
if (i == solv->decisionq.count)
abort();
if (solv->decisionq_why.elements[i] == 0)
solv->decisionq_why.count = i;
solv->decisionq.count = i;
+ solv->recommends_index = -1;
if (i < solv->propagate_index)
solv->propagate_index = i;
/* make direct decisions from enabled unary rules */
solv->decisionq_why.count--;
solv->propagate_index = solv->decisionq.count;
}
+ solv->recommends_index = -1;
}
queueinit(&solv->learnt_why);
queueinit(&solv->learnt_pool);
+ mapinit(&solv->recommends, pool->nsolvables);
+ solv->recommends_index = 0;
+
solv->decisionmap = (Id *)xcalloc(pool->nsolvables, sizeof(Id));
solv->rules = (Rule *)xmalloc((solv->nrules + (RULES_BLOCK + 1)) * sizeof(Rule));
memset(solv->rules, 0, sizeof(Rule));
queuefree(&solv->decisionq_why);
queuefree(&solv->learnt_why);
queuefree(&solv->learnt_pool);
+ mapfree(&solv->recommends);
xfree(solv->decisionmap);
xfree(solv->rules);
xfree(solv->watches);
#include "pool.h"
#include "source.h"
#include "queue.h"
+#include "bitmap.h"
/* ----------------------------------------------
* Rule
Pool *pool;
Source *system;
- int fixsystem; /* repair errors in rpm dependency graph */
- int allowdowngrade; /* allow to downgrade installed solvable */
- int allowarchchange; /* allow to change architecture of installed solvables */
- int allowuninstall; /* allow removal of system solvables, else keep all installed solvables */
- int updatesystem; /* distupgrade */
- int allowvirtualconflicts; /* false: conflicts on package name, true: conflicts on package provides */
+ int fixsystem; /* repair errors in rpm dependency graph */
+ int allowdowngrade; /* allow to downgrade installed solvable */
+ int allowarchchange; /* allow to change architecture of installed solvables */
+ int allowuninstall; /* allow removal of system solvables, else keep all installed solvables */
+ int updatesystem; /* distupgrade */
+ int allowvirtualconflicts; /* false: conflicts on package name, true: conflicts on package provides */
- Rule *rules; /* all rules */
- Id nrules; /* rpm rules */
+ Rule *rules; /* all rules */
+ Id nrules; /* rpm rules */
- Id jobrules; /* user rules */
- Id systemrules; /* policy rules, e.g. keep packages installed or update. All literals > 0 */
- Id learntrules; /* learnt rules */
+ Id jobrules; /* user rules */
+ Id systemrules; /* policy rules, e.g. keep packages installed or update. All literals > 0 */
+ Id learntrules; /* learnt rules */
- Id *weaksystemrules; /* please try to install (r->d) */
+ Id *weaksystemrules; /* please try to install (r->d) */
- Id *watches; /* Array of rule offsets
- * watches has nsolvables*2 entries and is addressed from the middle
- * middle-solvable : decision to conflict, offset point to linked-list of rules
- * middle+solvable : decision to install: offset point to linked-list of rules
- */
+ Id *watches; /* Array of rule offsets
+ * watches has nsolvables*2 entries and is addressed from the middle
+ * middle-solvable : decision to conflict, offset point to linked-list of rules
+ * middle+solvable : decision to install: offset point to linked-list of rules
+ */
/* our decisions: */
Queue decisionq;
- Queue decisionq_why; /* index of rule, Offset into rules */
- Id *decisionmap; /* map for all available solvables, > 0: level of decision when installed, < 0 level of decision when conflict */
+ Queue decisionq_why; /* index of rule, Offset into rules */
+ Id *decisionmap; /* map for all available solvables, > 0: level of decision when installed, < 0 level of decision when conflict */
/* learnt rule history */
Queue learnt_why;
Queue problems;
- int rc_output; /* output result compatible to redcarpet/zypp testsuite, set == 2 for pure rc (will suppress architecture) */
+ Map recommends; /* recommended packages from decisionmap */
+ int recommends_index; /* recommended level */
+
+ int rc_output; /* output result compatible to redcarpet/zypp testsuite, set == 2 for pure rc (will suppress architecture) */
} Solver;
/*