Skip to content

Commit 965e0a7

Browse files
committed
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.
1 parent fb6f720 commit 965e0a7

10 files changed

Lines changed: 36 additions & 35 deletions

File tree

bindings/solv.i

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1924,7 +1924,7 @@ typedef struct {
19241924
return 0;
19251925
if (id == ARCH_SRC || id == ARCH_NOSRC || id == ARCH_NOARCH)
19261926
return 1;
1927-
if (pool->id2arch && (id > pool->lastarch || !pool->id2arch[id]))
1927+
if (pool->id2arch && pool_arch2score(pool, id) == 0)
19281928
return 0;
19291929
return 1;
19301930
}

src/cleandeps.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,17 +1128,16 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
11281128
Solvable *ps = pool->solvables + p;
11291129
if (ps->name != s->name || ps->repo == installed)
11301130
continue;
1131-
a = ps->arch;
1132-
a = (a <= pool->lastarch) ? pool->id2arch[a] : 0;
1131+
a = pool_arch2score(pool, ps->arch);
11331132
if (a && a != 1 && (!bestarch || a < bestarch))
11341133
bestarch = a;
11351134
}
1136-
if (bestarch && (s->arch > pool->lastarch || pool->id2arch[s->arch] != bestarch))
1135+
if (bestarch && pool_arch2score(pool, s->arch) != bestarch)
11371136
{
11381137
FOR_PROVIDES(p, pp, s->name)
11391138
{
11401139
Solvable *ps = pool->solvables + p;
1141-
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)
1140+
if (ps->repo == installed && ps->name == s->name && ps->evr == s->evr && ps->arch != s->arch && pool_arch2score(pool, ps->arch) == bestarch)
11421141
if (!MAPTST(&im, p))
11431142
{
11441143
#ifdef CLEANDEPSDEBUG

src/policy.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ prune_to_best_version_sortcmp(const void *ap, const void *bp, void *dp)
5757
if (sa->arch != sb->arch)
5858
{
5959
int aa, ab;
60-
aa = (sa->arch <= pool->lastarch) ? pool->id2arch[sa->arch] : 0;
61-
ab = (sb->arch <= pool->lastarch) ? pool->id2arch[sb->arch] : 0;
60+
aa = pool_arch2score(pool, sa->arch);
61+
ab = pool_arch2score(pool, sb->arch);
6262
if (aa != ab && aa > 1 && ab > 1)
6363
return aa - ab; /* lowest score first */
6464
}
@@ -646,8 +646,7 @@ prune_to_best_arch(const Pool *pool, Queue *plist)
646646
for (i = 0; i < plist->count; i++)
647647
{
648648
s = pool->solvables + plist->elements[i];
649-
a = s->arch;
650-
a = (a <= pool->lastarch) ? pool->id2arch[a] : 0;
649+
a = pool_arch2score(pool, s->arch);
651650
if (a && a != 1 && (!bestscore || a < bestscore))
652651
bestscore = a;
653652
}
@@ -656,10 +655,9 @@ prune_to_best_arch(const Pool *pool, Queue *plist)
656655
for (i = j = 0; i < plist->count; i++)
657656
{
658657
s = pool->solvables + plist->elements[i];
659-
a = s->arch;
660-
if (a > pool->lastarch)
658+
a = pool_arch2score(pool, s->arch);
659+
if (!a)
661660
continue;
662-
a = pool->id2arch[a];
663661
/* a == 1 -> noarch */
664662
if (a != 1 && ((a ^ bestscore) & 0xffff0000) != 0)
665663
continue;
@@ -1383,8 +1381,8 @@ policy_illegal_archchange(Solver *solv, Solvable *s1, Solvable *s2)
13831381
return 0;
13841382
if (!pool->id2arch)
13851383
return 0;
1386-
a1 = a1 <= pool->lastarch ? pool->id2arch[a1] : 0;
1387-
a2 = a2 <= pool->lastarch ? pool->id2arch[a2] : 0;
1384+
a1 = pool_arch2score(pool, a1);
1385+
a2 = pool_arch2score(pool, a2);
13881386
if (((a1 ^ a2) & 0xffff0000) != 0)
13891387
return 1;
13901388
return 0;

src/pool.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ struct _Pool {
8888

8989
Id *id2arch; /* map arch ids to scores */
9090
unsigned char *id2color; /* map arch ids to colors */
91-
Id lastarch; /* last valid entry in id2arch/id2color */
91+
Id lastarch; /* size of the id2arch/id2color arrays */
9292

9393
Queue vendormap; /* map vendor to vendorclasses mask */
9494
const char **vendorclasses; /* vendor equivalence classes */

src/poolarch.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ pool_setarchpolicy(Pool *pool, const char *arch)
104104
}
105105
id = pool->noarchid;
106106
lastarch = id + 255;
107+
/* note that we overallocate one element to be compatible with
108+
* old versions that accessed id2arch[lastarch].
109+
* id2arch[lastarch] will always be zero */
107110
id2arch = solv_calloc(lastarch + 1, sizeof(Id));
108111
id2arch[id] = 1; /* the "noarch" class */
109112

@@ -114,7 +117,7 @@ pool_setarchpolicy(Pool *pool, const char *arch)
114117
if (l)
115118
{
116119
id = pool_strn2id(pool, arch, l, 1);
117-
if (id > lastarch)
120+
if (id >= lastarch)
118121
{
119122
id2arch = solv_realloc2(id2arch, (id + 255 + 1), sizeof(Id));
120123
memset(id2arch + lastarch + 1, 0, (id + 255 - lastarch) * sizeof(Id));

src/poolarch.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ extern unsigned char pool_arch2color_slow(Pool *pool, Id arch);
2424

2525
static inline unsigned char pool_arch2color(Pool *pool, Id arch)
2626
{
27-
if (arch > pool->lastarch)
27+
if (arch >= pool->lastarch)
2828
return ARCHCOLOR_ALL;
2929
if (pool->id2color && pool->id2color[arch])
3030
return pool->id2color[arch];
@@ -40,6 +40,10 @@ static inline int pool_colormatch(Pool *pool, Solvable *s1, Solvable *s2)
4040
return 0;
4141
}
4242

43+
static inline Id pool_arch2score(const Pool *pool, Id arch) {
44+
return (unsigned int)arch < (unsigned int)pool->lastarch ? pool->id2arch[arch] : 0;
45+
}
46+
4347
#ifdef __cplusplus
4448
}
4549
#endif

src/problems.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1281,7 +1281,7 @@ solver_problemruleinfo2str(Solver *solv, SolverRuleinfo type, Id source, Id targ
12811281
if (pool_disabled_solvable(pool, ss))
12821282
return pool_tmpjoin(pool, "package ", pool_solvid2str(pool, source), " is disabled");
12831283
if (ss->arch && ss->arch != ARCH_SRC && ss->arch != ARCH_NOSRC &&
1284-
pool->id2arch && (ss->arch > pool->lastarch || !pool->id2arch[ss->arch]))
1284+
pool->id2arch && pool_arch2score(pool, ss->arch) == 0)
12851285
return pool_tmpjoin(pool, "package ", pool_solvid2str(pool, source), " does not have a compatible architecture");
12861286
return pool_tmpjoin(pool, "package ", pool_solvid2str(pool, source), " is not installable");
12871287
case SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP:

src/repo.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "pooltypes.h"
1717
#include "pool.h"
18+
#include "poolarch.h"
1819
#include "repodata.h"
1920
#include "dataiterator.h"
2021
#include "hash.h"
@@ -102,7 +103,7 @@ static inline int pool_badarch_solvable(const Pool *pool, Solvable *s)
102103
{
103104
if (!s->arch)
104105
return 1;
105-
if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch]))
106+
if (pool->id2arch && pool_arch2score(pool, s->arch) == 0)
106107
return 1;
107108
return 0;
108109
}
@@ -113,7 +114,7 @@ static inline int pool_installable(const Pool *pool, Solvable *s)
113114
return 0;
114115
if (s->repo && s->repo->disabled)
115116
return 0;
116-
if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch]))
117+
if (pool->id2arch && pool_arch2score(pool, s->arch) == 0)
117118
return 0;
118119
if (pool->considered)
119120
{

src/rules.c

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,16 +1031,17 @@ solver_addpkgrulesforsolvable(Solver *solv, Solvable *s, Map *m)
10311031
}
10321032
}
10331033

