void repo_empty(Repo *repo, int reuseids) { Pool *pool = repo->pool; Solvable *s; int i; pool_freewhatprovides(pool); if (reuseids && repo->end == pool->nsolvables) { /* it's ok to reuse the ids. As this is the last repo, we can just shrink the solvable array */ for (i = repo->end - 1, s = pool->solvables + i; i >= repo->start; i--, s--) if (s->repo != repo) break; pool_free_solvable_block(pool, i + 1, repo->end - (i + 1), reuseids); } /* zero out (i.e. free) solvables belonging to this repo */ for (i = repo->start, s = pool->solvables + i; i < repo->end; i++, s++) if (s->repo == repo) memset(s, 0, sizeof(*s)); repo->nsolvables = 0; /* free all data belonging to this repo */ repo->idarraydata = solv_free(repo->idarraydata); repo->idarraysize = 0; repo->lastoff = 0; repo->rpmdbid = solv_free(repo->rpmdbid); for (i = 1; i < repo->nrepodata; i++) repodata_freedata(repo->repodata + i); solv_free(repo->repodata); repo->repodata = 0; repo->nrepodata = 0; }
void repo_free_solvable_block(Repo *repo, Id start, int count, int reuseids) { Solvable *s; Repodata *data; int i; if (start + count == repo->end) repo->end -= count; repo->nsolvables -= count; for (s = repo->pool->solvables + start, i = count; i--; s++) s->repo = 0; pool_free_solvable_block(repo->pool, start, count, reuseids); FOR_REPODATAS(repo, i, data) { int dstart, dend; if (data->end > repo->end) repodata_shrink(data, repo->end); dstart = data->start > start ? data->start : start; dend = data->end < start + count ? data->end : start + count; if (dstart < dend) { if (data->attrs) { int j; for (j = dstart; j < dend; j++) data->attrs[j - data->start] = solv_free(data->attrs[j - data->start]); } if (data->incoreoffset) memset(data->incoreoffset + (dstart - data->start), 0, (dend - dstart) * sizeof(Id)); } }
void repo_free_solvable_block(Repo *repo, Id start, int count, int reuseids) { Solvable *s; Repodata *data; int i; if (start + count == repo->end) repo->end -= count; repo->nsolvables -= count; for (s = repo->pool->solvables + start, i = count; i--; s++) s->repo = 0; pool_free_solvable_block(repo->pool, start, count, reuseids); FOR_REPODATAS(repo, i, data) if (data->end > repo->end) repodata_shrink(data, repo->end); }