mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-23 00:08:50 -05:00
pacman/upgrade: Refactor memory management
Refactor the upgrade routine to use an array that can be allocated in one step instead of an alpm_list that is gradually extended in loops. Signed-off-by: Sören Brinkmann <soeren.brinkmann@gmail.com> Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
parent
3ebb7b94d9
commit
fcf0cefd1a
@ -39,23 +39,25 @@
|
|||||||
*/
|
*/
|
||||||
int pacman_upgrade(alpm_list_t *targets)
|
int pacman_upgrade(alpm_list_t *targets)
|
||||||
{
|
{
|
||||||
int retval = 0;
|
int retval = 0, *file_is_remote;
|
||||||
alpm_list_t *i, *j, *remote = NULL;
|
alpm_list_t *i;
|
||||||
|
unsigned int n, num_targets;
|
||||||
|
|
||||||
if(targets == NULL) {
|
if(targets == NULL) {
|
||||||
pm_printf(ALPM_LOG_ERROR, _("no targets specified (use -h for help)\n"));
|
pm_printf(ALPM_LOG_ERROR, _("no targets specified (use -h for help)\n"));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for URL targets and process them
|
num_targets = alpm_list_count(targets);
|
||||||
*/
|
|
||||||
for(i = targets; i; i = alpm_list_next(i)) {
|
/* Check for URL targets and process them */
|
||||||
int *r = malloc(sizeof(int));
|
file_is_remote = malloc(num_targets * sizeof(int));
|
||||||
if(r == NULL) {
|
if(file_is_remote == NULL) {
|
||||||
pm_printf(ALPM_LOG_ERROR, _("memory exhausted\n"));
|
pm_printf(ALPM_LOG_ERROR, _("memory exhausted\n"));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(i = targets, n = 0; i; i = alpm_list_next(i), n++) {
|
||||||
if(strstr(i->data, "://")) {
|
if(strstr(i->data, "://")) {
|
||||||
char *str = alpm_fetch_pkgurl(config->handle, i->data);
|
char *str = alpm_fetch_pkgurl(config->handle, i->data);
|
||||||
if(str == NULL) {
|
if(str == NULL) {
|
||||||
@ -65,13 +67,11 @@ int pacman_upgrade(alpm_list_t *targets)
|
|||||||
} else {
|
} else {
|
||||||
free(i->data);
|
free(i->data);
|
||||||
i->data = str;
|
i->data = str;
|
||||||
*r = 1;
|
file_is_remote[n] = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*r = 0;
|
file_is_remote[n] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
remote = alpm_list_add(remote, r);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(retval) {
|
if(retval) {
|
||||||
@ -85,12 +85,12 @@ int pacman_upgrade(alpm_list_t *targets)
|
|||||||
|
|
||||||
printf(_("loading packages...\n"));
|
printf(_("loading packages...\n"));
|
||||||
/* add targets to the created transaction */
|
/* add targets to the created transaction */
|
||||||
for(i = targets, j = remote; i; i = alpm_list_next(i), j = alpm_list_next(j)) {
|
for(i = targets, n = 0; i; i = alpm_list_next(i), n++) {
|
||||||
const char *targ = i->data;
|
const char *targ = i->data;
|
||||||
alpm_pkg_t *pkg;
|
alpm_pkg_t *pkg;
|
||||||
alpm_siglevel_t level;
|
alpm_siglevel_t level;
|
||||||
|
|
||||||
if(*(int *)j->data) {
|
if(file_is_remote[n]) {
|
||||||
level = alpm_option_get_remote_file_siglevel(config->handle);
|
level = alpm_option_get_remote_file_siglevel(config->handle);
|
||||||
} else {
|
} else {
|
||||||
level = alpm_option_get_local_file_siglevel(config->handle);
|
level = alpm_option_get_local_file_siglevel(config->handle);
|
||||||
@ -112,7 +112,7 @@ int pacman_upgrade(alpm_list_t *targets)
|
|||||||
config->explicit_adds = alpm_list_add(config->explicit_adds, pkg);
|
config->explicit_adds = alpm_list_add(config->explicit_adds, pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
FREELIST(remote);
|
free(file_is_remote);
|
||||||
|
|
||||||
if(retval) {
|
if(retval) {
|
||||||
trans_release();
|
trans_release();
|
||||||
|
Loading…
Reference in New Issue
Block a user