Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
add: experiment with bsearch to see if it reduce the CPU bounding
Baptiste Daroussin committed 1 year ago
commit d33f29cd9d6260e88af8225f8968910b4d3f82df
parent 778d936
3 files changed +42 -13
modified libpkg/pkg.c
@@ -1731,3 +1731,31 @@ pkg_lists_sort(struct pkg *p)
	DL_SORT(p->options, pkg_option_cmp);
	DL_SORT(p->config_files, pkg_cf_cmp);
}
+

+
static int
+
pkgs_cmp(const void *a, const void *b)
+
{
+
	struct pkg *pa = *(struct pkg **)a;
+
	struct pkg *pb = *(struct pkg **)b;
+

+
	return (strcmp(pa->name, pb->name));
+
}
+

+
void
+
pkgs_sort(pkgs_t *pkgs)
+
{
+
	if (pkgs->len == 0)
+
		return;
+
	qsort(pkgs->d, pkgs->len, sizeof(pkgs->d[0]), pkgs_cmp);
+
}
+

+
struct pkg **
+
pkgs_search(pkgs_t *pkgs, char *el)
+
{
+
	struct pkg target = { .name = el };
+
	struct pkg *tgt = ⌖
+
	if (pkgs->len == 0)
+
		return (NULL);
+
	struct pkg **res = bsearch(&tgt, pkgs->d, pkgs->len, sizeof(pkgs->d[0]), pkgs_cmp);
+
	return (res);
+
}
modified libpkg/pkg_add.c
@@ -1085,19 +1085,18 @@ static bool
should_append_pkg(pkgs_t *localpkgs, struct pkg *p)
{
	/* only keep the highest version is we fine one */
-
	vec_foreach(*localpkgs, i) {
-
		struct pkg *lp = localpkgs->d[i];
-
		if (strcmp(lp->name, p->name) == 0) {
-
			if (pkg_version_cmp(lp->version, p->version) == -1) {
-
				pkg_free(localpkgs->d[i]);
-
				localpkgs->d[i] = p;
-
				return (true);
-
			}
-
			return (false);
+
	struct pkg **lp = pkgs_search(localpkgs, p->name);
+
	if (lp != NULL) {
+
		if (pkg_version_cmp((*lp)->version, p->version) == -1) {
+
			pkg_free(*lp);
+
			*lp = p;
+
			return (true);
		}
+
		return (false);
	}
	/* none found we should append */
	vec_push(localpkgs, p);
+
	pkgs_sort(localpkgs);
	return (true);
}

@@ -1146,10 +1145,9 @@ scan_local_pkgs(struct pkg_add_db *db, bool fromstdin, struct localhashes *l, co
static const char *
_localpkgs_get(pkgs_t *pkgs, const char *name)
{
-
	vec_foreach(*pkgs, i) {
-
		if (STREQ(pkgs->d[i]->name, name))
-
			return (pkgs->d[i]->repopath);
-
	}
+
	struct pkg **lp = pkgs_search(pkgs, name);
+
	if (lp != NULL)
+
		return ((*lp)->repopath);
	return (NULL);
}

modified libpkg/private/pkg.h
@@ -242,6 +242,9 @@ struct pkg {
typedef tll(struct pkg *) pkg_chain_t;
typedef vec_t(struct pkg *) pkgs_t;

+
struct pkg **pkgs_search(pkgs_t *, char *);
+
void pkgs_sort(pkgs_t *);
+

typedef enum {
	SCRIPT_UNKNOWN = 0,
	SCRIPT_SHELL,