summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pkg_install/delete/perform.c
diff options
context:
space:
mode:
authorpav <pav@FreeBSD.org>2008-04-11 08:26:06 +0000
committerpav <pav@FreeBSD.org>2008-04-11 08:26:06 +0000
commitdf43e8c984cf5b4b1ddd9908916a7ec8a2669a31 (patch)
tree10d3af807888e075cd1a6aec7853f38e50370ba8 /usr.sbin/pkg_install/delete/perform.c
parent65e9886a96e340738e55f0fec0827590e3d4715c (diff)
downloadFreeBSD-src-df43e8c984cf5b4b1ddd9908916a7ec8a2669a31.zip
FreeBSD-src-df43e8c984cf5b4b1ddd9908916a7ec8a2669a31.tar.gz
Optimize package registration/deregistration. Previously, when looking up the
package name for the origin of a dependency, all entries in /var/db/pkg were traversed for each dependency of added/removed package. Now, gather all the origins first, then do the lookup in a single pass over /var/db/pkg. This should provide a major speedup for packages with hundreds of dependencies. Submitted by: rdivacky (earlier version) MFC after: 1 month
Diffstat (limited to 'usr.sbin/pkg_install/delete/perform.c')
-rw-r--r--usr.sbin/pkg_install/delete/perform.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/usr.sbin/pkg_install/delete/perform.c b/usr.sbin/pkg_install/delete/perform.c
index 1da3ad7..aa1047c 100644
--- a/usr.sbin/pkg_install/delete/perform.c
+++ b/usr.sbin/pkg_install/delete/perform.c
@@ -122,12 +122,12 @@ static int
pkg_do(char *pkg)
{
FILE *cfile;
- char *deporigin, **depnames, home[FILENAME_MAX];
+ char *deporigin, **deporigins = NULL, **depnames = NULL, **depmatches, home[FILENAME_MAX];
PackingList p;
int i, len;
int isinstalled;
/* support for separate pre/post install scripts */
- int new_m = 0;
+ int new_m = 0, dep_count = 0;
const char *pre_script = DEINSTALL_FNAME;
const char *post_script, *pre_arg, *post_arg;
struct reqr_by_entry *rb_entry;
@@ -275,15 +275,31 @@ pkg_do(char *pkg)
printf(".\n");
}
if (!Fake) {
- depnames = (deporigin != NULL) ? matchbyorigin(deporigin, NULL) :
- NULL;
- if (depnames == NULL) {
- depnames = alloca(sizeof(*depnames) * 2);
- depnames[0] = p->name;
- depnames[1] = NULL;
+ if (deporigin) {
+ deporigins = realloc(deporigins, (dep_count + 2) * sizeof(*deporigins));
+ depnames = realloc(depnames, (dep_count + 1) * sizeof(*depnames));
+ deporigins[dep_count] = deporigin;
+ deporigins[dep_count + 1] = NULL;
+ depnames[dep_count] = p->name;
+ dep_count++;
+ } else {
+ undepend(p->name, pkg);
+ }
+ }
+ }
+
+ if (dep_count > 0) {
+ /* Undepend all the dependencies at once */
+ depmatches = matchallbyorigin((const char **)deporigins, NULL);
+ free(deporigins);
+ if (depmatches) {
+ for (i = 0; i < dep_count; i++) {
+ if (depmatches[i]) {
+ undepend(depmatches[i], pkg);
+ } else if (depnames[i]) {
+ undepend(depnames[i], pkg);
+ }
}
- for (i = 0; depnames[i] != NULL; i++)
- undepend(depnames[i], pkg);
}
}
OpenPOWER on IntegriCloud