The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kern/subr_hash.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: subr_hash.c,v 1.3 2008/05/05 17:11:17 ad Exp $ */
    2 
    3 /*
    4  * Copyright (c) 1982, 1986, 1991, 1993
    5  *      The Regents of the University of California.  All rights reserved.
    6  * (c) UNIX System Laboratories, Inc.
    7  * All or some portions of this file are derived from material licensed
    8  * to the University of California by American Telephone and Telegraph
    9  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
   10  * the permission of UNIX System Laboratories, Inc.
   11  *
   12  * Redistribution and use in source and binary forms, with or without
   13  * modification, are permitted provided that the following conditions
   14  * are met:
   15  * 1. Redistributions of source code must retain the above copyright
   16  *    notice, this list of conditions and the following disclaimer.
   17  * 2. Redistributions in binary form must reproduce the above copyright
   18  *    notice, this list of conditions and the following disclaimer in the
   19  *    documentation and/or other materials provided with the distribution.
   20  * 3. Neither the name of the University nor the names of its contributors
   21  *    may be used to endorse or promote products derived from this software
   22  *    without specific prior written permission.
   23  *
   24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   34  * SUCH DAMAGE.
   35  *
   36  *      @(#)kern_subr.c 8.4 (Berkeley) 2/14/95
   37  */
   38 
   39 #include <sys/cdefs.h>
   40 __KERNEL_RCSID(0, "$NetBSD: subr_hash.c,v 1.3 2008/05/05 17:11:17 ad Exp $");
   41 
   42 #include <sys/param.h>
   43 #include <sys/kmem.h>
   44 #include <sys/systm.h>
   45 
   46 /*
   47  * General routine to allocate a hash table.
   48  * Allocate enough memory to hold at least `elements' list-head pointers.
   49  * Return a pointer to the allocated space and set *hashmask to a pattern
   50  * suitable for masking a value to use as an index into the returned array.
   51  */
   52 void *
   53 hashinit(u_int elements, enum hashtype htype, bool waitok, u_long *hashmask)
   54 {
   55         u_long hashsize, i;
   56         LIST_HEAD(, generic) *hashtbl_list;
   57         SLIST_HEAD(, generic) *hashtbl_slist;
   58         TAILQ_HEAD(, generic) *hashtbl_tailq;
   59         size_t esize;
   60         void *p;
   61 
   62         if (elements == 0)
   63                 panic("hashinit: bad cnt");
   64         for (hashsize = 1; hashsize < elements; hashsize <<= 1)
   65                 continue;
   66 
   67         switch (htype) {
   68         case HASH_LIST:
   69                 esize = sizeof(*hashtbl_list);
   70                 break;
   71         case HASH_SLIST:
   72                 esize = sizeof(*hashtbl_slist);
   73                 break;
   74         case HASH_TAILQ:
   75                 esize = sizeof(*hashtbl_tailq);
   76                 break;
   77         default:
   78                 panic("hashinit: invalid table type");
   79         }
   80 
   81         p = kmem_alloc(hashsize * esize, (waitok ? KM_SLEEP : KM_NOSLEEP));
   82         if (p == NULL)
   83                 return (NULL);
   84 
   85         switch (htype) {
   86         case HASH_LIST:
   87                 hashtbl_list = p;
   88                 for (i = 0; i < hashsize; i++)
   89                         LIST_INIT(&hashtbl_list[i]);
   90                 break;
   91         case HASH_SLIST:
   92                 hashtbl_slist = p;
   93                 for (i = 0; i < hashsize; i++)
   94                         SLIST_INIT(&hashtbl_slist[i]);
   95                 break;
   96         case HASH_TAILQ:
   97                 hashtbl_tailq = p;
   98                 for (i = 0; i < hashsize; i++)
   99                         TAILQ_INIT(&hashtbl_tailq[i]);
  100                 break;
  101         }
  102         *hashmask = hashsize - 1;
  103         return (p);
  104 }
  105 
  106 /*
  107  * Free memory from hash table previosly allocated via hashinit().
  108  */
  109 void
  110 hashdone(void *hashtbl, enum hashtype htype, u_long hashmask)
  111 {
  112         LIST_HEAD(, generic) *hashtbl_list;
  113         SLIST_HEAD(, generic) *hashtbl_slist;
  114         TAILQ_HEAD(, generic) *hashtbl_tailq;
  115         size_t esize;
  116 
  117         switch (htype) {
  118         case HASH_LIST:
  119                 esize = sizeof(*hashtbl_list);
  120                 break;
  121         case HASH_SLIST:
  122                 esize = sizeof(*hashtbl_slist);
  123                 break;
  124         case HASH_TAILQ:
  125                 esize = sizeof(*hashtbl_tailq);
  126                 break;
  127         default:
  128                 panic("hashdone: invalid table type");
  129         }
  130 
  131         kmem_free(hashtbl, esize * (hashmask + 1));
  132 }

Cache object: 4ccdf39187a383feb85733f63a73ae5a


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.