2010-12-13 11:19:28 +00:00
/*
2011-01-27 10:38:15 +01:00
* Copyright ( C ) 2006 - 2011 B . A . T . M . A . N . contributors :
2010-12-13 11:19:28 +00:00
*
* Simon Wunderlich , Marek Lindner
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA
* 02110 - 1301 , USA
*
*/
# include "main.h"
# include "hash.h"
/* clears the hash */
static void hash_init ( struct hashtable_t * hash )
{
int i ;
2011-01-19 20:01:40 +00:00
for ( i = 0 ; i < hash - > size ; i + + ) {
2010-12-13 11:19:28 +00:00
INIT_HLIST_HEAD ( & hash - > table [ i ] ) ;
2011-01-19 20:01:40 +00:00
spin_lock_init ( & hash - > list_locks [ i ] ) ;
}
2010-12-13 11:19:28 +00:00
}
/* free only the hashtable and the hash itself. */
void hash_destroy ( struct hashtable_t * hash )
{
2011-01-19 20:01:40 +00:00
kfree ( hash - > list_locks ) ;
2010-12-13 11:19:28 +00:00
kfree ( hash - > table ) ;
kfree ( hash ) ;
}
/* allocates and clears the hash */
struct hashtable_t * hash_new ( int size )
{
struct hashtable_t * hash ;
2011-05-14 23:14:54 +02:00
hash = kmalloc ( sizeof ( * hash ) , GFP_ATOMIC ) ;
2010-12-13 11:19:28 +00:00
if ( ! hash )
return NULL ;
2011-05-14 23:14:54 +02:00
hash - > table = kmalloc ( sizeof ( * hash - > table ) * size , GFP_ATOMIC ) ;
2011-01-19 20:01:40 +00:00
if ( ! hash - > table )
goto free_hash ;
2010-12-13 11:19:28 +00:00
2011-05-14 23:14:54 +02:00
hash - > list_locks = kmalloc ( sizeof ( * hash - > list_locks ) * size ,
GFP_ATOMIC ) ;
2011-01-19 20:01:40 +00:00
if ( ! hash - > list_locks )
goto free_table ;
2010-12-13 11:19:28 +00:00
2011-01-19 20:01:40 +00:00
hash - > size = size ;
2010-12-13 11:19:28 +00:00
hash_init ( hash ) ;
return hash ;
2011-01-19 20:01:40 +00:00
free_table :
kfree ( hash - > table ) ;
free_hash :
kfree ( hash ) ;
return NULL ;
}