From: Michael Schroeder Date: Wed, 17 Oct 2007 15:59:55 +0000 (+0000) Subject: - added pool_installable() inline function X-Git-Tag: BASE-SuSE-Code-12_1-Branch~1227 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4955fd9f58b722989942efd559c89eabea9ee50d;p=platform%2Fupstream%2Flibsolv.git - added pool_installable() inline function - renamed addrelproviders() to pool_addrelproviders() - also use dep_possible() in enhances - print statistics about solvable reduction - check is suggested packages are really installable --- diff --git a/src/pool.c b/src/pool.c index 2b8e9cf..495c3e7 100644 --- a/src/pool.c +++ b/src/pool.c @@ -135,7 +135,7 @@ pool_shrink_whatprovides_sortcmp(const void *ap, const void *bp) oa = pool->whatprovides[*(Id *)ap]; ob = pool->whatprovides[*(Id *)bp]; if (oa == ob) - return 0; + return *(Id *)ap - *(Id *)bp; if (!oa) return -1; if (!ob) @@ -147,7 +147,7 @@ pool_shrink_whatprovides_sortcmp(const void *ap, const void *bp) return r; if (*da) return *da; - return oa - ob; + return *(Id *)ap - *(Id *)bp; } static void @@ -265,13 +265,11 @@ pool_prepare(Pool *pool) { Id *pp; s = pool->solvables + i; - if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC) - continue; /* sources do not provide anything */ - if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch])) - continue; /* architecture not installable */ pp = s->provides; if (!pp) /* solvable does not provide anything */ continue; + if (!pool_installable(pool, s)) + continue; while ((id = *pp++) != ID_NULL) { if (ISRELDEP(id)) @@ -314,13 +312,11 @@ pool_prepare(Pool *pool) { Id *pp; s = pool->solvables + i; - if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC) - continue; /* sources do not provide anything */ - if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch])) - continue; /* architecture not installable */ pp = s->provides; if (!pp) /* solvable does not provide anything */ continue; + if (!pool_installable(pool, s)) + continue; /* for all provides of this solvable */ while ((id = *pp++) != 0) @@ -405,7 +401,7 @@ pool_queuetowhatprovides(Pool *pool, Queue *q) */ Id * -addrelproviders(Pool *pool, Id d) +pool_addrelproviders(Pool *pool, Id d) { Reldep *rd = GETRELDEP(pool, d); Reldep *prd; diff --git a/src/pool.h b/src/pool.h index 776be17..e5c71ec 100644 --- a/src/pool.h +++ b/src/pool.h @@ -102,7 +102,7 @@ struct _Pool { #define GET_PROVIDESP(d, v) (ISRELDEP(d) ? \ (v = GETRELID(pool, d), pool->whatprovides[v] ? \ pool->whatprovidesdata + pool->whatprovides[v] : \ - addrelproviders(pool, d) \ + pool_addrelproviders(pool, d) \ ) : \ (pool->whatprovidesdata + pool->whatprovides[d])) @@ -133,10 +133,19 @@ extern void pool_prepare(Pool *pool); extern void pool_freewhatprovides(Pool *pool); extern Id pool_queuetowhatprovides(Pool *pool, Queue *q); -extern Id *addrelproviders(Pool *pool, Id d); +extern Id *pool_addrelproviders(Pool *pool, Id d); extern Source *pool_source(Pool *pool, Solvable *s); +static inline int pool_installable(Pool *pool, Solvable *s) +{ + if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC) + return 0; + if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch])) + return 0; + return 1; +} + #ifdef __cplusplus } #endif diff --git a/src/solver.c b/src/solver.c index 5dacf25..9178245 100644 --- a/src/solver.c +++ b/src/solver.c @@ -287,8 +287,6 @@ prune_best_version_arch(Pool *pool, Queue *plist) for (i = j = 0; i < plist->count; i++) { s = pool->solvables + plist->elements[i]; - if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC) - continue; if (pool->verbose) printf("- %s-%s.%s\n", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch)); @@ -439,9 +437,10 @@ unifyrules_sortcmp(const void *ap, const void *bp) /* compare whatprovidesdata */ ad = pool->whatprovidesdata + a->d; bd = pool->whatprovidesdata + b->d; - for (; *ad && *ad == *bd; ad++, bd++) - ; - return *ad - *bd; + while (*bd) + if ((x = *ad++ - *bd++) != 0) + return x; + return *ad; } @@ -912,9 +911,7 @@ addrulesforsupplements(Solver *solv, Map *m) if (MAPTST(m, i)) continue; s = pool->solvables + i; - if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC) - continue; - if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch])) + if (!pool_installable(pool, s)) continue; sup = 0; if ((supp = s->supplements) != 0) @@ -949,18 +946,11 @@ addrulesforenhances(Solver *solv, Map *m) s = pool->solvables + i; if ((enhp = s->enhances) == 0) continue; - if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC) - continue; - if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch])) + if (!pool_installable(pool, s)) continue; while ((enh = *enhp++) != ID_NULL) - { - FOR_PROVIDES(p, pp, enh) - if (MAPTST(m, p)) - break; - if (p) - break; - } + if (dep_possible(solv, enh, m)) + break; if (!enh) continue; if ((conp = s->conflicts) != 0) @@ -2135,9 +2125,7 @@ run_solver(Solver *solv, int disablerules, int doweak) s = pool->solvables + i; if (!s->supplements && !s->freshens) continue; - if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC) - continue; - if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch])) + if (!pool_installable(pool, s)) continue; if ((supp = s->supplements) != 0) { @@ -2467,10 +2455,8 @@ create_obsolete_index(Solver *solv) s = pool->solvables + i; if ((obsp = s->obsoletes) == 0) continue; - if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC) - continue; - if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch])) - continue; + if (!pool_installable(pool, s)) + continue; while ((obs = *obsp++) != 0) FOR_PROVIDES(p, pp, obs) { @@ -2495,10 +2481,8 @@ create_obsolete_index(Solver *solv) s = pool->solvables + i; if ((obsp = s->obsoletes) == 0) continue; - if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC) - continue; - if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch])) - continue; + if (!pool_installable(pool, s)) + continue; while ((obs = *obsp++) != 0) FOR_PROVIDES(p, pp, obs) { @@ -2618,6 +2602,20 @@ solve(Solver *solv, Queue *job) addrulesforsupplements(solv, &addedmap); addrulesforenhances(solv, &addedmap); /* do this last */ +#if 1 + if (pool->verbose) + { + int possible = 0, installable = 0; + for (i = 1; i < pool->nsolvables; i++) + { + if (pool_installable(pool, pool->solvables + i)) + installable++; + if (MAPTST(&addedmap, i)) + possible++; + } + printf("%d of %d installable solvables used for solving\n", possible, installable); + } +#endif /* * first pass done @@ -2758,7 +2756,7 @@ solve(Solver *solv, Queue *job) /* find suggested packages */ if (!solv->problems.count) { - Id sug, *sugp, enh, *enhp; + Id sug, *sugp, enh, *enhp, req, *reqp, p, *pp; /* create map of all suggests that are still open */ solv->recommends_index = -1; @@ -2785,21 +2783,37 @@ solve(Solver *solv, Queue *job) { if (solv->decisionmap[i] != 0) continue; + s = pool->solvables + i; if (!MAPTST(&solv->suggestsmap, i)) { - s = pool->solvables + i; - if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC) - continue; - if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch])) - continue; if ((enhp = s->enhances) == 0) continue; + if (!pool_installable(pool, s)) + continue; while ((enh = *enhp++) != 0) if (dep_fulfilled(solv, enh)) break; if (!enh) continue; } + /* check if installation is possible at all */ + if ((reqp = s->requires) != 0) + { + while ((req = *reqp++) != 0) + { + if (req == SOLVABLE_PREREQMARKER) /* skip the marker */ + continue; + FOR_PROVIDES(p, pp, req) + if (solv->decisionmap[p] >= 0) + break; + if (!p && !strncmp(id2str(pool, req), "rpmlib(", 7)) + continue; + if (!p) + break; /* no provider installable! */ + } + if (req) + continue; + } queuepush(&solv->suggestions, i); } prune_best_version_arch(pool, &solv->suggestions);