summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNagy Gabor <ngaba@bibl.u-szeged.hu>2008-07-15 01:07:22 +0200
committerDan McGee <dan@archlinux.org>2008-07-15 19:16:42 -0500
commit03021713e5315312b150e6ac9c5cf48fe68f7615 (patch)
treefd2a3ebf3419726d048874b5f5d2ad9f73e7b542
parentffa3056010b6ea104a8d772d0349a705575a13ca (diff)
downloadpacman-03021713e5315312b150e6ac9c5cf48fe68f7615.tar.xz
_alpm_db_add_pkgincache rework
Commit 8240da6cb3ff95ad480efe3e1876104024398fae broke some alpm hierarchy and introduced a new memleak (trans->packages was never freed in case of add transaction, even if the transaction wasn't committed), so it is reverted now. We follow a different approach to reduce memory usage: _alpm_db_add_pkgincache doesn't duplicate the whole package before adding it to the cache, only the package name and version (INFRQ_BASE). This method needs very small extra memory (compared to the reverted method), and after transaction commit we use less memory than before (since the big 'files' fields are not copied to cache), this is useful in GUIs. Note: The old add_pkgincache was a bit broken, since pkg->origin wasn't filled in correctly. Signed-off-by: Nagy Gabor <ngaba@bibl.u-szeged.hu> Acked-by: Xavier Chantry <shiningxc@gmail.com> Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--lib/libalpm/cache.c22
-rw-r--r--lib/libalpm/trans.c3
2 files changed, 21 insertions, 4 deletions
diff --git a/lib/libalpm/cache.c b/lib/libalpm/cache.c
index b140476c..032cc978 100644
--- a/lib/libalpm/cache.c
+++ b/lib/libalpm/cache.c
@@ -98,17 +98,35 @@ alpm_list_t *_alpm_db_get_pkgcache(pmdb_t *db)
return(db->pkgcache);
}
+/* "duplicate" pkg with BASE info (to spare some memory) then add it to pkgcache */
int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg)
{
+ pmpkg_t *newpkg;
+
ALPM_LOG_FUNC;
if(db == NULL || pkg == NULL) {
return(-1);
}
+ newpkg = _alpm_pkg_new();
+ if(newpkg == NULL) {
+ return(-1);
+ }
+ newpkg->name = strdup(pkg->name);
+ newpkg->version = strdup(pkg->version);
+ if(newpkg->name == NULL || newpkg->version == NULL) {
+ pm_errno = PM_ERR_MEMORY;
+ _alpm_pkg_free(newpkg);
+ return(-1);
+ }
+ newpkg->origin = PKG_FROM_CACHE;
+ newpkg->origin_data.db = db;
+ newpkg->infolevel = INFRQ_BASE;
+
_alpm_log(PM_LOG_DEBUG, "adding entry '%s' in '%s' cache\n",
- alpm_pkg_get_name(pkg), db->treename);
- db->pkgcache = alpm_list_add_sorted(db->pkgcache, pkg, _alpm_pkg_cmp);
+ alpm_pkg_get_name(newpkg), db->treename);
+ db->pkgcache = alpm_list_add_sorted(db->pkgcache, newpkg, _alpm_pkg_cmp);
_alpm_db_free_grpcache(db);
diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c
index 06084ae9..d6b165d3 100644
--- a/lib/libalpm/trans.c
+++ b/lib/libalpm/trans.c
@@ -251,8 +251,7 @@ void _alpm_trans_free(pmtrans_t *trans)
if(trans->type == PM_TRANS_TYPE_SYNC) {
alpm_list_free_inner(trans->packages, (alpm_list_fn_free)_alpm_sync_free);
- } else if (trans->type == PM_TRANS_TYPE_REMOVE ||
- trans->type == PM_TRANS_TYPE_REMOVEUPGRADE) {
+ } else {
alpm_list_free_inner(trans->packages, (alpm_list_fn_free)_alpm_pkg_free);
}
alpm_list_free(trans->packages);