From: Arran Cudbard-Bell Date: Thu, 28 Jan 2021 13:42:39 +0000 (+0000) Subject: Fixup rbmonkey so it does not duplicate private structs X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f5f40733377b49c8858f4bd4fe27fd14ddb40c0a;p=thirdparty%2Ffreeradius-server.git Fixup rbmonkey so it does not duplicate private structs - Use a test structure with room for an rb node instead of just an integer. - Minor style corrections. --- diff --git a/src/tests/rbmonkey.c b/src/tests/rbmonkey.c index 278ba23fe9..039305a96e 100644 --- a/src/tests/rbmonkey.c +++ b/src/tests/rbmonkey.c @@ -2,53 +2,25 @@ #include #include -#include +#include +#include -/* - * We need knowlege of the internal structures. - * This needs to be kept in lockstep with rbtree.c - */ - -struct rbnode_s { - fr_rb_node_t *left; //!< left child - fr_rb_node_t *right; //!< right child - fr_rb_node_t *parent; //!< Parent - fr_rb_colour_t colour; //!< Node colour (BLACK, RED) - void *data; //!< data stored in node -}; - -struct rbtree_s { -#ifndef NDEBUG - uint32_t magic; -#endif - fr_rb_node_t *root; - int num_elements; - fr_rb_cmp_t compare; - fr_rb_free_t free; - bool replace; - bool lock; - pthread_mutex_t mutex; -}; - -/* Storage for the NIL pointer. */ -static fr_rb_node_t *NIL; +typedef struct { + uint32_t num; + fr_rb_node_t node; +} fr_rb_test_node_t; static int comp(void const *a, void const *b) { - if (*(uint32_t const *)a > *(uint32_t const *)b) { - return -1; - } + fr_rb_test_node_t const *our_a = a, *our_b = b; - if (*(uint32_t const *)a < *(uint32_t const *)b) { - return 1; - } - return 0; + return (our_a->num > our_b->num) - (our_a->num < our_b->num); } #if 0 static int print_cb(void *i, UNUSED void *uctx) { - fprintf(stderr, "%i\n", *(int*)i); + fprintf(stderr, "%i\n", (fr_rb_test_node_t *)i->num); return 0; } #endif @@ -56,11 +28,11 @@ static int print_cb(void *i, UNUSED void *uctx) #define MAXSIZE 1024 static int cb_stored = 0; -static uint32_t rvals[MAXSIZE]; +static fr_rb_test_node_t rvals[MAXSIZE]; static int store_cb(void *i, UNUSED void *uctx) { - rvals[cb_stored++] = *(int const *)i; + rvals[cb_stored++].num = *(int const *)i; return 0; } @@ -68,7 +40,7 @@ static uint32_t mask; static int filter_cb(void *i, void *uctx) { - if ((*(uint32_t *)i & mask) == (*(uint32_t *)uctx & mask)) { + if ((((fr_rb_test_node_t *)i)->num & mask) == (((fr_rb_test_node_t *)uctx)->num & mask)) { return 2; } return 0; @@ -115,7 +87,7 @@ descend: } n = n->right; } - if (n->left != NIL || n->right != NIL) { + if ((n->left != NIL) || (n->right != NIL)) { goto descend; } if (count_expect < 0) { @@ -159,11 +131,13 @@ static void freenode(void *data) int main(UNUSED int argc, UNUSED char *argv[]) { - rbtree_t *t; - int i, j; - uint32_t thresh; - int n, rep; - uint32_t vals[MAXSIZE]; + rbtree_t *t; + int i, j; + uint32_t thresh; + int n, rep; + fr_rb_test_node_t vals[MAXSIZE]; + + memset(&vals, 0, sizeof(vals)); /* TODO: make starting seed and repetitions a CLI option */ rep = REPS; @@ -176,50 +150,45 @@ again: thresh &= mask; n = (fr_rand() % MAXSIZE) + 1; - fprintf(stderr, "filter = %x mask = %x n= %i\n", - thresh, mask, n); + fprintf(stderr, "filter = %x mask = %x n = %i\n", thresh, mask, n); t = rbtree_alloc(NULL, comp, freenode, RBTREE_FLAG_LOCK); - /* Find out the value of the NIL node */ - NIL = t->root->left; - for (i = 0; i < n; i++) { - int *p; - p = talloc(t, int); - *p = fr_rand(); - vals[i] = *p; + fr_rb_test_node_t *p; + + p = talloc(t, fr_rb_test_node_t); /* Do not use talloc_zero, rbcode should initialise fr_rb_node_t */ + p->num = fr_rand(); + vals[i].num = p->num; rbtree_insert(t, p); } i = rbcount(t); - fprintf(stderr,"After insert rbcount is %i.\n", i); - if (i < 0) { return i; } + fprintf(stderr,"After insert rbcount is %i\n", i); + if (i < 0) return i; - qsort(vals, n, sizeof(int), comp); + qsort(vals, n, sizeof(fr_rb_test_node_t), comp); /* * For testing deletebydata instead for (i = 0; i < n; i++) { - if (filter_cb(&vals[i], &thresh) == 2) { - rbtree_deletebydata(t, &vals[i]); - } + if (filter_cb(&vals[i], &thresh) == 2) rbtree_deletebydata(t, &vals[i]); } * */ (void) rbtree_walk(t, RBTREE_DELETE_ORDER, filter_cb, &thresh); i = rbcount(t); - fprintf(stderr,"After delete rbcount is %i.\n", i); - if (i < 0) { return i; } + fprintf(stderr,"After delete rbcount is %i\n", i); + if (i < 0) return i; cb_stored = 0; rbtree_walk(t, RBTREE_IN_ORDER, &store_cb, NULL); for (j = i = 0; i < n; i++) { - if (i && vals[i-1] == vals[i]) continue; + if (i && vals[i-1].num == vals[i].num) continue; if (!filter_cb(&thresh, &vals[i])) { - if (vals[i] != rvals[j]) goto bad; + if (vals[i].num != rvals[j].num) goto bad; j++; } } @@ -229,12 +198,12 @@ again: bad: for (j = i = 0; i < n; i++) { - if (i && vals[i-1] == vals[i]) continue; + if (i && vals[i-1].num == vals[i].num) continue; if (!filter_cb(&thresh, &vals[i])) { - fprintf(stderr, "%i: %x %x\n", j, vals[i], rvals[j]); + fprintf(stderr, "%i: %x %x\n", j, vals[i].num, rvals[j].num); j++; } else { - fprintf(stderr, "skipped %x\n", vals[i]); + fprintf(stderr, "skipped %x\n", vals[i].num); } } return -1;