From f0a93ad1633ccc421d21252dacdf145e010480bc Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Wed, 10 Sep 2008 13:05:02 +0000 Subject: [PATCH] - bring side data handling into better shape - reactivate solvable_identical requires check if we can't compare the build time --- src/repo.c | 30 ++++++++++++++++++++++++++++++ src/repo.h | 6 ++++++ src/repo_solv.c | 2 +- src/solvable.c | 40 +++++++++++++++++++--------------------- tools/repo_rpmdb.c | 32 ++++++++++++++------------------ 5 files changed, 70 insertions(+), 40 deletions(-) diff --git a/src/repo.c b/src/repo.c index 16be78e..df9a414 100644 --- a/src/repo.c +++ b/src/repo.c @@ -315,6 +315,36 @@ repo_freeallrepos(Pool *pool, int reuseids) pool_free_solvable_block(pool, 2, pool->nsolvables - 2, reuseids); } + +#define REPO_SIDEDATA_BLOCK 63 + +void * +repo_sidedata_create(Repo *repo, size_t size) +{ + return sat_calloc_block(repo->end - repo->start, size, REPO_SIDEDATA_BLOCK); +} + +void * +repo_sidedata_extend(Repo *repo, void *b, size_t size, Id p, int count) +{ + int n = repo->end - repo->start; + if (p < repo->start) + { + int d = repo->start - p; + b = sat_extend(b, n, d, size, REPO_SIDEDATA_BLOCK); + memmove(b + d * size, b, n * size); + memset(b, 0, d * size); + n += d; + } + if (p + count > repo->end) + { + int d = p + count - repo->end; + b = sat_extend(b, n, d, size, REPO_SIDEDATA_BLOCK); + memset(b + n * size, 0, d * size); + } + return b; +} + Offset repo_fix_supplements(Repo *repo, Offset provides, Offset supplements, Offset freshens) { diff --git a/src/repo.h b/src/repo.h index b282153..931ad8f 100644 --- a/src/repo.h +++ b/src/repo.h @@ -57,6 +57,8 @@ typedef struct _Repo { extern Repo *repo_create(Pool *pool, const char *name); extern void repo_free(Repo *repo, int reuseids); extern void repo_freeallrepos(Pool *pool, int reuseids); +extern void *repo_sidedata_create(Repo *repo, size_t size); +extern void *repo_sidedata_extend(Repo *repo, void *b, size_t size, Id p, int count); extern Offset repo_addid(Repo *repo, Offset olddeps, Id id); extern Offset repo_addid_dep(Repo *repo, Offset olddeps, Id id, Id marker); @@ -80,6 +82,8 @@ static inline Id repo_add_solvable(Repo *repo) } else { + if (repo->rpmdbid) + repo->rpmdbid = repo_sidedata_extend(repo, repo->rpmdbid, sizeof(Id), p, 1); if (p < repo->start) repo->start = p; if (p + 1 > repo->end) @@ -105,6 +109,8 @@ static inline Id repo_add_solvable_block(Repo *repo, int count) } else { + if (repo->rpmdbid) + repo->rpmdbid = repo_sidedata_extend(repo, repo->rpmdbid, sizeof(Id), p, count); if (p < repo->start) repo->start = p; if (p + count > repo->end) diff --git a/src/repo_solv.c b/src/repo_solv.c index 99a3f21..ccc2b23 100644 --- a/src/repo_solv.c +++ b/src/repo_solv.c @@ -1402,7 +1402,7 @@ repo_add_solv_parent(Repo *repo, FILE *fp, Repodata *parent) if (id == RPM_RPMDBID) { if (!repo->rpmdbid) - repo->rpmdbid = sat_calloc(numsolv, sizeof(Id)); + repo->rpmdbid = repo_sidedata_create(repo, sizeof(Id)); repo->rpmdbid[i] = h; } else if (keys[key].storage == KEY_STORAGE_INCORE) diff --git a/src/solvable.c b/src/solvable.c index 212fd0a..2ca310c 100644 --- a/src/solvable.c +++ b/src/solvable.c @@ -608,10 +608,8 @@ int solvable_identical(Pool *pool, Solvable *s1, Solvable *s2) { unsigned int bt1, bt2; -#if 0 Id rq1, rq2; Id *reqp; -#endif if (s1->name != s2->name) return 0; @@ -622,27 +620,27 @@ solvable_identical(Pool *pool, Solvable *s1, Solvable *s2) if (s1->vendor != s2->vendor) return 0; - /* disabled for now because some testcases have requires where the - duplicates are removed */ -#if 0 - /* first tests passed, try requires */ - rq1 = rq2 = 0; - if (s1->requires) - for (reqp = s1->repo->idarraydata + s1->requires; *reqp; reqp++) - rq1 ^= *reqp++; - if (s2->requires) - for (reqp = s2->repo->idarraydata + s2->requires; *reqp; reqp++) - rq2 ^= *reqp++; - if (rq1 != rq2) - return 0; -#endif - /* looking good, try some fancier stuff */ + /* might also look up the package checksum here */ bt1 = solvable_lookup_num(s1, SOLVABLE_BUILDTIME, 0); bt2 = solvable_lookup_num(s2, SOLVABLE_BUILDTIME, 0); - if (bt1 && bt2 && bt1 != bt2) - return 0; - - /* might also look up the package checksum here */ + if (bt1 && bt2) + { + if (bt1 != bt2) + return 0; + } + else + { + /* look at requires in a last attempt to find recompiled packages */ + rq1 = rq2 = 0; + if (s1->requires) + for (reqp = s1->repo->idarraydata + s1->requires; *reqp; reqp++) + rq1 ^= *reqp++; + if (s2->requires) + for (reqp = s2->repo->idarraydata + s2->requires; *reqp; reqp++) + rq2 ^= *reqp++; + if (rq1 != rq2) + return 0; + } return 1; } diff --git a/tools/repo_rpmdb.c b/tools/repo_rpmdb.c index 0efc8b3..9ca6b23 100644 --- a/tools/repo_rpmdb.c +++ b/tools/repo_rpmdb.c @@ -1202,7 +1202,6 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir) Solvable *s; Id id, *refhash; unsigned int refmask, h; - int asolv; char dbpath[PATH_MAX]; DB_ENV *dbenv = 0; DBT dbkey; @@ -1213,9 +1212,6 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir) memset(&dbkey, 0, sizeof(dbkey)); memset(&dbdata, 0, sizeof(dbdata)); - if (repo->start != repo->end) - abort(); /* FIXME: rpmdbid */ - if (!rootdir) rootdir = ""; @@ -1273,8 +1269,6 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir) exit(1); } dbidp = (unsigned char *)&dbid; - repo->rpmdbid = sat_calloc(256, sizeof(Id)); - asolv = 256; rpmheadsize = 0; rpmhead = 0; i = 0; @@ -1283,12 +1277,8 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir) { if (!s) s = pool_id2solvable(pool, repo_add_solvable(repo)); - if (i >= asolv) - { - repo->rpmdbid = sat_realloc(repo->rpmdbid, (asolv + 256) * sizeof(Id)); - memset(repo->rpmdbid + asolv, 0, 256 * sizeof(unsigned int)); - asolv += 256; - } + if (!repo->rpmdbid) + repo->rpmdbid = repo_sidedata_create(repo, sizeof(Id)); if (dbkey.size != 4) { fprintf(stderr, "corrupt Packages database (key size)\n"); @@ -1323,7 +1313,7 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir) } memcpy(rpmhead->data, (unsigned char *)dbdata.data + 8, rpmhead->cnt * 16 + rpmhead->dcnt); rpmhead->dp = rpmhead->data + rpmhead->cnt * 16; - repo->rpmdbid[i] = dbid; + repo->rpmdbid[(s - pool->solvables) - repo->start] = dbid; if (rpm2solv(pool, repo, repodata, s, rpmhead)) { i++; @@ -1432,21 +1422,24 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir) /* create hash from dbid to ref */ refmask = mkmask(ref->nsolvables); refhash = sat_calloc(refmask + 1, sizeof(Id)); - for (i = 0; i < ref->nsolvables; i++) + for (i = 0; i < ref->end - ref->start; i++) { + if (!ref->rpmdbid[i]) + continue; h = ref->rpmdbid[i] & refmask; while (refhash[h]) h = (h + 317) & refmask; refhash[h] = i + 1; /* make it non-zero */ } - repo->rpmdbid = sat_calloc(nrpmids, sizeof(unsigned int)); s = pool_id2solvable(pool, repo_add_solvable_block(repo, nrpmids)); + if (!repo->rpmdbid) + repo->rpmdbid = repo_sidedata_create(repo, sizeof(Id)); for (i = 0; i < nrpmids; i++, rp++, s++) { dbid = rp->dbid; - repo->rpmdbid[i] = dbid; + repo->rpmdbid[(s - pool->solvables) - repo->start] = dbid; if (refhash) { h = dbid & refmask; @@ -1459,8 +1452,11 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir) if (id) { Solvable *r = ref->pool->solvables + ref->start + (id - 1); - solvable_copy(s, r, repodata, dircache); - continue; + if (r->repo == ref) + { + solvable_copy(s, r, repodata, dircache); + continue; + } } } if (!db) -- 2.7.4