return 0;
}
+ /* Ensure pool is writable */
+ if (tsmem->addedPackages != NULL)
+ rpmstrPoolUnfreeze(tsmem->pool);
+
p = rpmteNew(ts, h, TR_REMOVED, NULL, NULL);
if (p == NULL)
return 1;
rpmte p;
rpmtsi pi;
+ /* Required for now to lock string pointers in memory */
+ rpmstrPoolFreeze(rpmtsPool(ts));
+
al = rpmalCreate((rpmtsNElements(ts) / 4) + 1, rpmtsFlags(ts),
rpmtsColor(ts), rpmtsPrefColor(ts));
pi = rpmtsiInit(ts);
goto exit;
}
+ /* Ensure pool is writable */
+ if (tsmem->addedPackages != NULL)
+ rpmstrPoolUnfreeze(tsmem->pool);
+
p = rpmteNew(ts, h, TR_ADDED, key, relocs);
if (p == NULL) {
ec = 1;
rpmRelocateFileList(p->relocs, p->nrelocs, p->fs, h);
}
}
- return rpmfiNew(NULL, h, RPMTAG_BASENAMES, fiflags);
+ return rpmfiNewPool(rpmtsPool(p->ts), h, RPMTAG_BASENAMES, fiflags);
}
/* stupid bubble sort, but it's probably faster here */
*/
static int addTE(rpmte p, Header h, fnpyKey key, rpmRelocation * relocs)
{
+ rpmstrPool tspool = rpmtsPool(p->ts);
struct rpmtd_s colls, bnames;
int rc = 1; /* assume failure */
p->pkgFileSize = 0;
p->headerSize = headerSizeof(h, HEADER_MAGIC_NO);
+ /* XXX thisds not in global pool yet, but not strictly needed either */
p->thisds = rpmdsThis(h, RPMTAG_PROVIDENAME, RPMSENSE_EQUAL);
- p->provides = rpmdsNew(h, RPMTAG_PROVIDENAME, 0);
- p->requires = rpmdsNew(h, RPMTAG_REQUIRENAME, 0);
- p->conflicts = rpmdsNew(h, RPMTAG_CONFLICTNAME, 0);
- p->obsoletes = rpmdsNew(h, RPMTAG_OBSOLETENAME, 0);
- p->order = rpmdsNew(h, RPMTAG_ORDERNAME, 0);
+ p->provides = rpmdsNewPool(tspool, h, RPMTAG_PROVIDENAME, 0);
+ p->requires = rpmdsNewPool(tspool, h, RPMTAG_REQUIRENAME, 0);
+ p->conflicts = rpmdsNewPool(tspool, h, RPMTAG_CONFLICTNAME, 0);
+ p->obsoletes = rpmdsNewPool(tspool, h, RPMTAG_OBSOLETENAME, 0);
+ p->order = rpmdsNewPool(tspool, h, RPMTAG_ORDERNAME, 0);
/* Relocation needs to know file count before rpmfiNew() */
headerGet(h, RPMTAG_BASENAMES, &bnames, HEADERGET_MINMEM);
}
tsmem->orderCount = 0;
+ /* XXX emptying would be sufficient... */
+ tsmem->pool = rpmstrPoolFree(tsmem->pool);
removedHashEmpty(tsmem->removedPackages);
return;
}
return (ts != NULL) ? ts->members : NULL;
}
+rpmstrPool rpmtsPool(rpmts ts)
+{
+ tsMembers tsmem = rpmtsMembers(ts);
+ return (tsmem != NULL) ? tsmem->pool : NULL;
+}
+
rpmts rpmtsCreate(void)
{
rpmts ts;
}
tsmem = xcalloc(1, sizeof(*ts->members));
+ tsmem->pool = NULL;
tsmem->delta = 5;
tsmem->addedPackages = NULL;
tsmem->removedPackages = removedHashCreate(128, uintId, uintCmp, NULL, NULL);
rpmts rpmtsCreate(void);
/** \ingroup rpmts
+ * Return transaction global string pool handle
+ * @param ts transaction set
+ * @return string pool handle (weak ref)
+ */
+rpmstrPool rpmtsPool(rpmts ts);
+
+/** \ingroup rpmts
* Add package to be installed to transaction set.
*
* The transaction set is checked for duplicate package names.
#define _RPMTS_INTERNAL_H
#include <rpm/rpmts.h>
+#include <rpm/rpmstrpool.h>
#include "lib/rpmal.h" /* XXX availablePackage */
#include "lib/fprint.h"
/* Transaction set elements information */
typedef struct tsMembers_s {
+ rpmstrPool pool; /*!< Global string pool */
removedHash removedPackages; /*!< Set of packages being removed. */
rpmal addedPackages; /*!< Set of packages being installed. */
int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
{
int rc = -1; /* assume failure */
+ tsMembers tsmem = rpmtsMembers(ts);
rpmlock lock = NULL;
rpmps tsprobs = NULL;
/* Force default 022 umask during transaction for consistent results */
/* If unfiltered problems exist, free memory and return. */
if ((rpmtsFlags(ts) & RPMTRANS_FLAG_BUILD_PROBS) || (rpmpsNumProblems(tsprobs))) {
- tsMembers tsmem = rpmtsMembers(ts);
rc = tsmem->orderCount;
goto exit;
}
tsprobs = rpmpsFree(tsprobs);
rpmtsCleanProblems(ts);
+ /*
+ * Free up the global string pool unless we expect it to be needed
+ * again. During the transaction, private pools will be used for
+ * rpmfi's etc.
+ */
+ if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_TEST|RPMTRANS_FLAG_BUILD_PROBS)))
+ tsmem->pool = rpmstrPoolFree(tsmem->pool);
+
/* Actually install and remove packages, get final exit code */
rc = rpmtsProcess(ts) ? -1 : 0;