linux/net/batman-adv/hash.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2006-2011 B.A.T.M.A.N. contributors:
   3 *
   4 * Simon Wunderlich, Marek Lindner
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of version 2 of the GNU General Public
   8 * License as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 * General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License
  16 * along with this program; if not, write to the Free Software
  17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  18 * 02110-1301, USA
  19 *
  20 */
  21
  22#include "main.h"
  23#include "hash.h"
  24
  25/* clears the hash */
  26static void hash_init(struct hashtable_t *hash)
  27{
  28        int i;
  29
  30        for (i = 0 ; i < hash->size; i++) {
  31                INIT_HLIST_HEAD(&hash->table[i]);
  32                spin_lock_init(&hash->list_locks[i]);
  33        }
  34}
  35
  36/* free only the hashtable and the hash itself. */
  37void hash_destroy(struct hashtable_t *hash)
  38{
  39        kfree(hash->list_locks);
  40        kfree(hash->table);
  41        kfree(hash);
  42}
  43
  44/* allocates and clears the hash */
  45struct hashtable_t *hash_new(int size)
  46{
  47        struct hashtable_t *hash;
  48
  49        hash = kmalloc(sizeof(*hash), GFP_ATOMIC);
  50        if (!hash)
  51                return NULL;
  52
  53        hash->table = kmalloc(sizeof(*hash->table) * size, GFP_ATOMIC);
  54        if (!hash->table)
  55                goto free_hash;
  56
  57        hash->list_locks = kmalloc(sizeof(*hash->list_locks) * size,
  58                                   GFP_ATOMIC);
  59        if (!hash->list_locks)
  60                goto free_table;
  61
  62        hash->size = size;
  63        hash_init(hash);
  64        return hash;
  65
  66free_table:
  67        kfree(hash->table);
  68free_hash:
  69        kfree(hash);
  70        return NULL;
  71}
  72