From: Michael Schroeder Date: Tue, 24 Jul 2018 11:25:38 +0000 (+0200) Subject: Refactor arch handling X-Git-Tag: 0.6.35~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=965e0a767d3fbd965d93fa9204276958a54a0909;p=thirdparty%2Flibsolv.git Refactor arch handling lastarch is no longer the last element of id2arch, but now the size of the array. This means that lastarch == 0 now reliable means that no architecture was set. To be compatible to old versions we over-allocate id2arch so that id2arch[lastarch] is always zero. There's also a new pool_arch2score function that abstracts accessing the id2arch array. --- diff --git a/bindings/solv.i b/bindings/solv.i index e271ea48..8fb469f0 100644 --- a/bindings/solv.i +++ b/bindings/solv.i @@ -1924,7 +1924,7 @@ typedef struct { return 0; if (id == ARCH_SRC || id == ARCH_NOSRC || id == ARCH_NOARCH) return 1; - if (pool->id2arch && (id > pool->lastarch || !pool->id2arch[id])) + if (pool->id2arch && pool_arch2score(pool, id) == 0) return 0; return 1; } diff --git a/src/cleandeps.c b/src/cleandeps.c index cbe2020a..52f3f498 100644 --- a/src/cleandeps.c +++ b/src/cleandeps.c @@ -1128,17 +1128,16 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded) Solvable *ps = pool->solvables + p; if (ps->name != s->name || ps->repo == installed) continue; - a = ps->arch; - a = (a <= pool->lastarch) ? pool->id2arch[a] : 0; + a = pool_arch2score(pool, ps->arch); if (a && a != 1 && (!bestarch || a < bestarch)) bestarch = a; } - if (bestarch && (s->arch > pool->lastarch || pool->id2arch[s->arch] != bestarch)) + if (bestarch && pool_arch2score(pool, s->arch) != bestarch) { FOR_PROVIDES(p, pp, s->name) { Solvable *ps = pool->solvables + p; - if (ps->repo == installed && ps->name == s->name && ps->evr == s->evr && ps->arch != s->arch && ps->arch < pool->lastarch && pool->id2arch[ps->arch] == bestarch) + if (ps->repo == installed && ps->name == s->name && ps->evr == s->evr && ps->arch != s->arch && pool_arch2score(pool, ps->arch) == bestarch) if (!MAPTST(&im, p)) { #ifdef CLEANDEPSDEBUG diff --git a/src/policy.c b/src/policy.c index 6f06101f..e10c4c43 100644 --- a/src/policy.c +++ b/src/policy.c @@ -57,8 +57,8 @@ prune_to_best_version_sortcmp(const void *ap, const void *bp, void *dp) if (sa->arch != sb->arch) { int aa, ab; - aa = (sa->arch <= pool->lastarch) ? pool->id2arch[sa->arch] : 0; - ab = (sb->arch <= pool->lastarch) ? pool->id2arch[sb->arch] : 0; + aa = pool_arch2score(pool, sa->arch); + ab = pool_arch2score(pool, sb->arch); if (aa != ab && aa > 1 && ab > 1) return aa - ab; /* lowest score first */ } @@ -646,8 +646,7 @@ prune_to_best_arch(const Pool *pool, Queue *plist) for (i = 0; i < plist->count; i++) { s = pool->solvables + plist->elements[i]; - a = s->arch; - a = (a <= pool->lastarch) ? pool->id2arch[a] : 0; + a = pool_arch2score(pool, s->arch); if (a && a != 1 && (!bestscore || a < bestscore)) bestscore = a; } @@ -656,10 +655,9 @@ prune_to_best_arch(const Pool *pool, Queue *plist) for (i = j = 0; i < plist->count; i++) { s = pool->solvables + plist->elements[i]; - a = s->arch; - if (a > pool->lastarch) + a = pool_arch2score(pool, s->arch); + if (!a) continue; - a = pool->id2arch[a]; /* a == 1 -> noarch */ if (a != 1 && ((a ^ bestscore) & 0xffff0000) != 0) continue; @@ -1383,8 +1381,8 @@ policy_illegal_archchange(Solver *solv, Solvable *s1, Solvable *s2) return 0; if (!pool->id2arch) return 0; - a1 = a1 <= pool->lastarch ? pool->id2arch[a1] : 0; - a2 = a2 <= pool->lastarch ? pool->id2arch[a2] : 0; + a1 = pool_arch2score(pool, a1); + a2 = pool_arch2score(pool, a2); if (((a1 ^ a2) & 0xffff0000) != 0) return 1; return 0; diff --git a/src/pool.h b/src/pool.h index 378051b4..e6d1700c 100644 --- a/src/pool.h +++ b/src/pool.h @@ -88,7 +88,7 @@ struct _Pool { Id *id2arch; /* map arch ids to scores */ unsigned char *id2color; /* map arch ids to colors */ - Id lastarch; /* last valid entry in id2arch/id2color */ + Id lastarch; /* size of the id2arch/id2color arrays */ Queue vendormap; /* map vendor to vendorclasses mask */ const char **vendorclasses; /* vendor equivalence classes */ diff --git a/src/poolarch.c b/src/poolarch.c index 8da16c19..ca42fe28 100644 --- a/src/poolarch.c +++ b/src/poolarch.c @@ -104,6 +104,9 @@ pool_setarchpolicy(Pool *pool, const char *arch) } id = pool->noarchid; lastarch = id + 255; + /* note that we overallocate one element to be compatible with + * old versions that accessed id2arch[lastarch]. + * id2arch[lastarch] will always be zero */ id2arch = solv_calloc(lastarch + 1, sizeof(Id)); id2arch[id] = 1; /* the "noarch" class */ @@ -114,7 +117,7 @@ pool_setarchpolicy(Pool *pool, const char *arch) if (l) { id = pool_strn2id(pool, arch, l, 1); - if (id > lastarch) + if (id >= lastarch) { id2arch = solv_realloc2(id2arch, (id + 255 + 1), sizeof(Id)); memset(id2arch + lastarch + 1, 0, (id + 255 - lastarch) * sizeof(Id)); diff --git a/src/poolarch.h b/src/poolarch.h index 3fe5f022..941f420a 100644 --- a/src/poolarch.h +++ b/src/poolarch.h @@ -24,7 +24,7 @@ extern unsigned char pool_arch2color_slow(Pool *pool, Id arch); static inline unsigned char pool_arch2color(Pool *pool, Id arch) { - if (arch > pool->lastarch) + if (arch >= pool->lastarch) return ARCHCOLOR_ALL; if (pool->id2color && pool->id2color[arch]) return pool->id2color[arch]; @@ -40,6 +40,10 @@ static inline int pool_colormatch(Pool *pool, Solvable *s1, Solvable *s2) return 0; } +static inline Id pool_arch2score(const Pool *pool, Id arch) { + return (unsigned int)arch < (unsigned int)pool->lastarch ? pool->id2arch[arch] : 0; +} + #ifdef __cplusplus } #endif diff --git a/src/problems.c b/src/problems.c index 5bd2bf5a..df751c4f 100644 --- a/src/problems.c +++ b/src/problems.c @@ -1281,7 +1281,7 @@ solver_problemruleinfo2str(Solver *solv, SolverRuleinfo type, Id source, Id targ if (pool_disabled_solvable(pool, ss)) return pool_tmpjoin(pool, "package ", pool_solvid2str(pool, source), " is disabled"); if (ss->arch && ss->arch != ARCH_SRC && ss->arch != ARCH_NOSRC && - pool->id2arch && (ss->arch > pool->lastarch || !pool->id2arch[ss->arch])) + pool->id2arch && pool_arch2score(pool, ss->arch) == 0) return pool_tmpjoin(pool, "package ", pool_solvid2str(pool, source), " does not have a compatible architecture"); return pool_tmpjoin(pool, "package ", pool_solvid2str(pool, source), " is not installable"); case SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP: diff --git a/src/repo.h b/src/repo.h index 9dcbcca4..bd9c58c7 100644 --- a/src/repo.h +++ b/src/repo.h @@ -15,6 +15,7 @@ #include "pooltypes.h" #include "pool.h" +#include "poolarch.h" #include "repodata.h" #include "dataiterator.h" #include "hash.h" @@ -102,7 +103,7 @@ static inline int pool_badarch_solvable(const Pool *pool, Solvable *s) { if (!s->arch) return 1; - if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch])) + if (pool->id2arch && pool_arch2score(pool, s->arch) == 0) return 1; return 0; } @@ -113,7 +114,7 @@ static inline int pool_installable(const Pool *pool, Solvable *s) return 0; if (s->repo && s->repo->disabled) return 0; - if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch])) + if (pool->id2arch && pool_arch2score(pool, s->arch) == 0) return 0; if (pool->considered) { diff --git a/src/rules.c b/src/rules.c index cf368e41..bae91150 100644 --- a/src/rules.c +++ b/src/rules.c @@ -1031,16 +1031,17 @@ solver_addpkgrulesforsolvable(Solver *solv, Solvable *s, Map *m) } } - if (m && pool->implicitobsoleteusescolors && (s->arch > pool->lastarch || pool->id2arch[s->arch] != 1)) + if (m && pool->implicitobsoleteusescolors && pool_arch2score(pool, s->arch) > 1) { - int a = pool->id2arch[s->arch]; + int pa, a = pool_arch2score(pool, s->arch); /* check lock-step candidates */ FOR_PROVIDES(p, pp, s->name) { Solvable *ps = pool->solvables + p; if (s->name != ps->name || s->evr != ps->evr || MAPTST(m, p)) continue; - if (ps->arch > pool->lastarch || pool->id2arch[ps->arch] == 1 || pool->id2arch[ps->arch] >= a) + pa = pool_arch2score(pool, ps->arch); + if (!pa || pa == 1 || pa >= a) continue; queue_push(&workq, p); } @@ -1558,8 +1559,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap) first = 0; if (first) break; - a = ps->arch; - a = (a <= pool->lastarch) ? pool->id2arch[a] : 0; + a = pool_arch2score(pool, ps->arch); if (a != 1 && installed && ps->repo == installed) { if (solv->dupinvolvedmap_all || (solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p))) @@ -1593,8 +1593,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap) continue; if (solv->dupinvolvedmap_all || (solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p))) continue; - a = ps->arch; - a = (a <= pool->lastarch) ? pool->id2arch[a] : 0; + a = pool_arch2score(pool, ps->arch); if (!a) { queue_pushunique(&allowedarchs, ps->arch); /* strange arch, allow */ @@ -1609,8 +1608,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap) Id a2; if (p2 == p || s2->name != s->name || s2->evr != pool->solvables[p].evr || s2->arch == pool->solvables[p].arch) continue; - a2 = s2->arch; - a2 = (a2 <= pool->lastarch) ? pool->id2arch[a2] : 0; + a2 = pool_arch2score(pool, s2->arch); if (a2 && (a2 == 1 || ((a2 ^ bestarch) & 0xffff0000) == 0)) break; } @@ -1626,8 +1624,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap) ps = pool->solvables + p; if (ps->name != s->name || !MAPTST(addedmap, p)) continue; - a = ps->arch; - a = (a <= pool->lastarch) ? pool->id2arch[a] : 0; + a = pool_arch2score(pool, ps->arch); if (a != 1 && bestarch && ((a ^ bestarch) & 0xffff0000) != 0) { if (installed && ps->repo == installed) @@ -1641,7 +1638,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap) aa = allowedarchs.elements[j]; if (ps->arch == aa) break; - aa = (aa <= pool->lastarch) ? pool->id2arch[aa] : 0; + aa = pool_arch2score(pool, aa); if (aa && ((a ^ aa) & 0xffff0000) == 0) break; /* compatible */ } @@ -1665,8 +1662,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap) Solvable *s2 = pool->solvables + p2; if (p2 == p || s2->name != s->name || s2->evr != pool->solvables[p].evr || s2->arch == pool->solvables[p].arch) continue; - a = s2->arch; - a = (a <= pool->lastarch) ? pool->id2arch[a] : 0; + a = pool_arch2score(pool, s2->arch); if (a && (a == 1 || ((a ^ bestarch) & 0xffff000) == 0)) { queue_push(&lsq, p2); diff --git a/src/selection.c b/src/selection.c index c2531128..d44c4829 100644 --- a/src/selection.c +++ b/src/selection.c @@ -32,7 +32,7 @@ str2archid(Pool *pool, const char *arch) id = pool_str2id(pool, arch, 0); if (!id || id == ARCH_SRC || id == ARCH_NOSRC || id == ARCH_NOARCH) return id; - if (pool->id2arch && (id > pool->lastarch || !pool->id2arch[id])) + if (pool->id2arch && pool_arch2score(pool, id) == 0) return 0; return id; }