Skip to content

Commit

Permalink
Convert packageHash to STL unordered_map
Browse files Browse the repository at this point in the history
This was a particularly ugly case as it was defined in multiple places.
mfi->tranPkgs is a bit annoying now as it expects the hashes to be
pointers, and because it can be NULL it can't be a reference.
  • Loading branch information
pmatilai committed May 8, 2024
1 parent 6834c3f commit e063368
Show file tree
Hide file tree
Showing 8 changed files with 45 additions and 62 deletions.
17 changes: 5 additions & 12 deletions lib/depends.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,6 @@ const int rpmFLAGS = RPMSENSE_EQUAL;
#undef HTKEYTYPE
#undef HTDATATYPE

#define HASHTYPE packageHash
#define HTKEYTYPE unsigned int
#define HTDATATYPE struct rpmte_s *
#include "rpmhash.C"
#undef HASHTYPE
#undef HTKEYTYPE
#undef HTDATATYPE

#define HASHTYPE filedepHash
#define HTKEYTYPE rpmsid
#define HTDATATYPE rpmsid
Expand Down Expand Up @@ -119,24 +111,25 @@ static void addElement(tsMembers tsmem, rpmte te, int oc)
static int removePackage(rpmts ts, Header h, rpmte depends)
{
tsMembers tsmem = rpmtsMembers(ts);
rpmte p, *pp;
rpmte p;
unsigned int dboffset = headerGetInstance(h);

/* Can't remove what's not installed */
if (dboffset == 0) return 1;

/* Filter out duplicate erasures. */
if (packageHashGetEntry(tsmem->removedPackages, dboffset, &pp, NULL, NULL)) {
auto it = tsmem->removedPackages.find(dboffset);
if (it != tsmem->removedPackages.end()) {
if (depends)
rpmteSetDependsOn(pp[0], depends);
rpmteSetDependsOn(it->second, depends);
return 0;
}

p = rpmteNew(ts, h, TR_REMOVED, NULL, NULL, 0);
if (p == NULL)
return 1;

packageHashAddEntry(tsmem->removedPackages, dboffset, p);
tsmem->removedPackages.insert({dboffset, p});
rpmteSetDependsOn(p, depends);

addElement(tsmem, p, tsmem->orderCount);
Expand Down
2 changes: 2 additions & 0 deletions lib/order.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

#include "system.h"

#include <string.h>

#include <rpm/rpmtag.h>
#include <rpm/rpmmacro.h>
#include <rpm/rpmlog.h>
Expand Down
3 changes: 1 addition & 2 deletions lib/psm.c
Original file line number Diff line number Diff line change
Expand Up @@ -737,8 +737,7 @@ static rpmRC dbAdd(rpmts ts, rpmte te)

if (rc == RPMRC_OK) {
rpmteSetDBInstance(te, headerGetInstance(h));
packageHashAddEntry(ts->members->installedPackages,
headerGetInstance(h), te);
ts->members->installedPackages.insert({headerGetInstance(h), te});
}
headerFree(h);
return rc;
Expand Down
13 changes: 7 additions & 6 deletions lib/rpmdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -1499,15 +1499,15 @@ int rpmdbExtendIterator(rpmdbMatchIterator mi,
return rc;
}

int rpmdbFilterIterator(rpmdbMatchIterator mi, packageHash hdrNums, int neg)
int rpmdbFilterIterator(rpmdbMatchIterator mi, packageHash const & hdrNums, int neg)
{
if (mi == NULL || hdrNums == NULL)
if (mi == NULL)
return 1;

if (!mi->mi_set)
return 0;

if (packageHashNumKeys(hdrNums) == 0) {
if (hdrNums.empty()) {
if (!neg)
mi->mi_set->count = 0;
return 0;
Expand All @@ -1521,7 +1521,8 @@ int rpmdbFilterIterator(rpmdbMatchIterator mi, packageHash hdrNums, int neg)
assert(mi->mi_set->count > 0);

for (from = 0; from < num; from++) {
cond = !packageHashHasEntry(hdrNums, mi->mi_set->recs[from].hdrNum);
auto it = hdrNums.find(mi->mi_set->recs[from].hdrNum);
cond = (it == hdrNums.end());
cond = neg ? !cond : cond;
if (cond) {
mi->mi_set->count--;
Expand All @@ -1534,9 +1535,9 @@ int rpmdbFilterIterator(rpmdbMatchIterator mi, packageHash hdrNums, int neg)
return 0;
}

int rpmdbPruneIterator(rpmdbMatchIterator mi, packageHash hdrNums)
int rpmdbPruneIterator(rpmdbMatchIterator mi, packageHash const & hdrNums)
{
if (packageHashNumKeys(hdrNums) <= 0)
if (hdrNums.empty())
return 1;

return rpmdbFilterIterator(mi, hdrNums, 1);
Expand Down
13 changes: 4 additions & 9 deletions lib/rpmdb_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,14 @@
#define H_RPMDB_INTERNAL

#include <assert.h>
#include <unordered_map>

#include <rpm/rpmsw.h>
#include <rpm/rpmtypes.h>
#include <rpm/rpmutil.h>
#include "backend/dbi.h"

#define HASHTYPE packageHash
#define HTKEYTYPE unsigned int
#define HTDATATYPE struct rpmte_s *
#include "rpmhash.H"
#undef HASHTYPE
#undef HTKEYTYPE
#undef HTDATATYPE
typedef std::unordered_map<unsigned int,rpmte> packageHash;

enum rpmdbRebuildFlags_e {
RPMDB_REBUILD_FLAG_SALVAGE = (1 << 0),
Expand Down Expand Up @@ -135,7 +130,7 @@ void rpmdbUniqIterator(rpmdbMatchIterator mi);
* @param neg mode
* return 0 on success, 1 on failure (bad args)
*/
int rpmdbFilterIterator(rpmdbMatchIterator mi, packageHash hdrNums, int neg);
int rpmdbFilterIterator(rpmdbMatchIterator mi, packageHash const & hdrNums, int neg);

/** \ingroup rpmdb
* Remove items from set of package instances to iterate.
Expand All @@ -144,7 +139,7 @@ int rpmdbFilterIterator(rpmdbMatchIterator mi, packageHash hdrNums, int neg);
* @param hdrNums hash of package instances
* @return 0 on success, 1 on failure (bad args)
*/
int rpmdbPruneIterator(rpmdbMatchIterator mi, packageHash hdrNums);
int rpmdbPruneIterator(rpmdbMatchIterator mi, packageHash const & hdrNums);

/** \ingroup rpmdb
* Create a new, empty match iterator (for purposes of extending it
Expand Down
34 changes: 22 additions & 12 deletions lib/rpmtriggers.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <rpm/rpmds.h>
#include <rpm/rpmfi.h>
#include <stdlib.h>
#include <string.h>

#include "rpmtriggers.h"
#include "rpmts_internal.h"
Expand Down Expand Up @@ -211,7 +212,7 @@ typedef struct matchFilesIter_s {
const char *pfx;
const char *pkgname;
rpmdbMatchIterator pi;
packageHash tranPkgs;
packageHash *tranPkgs;
} *matchFilesIter;

/*
Expand All @@ -221,31 +222,34 @@ typedef struct matchFilesIter_s {
static rpmfiles rpmtsNextFiles(matchFilesIter mfi)
{
Header h;
rpmte *te;
rpmte te = NULL;
rpmfiles files = NULL;
rpmstrPool pool = mfi->ts->members->pool;
int ix;
unsigned int offset;

ix = rpmdbGetIteratorIndex(mfi->pi);
if (ix < rpmdbGetIteratorCount(mfi->pi)) {
tsMembers tsmem = mfi->ts->members;
offset = rpmdbGetIteratorOffsetFor(mfi->pi, ix);
if (packageHashGetEntry(mfi->ts->members->removedPackages, offset,
&te, NULL, NULL)) {
auto it = tsmem->removedPackages.find(offset);
if (it != tsmem->removedPackages.end()) {
/* Files are available in memory */
files = rpmteFiles(te[0]);
te = it->second;
files = rpmteFiles(te);
}

if (packageHashGetEntry(mfi->ts->members->installedPackages, offset,
&te, NULL, NULL)) {
it = tsmem->installedPackages.find(offset);
if (it != tsmem->installedPackages.end()) {
/* Files are available in memory */
files = rpmteFiles(te[0]);
te = it->second;
files = rpmteFiles(te);
}
}

if (files) {
rpmdbSetIteratorIndex(mfi->pi, ix + 1);
mfi->pkgname = rpmteN(te[0]);
mfi->pkgname = rpmteN(te);
} else {
/* Files are not available in memory. Read them from rpmdb */
h = rpmdbNextIterator(mfi->pi);
Expand Down Expand Up @@ -285,9 +289,9 @@ static matchFilesIter matchDBFilesIterator(rpmds trigger, rpmts ts,
/* If inTransaction is set then filter out packages that aren't in transaction */
if (inTransaction) {
if (sense & RPMSENSE_TRIGGERIN)
mfi->tranPkgs = ts->members->installedPackages;
mfi->tranPkgs = &ts->members->installedPackages;
else
mfi->tranPkgs = ts->members->removedPackages;
mfi->tranPkgs = &ts->members->removedPackages;
}
return mfi;
}
Expand Down Expand Up @@ -342,7 +346,8 @@ static const char *matchFilesNext(matchFilesIter mfi)
mfi->pi = rpmdbInitPrefixIterator(rpmtsGetRdb(mfi->ts),
RPMDBI_DIRNAMES, mfi->pfx, 0);

rpmdbFilterIterator(mfi->pi, mfi->tranPkgs, 0);
if (mfi->tranPkgs)
rpmdbFilterIterator(mfi->pi, *(mfi->tranPkgs), 0);
/* Only walk through each header with matches once */
rpmdbUniqIterator(mfi->pi);

Expand Down Expand Up @@ -497,6 +502,11 @@ static int matchFilesInTran(rpmts ts, rpmte te, const char *pfx,
return rc;
}

static bool packageHashHasEntry(packageHash & pkghash, unsigned int entry)
{
return pkghash.find(entry) != pkghash.end();
}

rpmRC runFileTriggers(rpmts ts, rpmte te, int arg2, rpmsenseFlags sense,
rpmscriptTriggerModes tm, int priorityClass)
{
Expand Down
18 changes: 1 addition & 17 deletions lib/rpmts.c
Original file line number Diff line number Diff line change
Expand Up @@ -752,18 +752,6 @@ void rpmtsClean(rpmts ts)
rpmtsCleanProblems(ts);
}

/* hash comparison function */
static int uintCmp(unsigned int a, unsigned int b)
{
return (a != b);
}

/* "hash"function*/
static unsigned int uintId(unsigned int a)
{
return a;
}

void rpmtsEmpty(rpmts ts)
{
tsMembers tsmem = rpmtsMembers(ts);
Expand All @@ -780,7 +768,7 @@ void rpmtsEmpty(rpmts ts)
tsmem->orderCount = 0;
/* The pool cannot be emptied, there might be references to its contents */
tsmem->pool = rpmstrPoolFree(tsmem->pool);
packageHashEmpty(tsmem->removedPackages);
tsmem->removedPackages.clear();
return;
}

Expand Down Expand Up @@ -832,8 +820,6 @@ rpmts rpmtsFree(rpmts ts)

(void) rpmtsCloseDB(ts);

tsmem->removedPackages = packageHashFree(tsmem->removedPackages);
tsmem->installedPackages = packageHashFree(tsmem->installedPackages);
tsmem->order = _free(tsmem->order);
delete ts->members;

Expand Down Expand Up @@ -1244,8 +1230,6 @@ rpmts rpmtsCreate(void)
tsmem->pool = NULL;
tsmem->delta = 5;
tsmem->addedPackages = NULL;
tsmem->removedPackages = packageHashCreate(128, uintId, uintCmp, NULL, NULL);
tsmem->installedPackages = packageHashCreate(128, uintId, uintCmp, NULL, NULL);
tsmem->orderAlloced = 0;
tsmem->orderCount = 0;
tsmem->order = NULL;
Expand Down
7 changes: 3 additions & 4 deletions lib/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -1117,14 +1117,13 @@ void checkInstalledFiles(rpmts ts, uint64_t fileCount, fingerPrintCache fpc)
unsigned int installedPkg;
int beingRemoved = 0;
rpmfiles otherFi = NULL;
rpmte *removedPkg = NULL;

/* Is this package being removed? */
installedPkg = rpmdbGetIteratorOffset(mi);
if (packageHashGetEntry(tsmem->removedPackages, installedPkg,
&removedPkg, NULL, NULL)) {
auto it = tsmem->removedPackages.find(installedPkg);
if (it != tsmem->removedPackages.end()) {
beingRemoved = 1;
otherFi = rpmteFiles(removedPkg[0]);
otherFi = rpmteFiles(it->second);
}

h = headerLink(h);
Expand Down

0 comments on commit e063368

Please sign in to comment.