From fcf0cefd1a9ae9bd3319c82a77ed38d7a2bc8db3 Mon Sep 17 00:00:00 2001 From: Sören Brinkmann Date: Tue, 11 Mar 2014 19:29:21 -0700 Subject: pacman/upgrade: Refactor memory management MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Allan McRae --- src/pacman/upgrade.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/pacman/upgrade.c b/src/pacman/upgrade.c index 11da4dcb..cbc605d6 100644 --- a/src/pacman/upgrade.c +++ b/src/pacman/upgrade.c @@ -39,23 +39,25 @@ */ int pacman_upgrade(alpm_list_t *targets) { - int retval = 0; - alpm_list_t *i, *j, *remote = NULL; + int retval = 0, *file_is_remote; + alpm_list_t *i; + unsigned int n, num_targets; if(targets == NULL) { pm_printf(ALPM_LOG_ERROR, _("no targets specified (use -h for help)\n")); return 1; } - /* Check for URL targets and process them - */ - 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; - } + num_targets = alpm_list_count(targets); + /* 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, "://")) { char *str = alpm_fetch_pkgurl(config->handle, i->data); if(str == NULL) { @@ -65,13 +67,11 @@ int pacman_upgrade(alpm_list_t *targets) } else { free(i->data); i->data = str; - *r = 1; + file_is_remote[n] = 1; } } else { - *r = 0; + file_is_remote[n] = 0; } - - remote = alpm_list_add(remote, r); } if(retval) { @@ -85,12 +85,12 @@ int pacman_upgrade(alpm_list_t *targets) printf(_("loading packages...\n")); /* 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; alpm_pkg_t *pkg; alpm_siglevel_t level; - if(*(int *)j->data) { + if(file_is_remote[n]) { level = alpm_option_get_remote_file_siglevel(config->handle); } else { 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); } - FREELIST(remote); + free(file_is_remote); if(retval) { trans_release(); -- cgit v1.2.3-54-g00ecf