[master] 0cba6f8 Convert the parameter array to a list of parameters.

Poul-Henning Kamp phk at FreeBSD.org
Fri May 22 11:58:00 CEST 2015


commit 0cba6f823757ed28df8bd6e695384e40ef0ea2da
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Fri May 22 09:56:48 2015 +0000

    Convert the parameter array to a list of parameters.

diff --git a/bin/varnishd/mgt/mgt_param.c b/bin/varnishd/mgt/mgt_param.c
index bead46b..1fd3f33 100644
--- a/bin/varnishd/mgt/mgt_param.c
+++ b/bin/varnishd/mgt/mgt_param.c
@@ -46,9 +46,16 @@
 
 #include "mgt_cli.h"
 
+struct plist {
+	unsigned			magic;
+#define PLIST_MAGIC			0xbfc3ea16
+	VTAILQ_ENTRY(plist)		list;
+	struct parspec			*spec;
+};
+
+static VTAILQ_HEAD(, plist)		phead = VTAILQ_HEAD_INITIALIZER(phead);
+
 struct params mgt_param;
-static int nparspec;
-static struct parspec ** parspecs;
 static const int margin1 = 8;
 static int margin2 = 0;
 static const int wrap_at = 72;
@@ -94,21 +101,42 @@ static const char ONLY_ROOT_TEXT[] =
 	"\n\n"
 	"NB: This parameter only works if varnishd is run as root.";
 
-
 /*--------------------------------------------------------------------*/
 
 static struct parspec *
 mcf_findpar(const char *name)
 {
-	int i;
+	struct plist *pl;
 
 	AN(name);
-	for (i = 0; i < nparspec; i++)
-		if (!strcmp(parspecs[i]->name, name))
-			return (parspecs[i]);
+	VTAILQ_FOREACH(pl, &phead, list)
+		if (!strcmp(pl->spec->name, name))
+			return (pl->spec);
 	return (NULL);
 }
 
+static void
+mcf_addpar(struct parspec *ps)
+{
+	struct plist *pl, *pl2;
+	int i;
+
+	ALLOC_OBJ(pl, PLIST_MAGIC);
+	AN(pl);
+	pl->spec = ps;
+	VTAILQ_FOREACH(pl2, &phead, list) {
+		i = strcmp(pl2->spec->name, pl->spec->name);
+		if (i == 0) {
+			fprintf(stderr, "Duplicate param: %s\n", ps->name);
+			exit(4);
+		} else if (i > 0) {
+			VTAILQ_INSERT_BEFORE(pl2, pl, list);
+			return;
+		}
+	}
+	VTAILQ_INSERT_TAIL(&phead, pl, list);
+}
+
 /*--------------------------------------------------------------------
  * Wrap the text nicely.
  * Lines are allowed to contain to TABS and we render that as a table
@@ -205,7 +233,8 @@ mcf_wrap(struct cli *cli, const char *text)
 void
 mcf_param_show(struct cli *cli, const char * const *av, void *priv)
 {
-	int i, n;
+	int n;
+	struct plist *pl;
 	const struct parspec *pp;
 	int lfmt = 0, chg = 0;
 	struct vsb *vsb;
@@ -219,8 +248,8 @@ mcf_param_show(struct cli *cli, const char * const *av, void *priv)
 		lfmt = 1;
 
 	n = 0;
-	for (i = 0; i < nparspec; i++) {
-		pp = parspecs[i];
+	VTAILQ_FOREACH(pl, &phead, list) {
+		pp = pl->spec;
 		if (lfmt && strcmp(pp->name, av[2]) && strcmp("-l", av[2]))
 			continue;
 		n++;
@@ -364,22 +393,12 @@ mcf_param_set(struct cli *cli, const char * const *av, void *priv)
  * Add a group of parameters to the global set and sort by name.
  */
 
-static int
-mcf_parspec_cmp(const void *a, const void *b)
-{
-	struct parspec * const * pa = a;
-	struct parspec * const * pb = b;
-	return (strcmp((*pa)->name, (*pb)->name));
-}
-
 void
 MCF_AddParams(struct parspec *ps)
 {
 	struct parspec *pp;
 	const char *s;
-	int n;
 
-	n = 0;
 	for (pp = ps; pp->name != NULL; pp++) {
 		AN(pp->func);
 		s = strchr(pp->descr, '\0');
@@ -388,23 +407,12 @@ MCF_AddParams(struct parspec *ps)
 			    "Param->descr has trailing space: %s\n", pp->name);
 			exit(4);
 		}
-		if (mcf_findpar(pp->name) != NULL) {
-			fprintf(stderr, "Duplicate param: %s\n", pp->name);
-			exit(4);
-		}
+		mcf_addpar(pp);
 		if (strlen(pp->name) + 1 > margin2)
 			margin2 = strlen(pp->name) + 1;
-		n++;
 	}
-	parspecs = realloc(parspecs, (1L + nparspec + n) * sizeof *parspecs);
-	XXXAN(parspecs);
-	for (pp = ps; pp->name != NULL; pp++)
-		parspecs[nparspec++] = pp;
-	parspecs[nparspec] = NULL;
-	qsort (parspecs, nparspec, sizeof parspecs[0], mcf_parspec_cmp);
 }
 
-
 /*--------------------------------------------------------------------
  * Wash a min/max/default value
  */
@@ -443,14 +451,14 @@ mcf_wash_param(struct cli *cli, const struct parspec *pp, const char **val,
 void
 MCF_InitParams(struct cli *cli)
 {
+	struct plist *pl;
 	struct parspec *pp;
-	int i;
 	struct vsb *vsb;
 
 	vsb = VSB_new_auto();
 	AN(vsb);
-	for (i = 0; i < nparspec; i++) {
-		pp = parspecs[i];
+	VTAILQ_FOREACH(pl, &phead, list) {
+		pp = pl->spec;
 
 		if (pp->min != NULL)
 			mcf_wash_param(cli, pp, &pp->min, "minimum", vsb);
@@ -515,14 +523,15 @@ MCF_SetMaximum(const char *param, const char *new_max)
 void
 MCF_DumpRstParam(void)
 {
+	struct plist *pl;
 	const struct parspec *pp;
 	const char *p, *q, *t1, *t2;
-	int i, j;
+	int j;
 
 	printf("\n.. The following is the autogenerated "
 	    "output from varnishd -x dumprstparam\n\n");
-	for (i = 0; i < nparspec; i++) {
-		pp = parspecs[i];
+	VTAILQ_FOREACH(pl, &phead, list) {
+		pp = pl->spec;
 		printf(".. _ref_param_%s:\n\n", pp->name);
 		printf("%s\n", pp->name);
 		for (j = 0; j < strlen(pp->name); j++)



More information about the varnish-commit mailing list