2006-08-07 15:30:28 +04:00
/**************************************************************************
*
* Copyright 2006 Tungsten Graphics , Inc . , Bismack , ND . USA .
* All Rights Reserved .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the
* " Software " ) , to deal in the Software without restriction , including
* without limitation the rights to use , copy , modify , merge , publish ,
* distribute , sub license , and / or sell copies of the Software , and to
* permit persons to whom the Software is furnished to do so , subject to
* the following conditions :
*
* The above copyright notice and this permission notice ( including the
* next paragraph ) shall be included in all copies or substantial portions
* of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NON - INFRINGEMENT . IN NO EVENT SHALL
* THE COPYRIGHT HOLDERS , AUTHORS AND / OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM ,
* DAMAGES OR OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR
* OTHERWISE , ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE .
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* Simple open hash tab implementation .
*
* Authors :
2007-10-20 01:21:04 +04:00
* Thomas Hellström < thomas - at - tungstengraphics - dot - com >
2006-08-07 15:30:28 +04:00
*/
# ifndef DRM_HASHTAB_H
# define DRM_HASHTAB_H
2009-04-08 20:34:28 +04:00
# include <linux/list.h>
2006-08-07 16:36:47 +04:00
# define drm_hash_entry(_ptr, _type, _member) container_of(_ptr, _type, _member)
2006-08-07 15:30:28 +04:00
2007-07-12 04:26:44 +04:00
struct drm_hash_item {
2006-08-07 15:30:28 +04:00
struct hlist_node head ;
unsigned long key ;
2007-07-12 04:26:44 +04:00
} ;
2006-08-07 15:30:28 +04:00
2007-07-12 04:26:44 +04:00
struct drm_open_hash {
2006-08-07 15:30:28 +04:00
struct hlist_head * table ;
2011-01-26 21:33:25 +03:00
u8 order ;
2007-07-12 04:26:44 +04:00
} ;
2006-08-07 15:30:28 +04:00
2007-07-12 04:26:44 +04:00
extern int drm_ht_create ( struct drm_open_hash * ht , unsigned int order ) ;
extern int drm_ht_insert_item ( struct drm_open_hash * ht , struct drm_hash_item * item ) ;
extern int drm_ht_just_insert_please ( struct drm_open_hash * ht , struct drm_hash_item * item ,
2006-08-07 15:30:28 +04:00
unsigned long seed , int bits , int shift ,
unsigned long add ) ;
2007-07-12 04:26:44 +04:00
extern int drm_ht_find_item ( struct drm_open_hash * ht , unsigned long key , struct drm_hash_item * * item ) ;
2006-08-07 15:30:28 +04:00
2007-07-12 04:26:44 +04:00
extern void drm_ht_verbose_list ( struct drm_open_hash * ht , unsigned long key ) ;
extern int drm_ht_remove_key ( struct drm_open_hash * ht , unsigned long key ) ;
extern int drm_ht_remove_item ( struct drm_open_hash * ht , struct drm_hash_item * item ) ;
extern void drm_ht_remove ( struct drm_open_hash * ht ) ;
2006-08-07 15:30:28 +04:00
2012-11-20 16:16:47 +04:00
/*
* RCU - safe interface
*
* The user of this API needs to make sure that two or more instances of the
* hash table manipulation functions are never run simultaneously .
* The lookup function drm_ht_find_item_rcu may , however , run simultaneously
* with any of the manipulation functions as long as it ' s called from within
* an RCU read - locked section .
*/
# define drm_ht_insert_item_rcu drm_ht_insert_item
# define drm_ht_just_insert_please_rcu drm_ht_just_insert_please
# define drm_ht_remove_key_rcu drm_ht_remove_key
# define drm_ht_remove_item_rcu drm_ht_remove_item
# define drm_ht_find_item_rcu drm_ht_find_item
2006-08-07 15:30:28 +04:00
# endif