1
0
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:
Sören Brinkmann 2014-03-11 19:29:21 -07:00 committed by Allan McRae
parent 3ebb7b94d9
commit fcf0cefd1a

View File

@ -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)) {
int *r = malloc(sizeof(int));
if(r == NULL) {
pm_printf(ALPM_LOG_ERROR, _("memory exhausted\n"));
return 1;
}
/* Check for URL targets and process them */
file_is_remote = malloc(num_targets * sizeof(int));
if(file_is_remote == NULL) {
pm_printf(ALPM_LOG_ERROR, _("memory exhausted\n"));
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();