]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Refactor arch handling
authorMichael Schroeder <mls@suse.de>
Tue, 24 Jul 2018 11:25:38 +0000 (13:25 +0200)
committerMichael Schroeder <mls@suse.de>
Tue, 24 Jul 2018 11:25:38 +0000 (13:25 +0200)
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.

bindings/solv.i
src/cleandeps.c
src/policy.c
src/pool.h
src/poolarch.c
src/poolarch.h
src/problems.c
src/repo.h
src/rules.c
src/selection.c

index e271ea4824af90210ff94232c2ea4ff608523276..8fb469f0200a81c89fa8b43492be85b41fdc823a 100644 (file)
@@ -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;
   }
index cbe2020ad9f625516897eeac0abcb11977fb9748..52f3f4980d2deb74e500fc1d3e8c0b89c16b6774 100644 (file)
@@ -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
index 6f06101ff6c4b63fe8e6ac88ad28049fd9919c35..e10c4c43cd760293a3959659c000574e3d870a94 100644 (file)
@@ -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;
index 378051b4f30c429d945ecc02f5ab0c145a28de03..e6d1700ca622249c1c0be89619aa4d8a3742aa73 100644 (file)
@@ -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 */
index 8da16c1967d7f848dd2a21bb3dd7a3f7efe3deff..ca42fe28e9a927ddddefe42d09c4a5e5e76d2fa1 100644 (file)
@@ -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));
index 3fe5f0220cc9ccd4d90d4c1f0672ddd1d3c215ec..941f420ac7e8ee0817b0711601d16b626b399f97 100644 (file)
@@ -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
index 5bd2bf5ac4fccb06f8273711df2f022790338f1d..df751c4fae884d0d215e9453c74b605ad7b1bd83 100644 (file)
@@ -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:
index 9dcbcca4e4ec55dbce327380f871178a938e70e5..bd9c58c74fbb8c4e6a68792cb6a8a09e8404c60d 100644 (file)
@@ -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)
     {
index cf368e41ce91cabae274efe6d485319520f97ae5..bae91150dec72d2c77e97d773cb1e26714940010 100644 (file)
@@ -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);
index c253112865c9bc03003e4e4d61b0b2dc21951f42..d44c4829f928f037da8c72401e4f44b73215ee68 100644 (file)
@@ -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;
 }