mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-23 00:08:50 -05:00
_alpm_db_add_pkgincache rework
Commit 8240da6cb3
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>
This commit is contained in:
parent
ffa3056010
commit
03021713e5
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user