kernel: Add hashdestroy() (taken from FreeBSD).
authorSascha Wildner <saw@online.de>
Wed, 6 Jun 2012 19:56:00 +0000 (21:56 +0200)
committerSascha Wildner <saw@online.de>
Wed, 6 Jun 2012 20:13:03 +0000 (22:13 +0200)
share/man/man9/Makefile
share/man/man9/hashinit.9
sys/kern/kern_subr.c
sys/sys/systm.h

index 851a7f0..c0f9ac8 100644 (file)
@@ -446,7 +446,8 @@ MLINKS+=firmware.9 firmware_get.9 \
        firmware.9 firmware_put.9 \
        firmware.9 firmware_register.9 \
        firmware.9 firmware_unregister.9
-MLINKS+=hashinit.9 hashinit_ext.9 \
+MLINKS+=hashinit.9 hashdestroy.9 \
+       hashinit.9 hashinit_ext.9 \
        hashinit.9 phashinit.9 \
        hashinit.9 phashinit_ext.9
 MLINKS+=ioctl.9 _IOR.9 \
index 1aa1400..578ebf5 100644 (file)
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd December 20, 2009
+.Dd June 6, 2012
 .Dt HASHINIT 9
 .Os
 .Sh NAME
 .Nm hashinit ,
 .Nm hashinit_ext ,
+.Nm hashdestroy ,
 .Nm phashinit ,
 .Nm phashinit_ext
 .Nd generic hash table functions for the kernel
@@ -48,6 +49,8 @@
 .Fn hashinit "int count" "struct malloc_type *type" "u_long *hashmask"
 .Ft void *
 .Fn hashinit_ext "int count" "size_t size" "struct malloc_type *type" "u_long *hashmask"
+.Ft void
+.Fn hashdestroy "void *hashtbl" "struct malloc_type *type" "u_long hashmask"
 .Ft void *
 .Fn phashinit "int count" "struct malloc_type *type" "u_long *nentries"
 .Ft void *
@@ -96,6 +99,22 @@ which take the
 of the structure as an additional argument and will zero the array instead
 of assuming that it is an array of
 .Dv LIST_HEAD Ns s .
+.Pp
+The
+.Fn hashdestroy
+function frees the space occupied by the hash table pointed to by argument
+.Fa hashtbl .
+Argument
+.Fa type
+determines the malloc arena to use when freeing space.
+The argument
+.Fa hashmask
+should be the bit mask returned by the call to
+.Fn hashinit
+that allocated the hash table.
+The argument
+.Fa flags
+must be used with one of the following values.
 .Sh SEE ALSO
 .Xr tcp 4 ,
 .Xr udp 4 ,
@@ -104,3 +123,11 @@ of assuming that it is an array of
 .Sh AUTHORS
 This manual page was written by
 .An Hiten Pandya Aq hmp@backplane.com .
+.Sh BUGS
+There is no
+.Fn phashdestroy
+function, and using
+.Fn hashdestroy
+to free a hash table allocated by
+.Fn phashinit
+usually has grave consequences.
index 9a5b35b..29efb19 100644 (file)
@@ -265,6 +265,17 @@ hashinit(int elements, struct malloc_type *type, u_long *hashmask)
        return (hashtbl);
 }
 
+void
+hashdestroy(void *vhashtbl, struct malloc_type *type, u_long hashmask)
+{
+       LIST_HEAD(generic, generic) *hashtbl, *hp;
+
+       hashtbl = vhashtbl;
+       for (hp = hashtbl; hp <= &hashtbl[hashmask]; hp++)
+               KASSERT(LIST_EMPTY(hp), ("%s: hash not empty", __func__));
+       kfree(hashtbl, type);
+}
+
 /*
  * This is a newer version which allocates a hash table of structures.
  *
index b153f57..b16119e 100644 (file)
@@ -151,6 +151,7 @@ int nullop (void);
 int    seltrue (cdev_t dev, int which);
 int    ureadc (int, struct uio *);
 void   *hashinit (int count, struct malloc_type *type, u_long *hashmask);
+void   hashdestroy(void *vhashtbl, struct malloc_type *type, u_long hashmask);
 void   *phashinit (int count, struct malloc_type *type, u_long *nentries);
 void   *hashinit_ext (int count, size_t size,
                        struct malloc_type *type, u_long *hashmask);