1034-
if (m && pool->implicitobsoleteusescolors && (s->arch > pool->lastarch || pool->id2arch[s->arch] != 1))
1034+
if (m && pool->implicitobsoleteusescolors && pool_arch2score(pool, s->arch) > 1)
10351035
{
1036-
int a = pool->id2arch[s->arch];
1036+
int pa, a = pool_arch2score(pool, s->arch);
10371037
/* check lock-step candidates */
10381038
FOR_PROVIDES(p, pp, s->name)
10391039
{
10401040
Solvable *ps = pool->solvables + p;
10411041
if (s->name != ps->name || s->evr != ps->evr || MAPTST(m, p))
10421042
continue;
1043-
if (ps->arch > pool->lastarch || pool->id2arch[ps->arch] == 1 || pool->id2arch[ps->arch] >= a)
1043+
pa = pool_arch2score(pool, ps->arch);
1044+
if (!pa || pa == 1 || pa >= a)
10441045
continue;
10451046
queue_push(&workq, p);
10461047
}
@@ -1558,8 +1559,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap)
15581559
first = 0;
15591560
if (first)
15601561
break;
1561-
a = ps->arch;
1562-
a = (a <= pool->lastarch) ? pool->id2arch[a] : 0;
1562+
a = pool_arch2score(pool, ps->arch);
15631563
if (a != 1 && installed && ps->repo == installed)
15641564
{
15651565
if (solv->dupinvolvedmap_all || (solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p)))
@@ -1593,8 +1593,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap)
15931593
continue;
15941594
if (solv->dupinvolvedmap_all || (solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p)))
15951595
continue;
1596-
a = ps->arch;
1597-
a = (a <= pool->lastarch) ? pool->id2arch[a] : 0;
1596+
a = pool_arch2score(pool, ps->arch);
15981597
if (!a)
15991598
{
16001599
queue_pushunique(&allowedarchs, ps->arch); /* strange arch, allow */
@@ -1609,8 +1608,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap)
16091608
Id a2;
16101609
if (p2 == p || s2->name != s->name || s2->evr != pool->solvables[p].evr || s2->arch == pool->solvables[p].arch)
16111610
continue;
1612-
a2 = s2->arch;
1613-
a2 = (a2 <= pool->lastarch) ? pool->id2arch[a2] : 0;
1611+
a2 = pool_arch2score(pool, s2->arch);
16141612
if (a2 && (a2 == 1 || ((a2 ^ bestarch) & 0xffff0000) == 0))
16151613
break;
16161614
}
@@ -1626,8 +1624,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap)
16261624
ps = pool->solvables + p;
16271625
if (ps->name != s->name || !MAPTST(addedmap, p))
16281626
continue;
1629-
a = ps->arch;
1630-
a = (a <= pool->lastarch) ? pool->id2arch[a] : 0;
1627+
a = pool_arch2score(pool, ps->arch);
16311628
if (a != 1 && bestarch && ((a ^ bestarch) & 0xffff0000) != 0)
16321629
{
16331630
if (installed && ps->repo == installed)
@@ -1641,7 +1638,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap)
16411638
aa = allowedarchs.elements[j];
16421639
if (ps->arch == aa)
16431640
break;
1644-
aa = (aa <= pool->lastarch) ? pool->id2arch[aa] : 0;
1641+
aa = pool_arch2score(pool, aa);
16451642
if (aa && ((a ^ aa) & 0xffff0000) == 0)
16461643
break; /* compatible */
16471644
}
@@ -1665,8 +1662,7 @@ solver_addinfarchrules(Solver *solv, Map *addedmap)
16651662
Solvable *s2 = pool->solvables + p2;
16661663
if (p2 == p || s2->name != s->name || s2->evr != pool->solvables[p].evr || s2->arch == pool->solvables[p].arch)
16671664
continue;
1668-
a = s2->arch;
1669-
a = (a <= pool->lastarch) ? pool->id2arch[a] : 0;
1665+
a = pool_arch2score(pool, s2->arch);
16701666
if (a && (a == 1 || ((a ^ bestarch) & 0xffff000) == 0))
16711667
{
16721668
queue_push(&lsq, p2);

src/selection.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ str2archid(Pool *pool, const char *arch)
3232
id = pool_str2id(pool, arch, 0);
3333
if (!id || id == ARCH_SRC || id == ARCH_NOSRC || id == ARCH_NOARCH)
3434
return id;
35-
if (pool->id2arch && (id > pool->lastarch || !pool->id2arch[id]))
35+
if (pool->id2arch && pool_arch2score(pool, id) == 0)
3636
return 0;
3737
return id;
3838
}

0 commit comments

Comments
 (0)