Module Name: src Committed By: rmind Date: Tue Jun 5 20:51:37 UTC 2012
Modified Files: src/sys/kern: subr_hash.c Log Message: Add hash_list_size() and simplify slightly. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/kern/subr_hash.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_hash.c diff -u src/sys/kern/subr_hash.c:1.4 src/sys/kern/subr_hash.c:1.5 --- src/sys/kern/subr_hash.c:1.4 Sun Dec 25 02:23:09 2011 +++ src/sys/kern/subr_hash.c Tue Jun 5 20:51:36 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_hash.c,v 1.4 2011/12/25 02:23:09 christos Exp $ */ +/* $NetBSD: subr_hash.c,v 1.5 2012/06/05 20:51:36 rmind Exp $ */ /* * Copyright (c) 1982, 1986, 1991, 1993 @@ -37,12 +37,36 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_hash.c,v 1.4 2011/12/25 02:23:09 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_hash.c,v 1.5 2012/06/05 20:51:36 rmind Exp $"); #include <sys/param.h> #include <sys/kmem.h> #include <sys/systm.h> +static size_t +hash_list_size(enum hashtype htype) +{ + LIST_HEAD(, generic) *hashtbl_list; + SLIST_HEAD(, generic) *hashtbl_slist; + TAILQ_HEAD(, generic) *hashtbl_tailq; + size_t esize; + + switch (htype) { + case HASH_LIST: + esize = sizeof(*hashtbl_list); + break; + case HASH_SLIST: + esize = sizeof(*hashtbl_slist); + break; + case HASH_TAILQ: + esize = sizeof(*hashtbl_tailq); + break; + default: + panic("hashdone: invalid table type"); + } + return esize; +} + /* * General routine to allocate a hash table. * Allocate enough memory to hold at least `elements' list-head pointers. @@ -52,14 +76,14 @@ __KERNEL_RCSID(0, "$NetBSD: subr_hash.c, void * hashinit(u_int elements, enum hashtype htype, bool waitok, u_long *hashmask) { - u_long hashsize, i; LIST_HEAD(, generic) *hashtbl_list; SLIST_HEAD(, generic) *hashtbl_slist; TAILQ_HEAD(, generic) *hashtbl_tailq; + u_long hashsize, i; size_t esize; void *p; - if (elements == 0) - panic("hashinit: bad cnt"); + + KASSERT(elements > 0); #define MAXELEMENTS (1U << ((sizeof(elements) * NBBY) - 1)) if (elements > MAXELEMENTS) @@ -68,23 +92,10 @@ hashinit(u_int elements, enum hashtype h for (hashsize = 1; hashsize < elements; hashsize <<= 1) continue; - switch (htype) { - case HASH_LIST: - esize = sizeof(*hashtbl_list); - break; - case HASH_SLIST: - esize = sizeof(*hashtbl_slist); - break; - case HASH_TAILQ: - esize = sizeof(*hashtbl_tailq); - break; - default: - panic("hashinit: invalid table type"); - } - - p = kmem_alloc(hashsize * esize, (waitok ? KM_SLEEP : KM_NOSLEEP)); + esize = hash_list_size(htype); + p = kmem_alloc(hashsize * esize, waitok ? KM_SLEEP : KM_NOSLEEP); if (p == NULL) - return (NULL); + return NULL; switch (htype) { case HASH_LIST: @@ -104,7 +115,7 @@ hashinit(u_int elements, enum hashtype h break; } *hashmask = hashsize - 1; - return (p); + return p; } /* @@ -113,24 +124,6 @@ hashinit(u_int elements, enum hashtype h void hashdone(void *hashtbl, enum hashtype htype, u_long hashmask) { - LIST_HEAD(, generic) *hashtbl_list; - SLIST_HEAD(, generic) *hashtbl_slist; - TAILQ_HEAD(, generic) *hashtbl_tailq; - size_t esize; - - switch (htype) { - case HASH_LIST: - esize = sizeof(*hashtbl_list); - break; - case HASH_SLIST: - esize = sizeof(*hashtbl_slist); - break; - case HASH_TAILQ: - esize = sizeof(*hashtbl_tailq); - break; - default: - panic("hashdone: invalid table type"); - } - + const size_t esize = hash_list_size(htype); kmem_free(hashtbl, esize * (hashmask + 1)); }