diff --git a/sys/kern/subr_unit.c b/sys/kern/subr_unit.c index aa4569e43c7a..10a9b35602bf 100644 --- a/sys/kern/subr_unit.c +++ b/sys/kern/subr_unit.c @@ -216,6 +216,18 @@ new_unrhdr(u_int low, u_int high) return (uh); } +void +delete_unrhdr(struct unrhdr *uh) +{ + + KASSERT(uh->busy == 0, ("unrhdr has %u allocations", uh->busy)); + + /* We should have a single un only */ + delete_unr(uh, TAILQ_FIRST(&uh->head)); + KASSERT(uh->alloc == 0, ("UNR memory leak in delete_unrhdr")); + Free(uh); +} + /* * See if a given unr should be collapsed with a neighbor */ @@ -567,7 +579,7 @@ int main(int argc __unused, const char **argv __unused) { struct unrhdr *uh; - int i, x; + int i, x, m; char a[NN]; uh = new_unrhdr(0, NN - 1); @@ -577,7 +589,7 @@ main(int argc __unused, const char **argv __unused) fprintf(stderr, "sizeof(struct unr) %d\n", sizeof (struct unr)); fprintf(stderr, "sizeof(struct unrhdr) %d\n", sizeof (struct unrhdr)); x = 1; - for (;;) { + for (m = 0; m < NN; m++) { i = random() % NN; if (a[i]) { printf("F %u\n", i); @@ -592,6 +604,11 @@ main(int argc __unused, const char **argv __unused) print_unrhdr(uh); check_unrhdr(uh, __LINE__); } + for (i = 0; i < NN; i++) + if (a[i]) + free_unr(uh, i); + print_unrhdr(uh); + delete_unrhdr(uh); return (0); } #endif diff --git a/sys/sys/systm.h b/sys/sys/systm.h index 28e0e4a99abd..b8de51922dda 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -312,6 +312,7 @@ void DELAY(int usec); */ struct unrhdr; struct unrhdr *new_unrhdr(u_int low, u_int high); +void delete_unrhdr(struct unrhdr *uh); u_int alloc_unr(struct unrhdr *uh); void free_unr(struct unrhdr *uh, u_int item);