[ofa-general] RE: Patches to complib

Todd Rimmer todd.rimmer at qlogic.com
Wed Jun 20 07:25:00 PDT 2007


This adds get_next functions to the various maps (flexi, quick and map).


get_next searches for the 1st entry whose key is > the key specified.

As such get_next provides for searches where an exact key is not known,
or the map may be changing between searches (and hence the key of a
previously fetched entry may no longer be in the map).

This patch was generated against OFED 1.2, however I have diffed the
affected files and the files in the master are identical.

Signed-off-by: Todd Rimmer <todd.rimmer at qlogic.com>

diff -r -c orig2/osm/complib/cl_map.c fixed/osm/complib/cl_map.c
*** orig2/osm/complib/cl_map.c	Wed Jun 20 08:57:45 2007
--- fixed/osm/complib/cl_map.c	Wed Jun 20 09:41:55 2007
***************
*** 268,273 ****
--- 268,300 ----
  	return( p_item );
  }
  
+ cl_map_item_t*
+ cl_qmap_get_next(
+ 	IN	const cl_qmap_t* const	p_map,
+ 	IN	const uint64_t			key )
+ {
+ 	cl_map_item_t	*p_item;
+ 	cl_map_item_t	*p_item_found;
+ 
+ 	CL_ASSERT( p_map );
+ 	CL_ASSERT( p_map->state == CL_INITIALIZED );
+ 
+ 	p_item = __cl_map_root( p_map );
+ 	p_item_found = (cl_map_item_t*)&p_map->nil;
+ 
+ 	while( p_item != &p_map->nil )
+ 	{
+ 		if( key < p_item->key ){
+ 			p_item_found = p_item;
+ 			p_item = p_item->p_left;
+ 		}else{
+ 			p_item = p_item->p_right;
+ 		}
+ 	}
+     
+ 	return( p_item_found );
+ }
+ 
  void
  cl_qmap_apply_func(
  	IN	const cl_qmap_t* const	p_map,
***************
*** 832,837 ****
--- 859,881 ----
  	return( cl_qmap_obj( PARENT_STRUCT( p_item, cl_map_obj_t, item )
) );
  }
  
+ void*
+ cl_map_get_next(
+ 	IN	const cl_map_t* const	p_map,
+ 	IN	const uint64_t			key )
+ {
+ 	cl_map_item_t	*p_item;
+ 
+ 	CL_ASSERT( p_map );
+ 
+ 	p_item = cl_qmap_get_next( &p_map->qmap, key );
+ 
+ 	if( p_item == cl_qmap_end( &p_map->qmap ) )
+ 		return( NULL );
+ 
+ 	return( cl_qmap_obj( PARENT_STRUCT( p_item, cl_map_obj_t, item )
) );
+ }
+ 
  void
  cl_map_remove_item(
  	IN	cl_map_t* const			p_map,
***************
*** 1279,1284 ****
--- 1323,1358 ----
  	return( p_item );
  }
  
+ cl_fmap_item_t*
+ cl_fmap_get_next(
+ 	IN	const cl_fmap_t* const	p_map,
+ 	IN	const void* const		p_key )
+ {
+ 	cl_fmap_item_t	*p_item;
+ 	cl_fmap_item_t	*p_item_found;
+ 	intn_t			cmp;
+ 
+ 	CL_ASSERT( p_map );
+ 	CL_ASSERT( p_map->state == CL_INITIALIZED );
+ 
+ 	p_item = __cl_fmap_root( p_map );
+ 	p_item_found = (cl_fmap_item_t*)&p_map->nil;
+ 
+ 	while( p_item != &p_map->nil )
+ 	{
+ 		cmp = p_map->pfn_compare( p_key, p_item->p_key );
+ 
+ 		if( cmp < 0 ){
+ 			p_item_found = p_item;
+ 			p_item = p_item->p_left;	/* too small */
+ 		}else{
+ 			p_item = p_item->p_right;	/* too big or
match */
+ 		}
+ 	}
+ 
+ 	return( p_item_found );
+ }
+ 
  void
  cl_fmap_apply_func(
  	IN	const cl_fmap_t* const	p_map,
diff -r -c orig2/osm/include/complib/cl_fleximap.h
fixed/osm/include/complib/cl_fleximap.h
*** orig2/osm/include/complib/cl_fleximap.h	Wed Jun 20 08:57:45 2007
--- fixed/osm/include/complib/cl_fleximap.h	Wed Jun 20 09:30:30 2007
***************
*** 100,106 ****
  *
  *	Manipulation:
  *		cl_fmap_insert, cl_fmap_get, cl_fmap_remove_item,
cl_fmap_remove,
! *		cl_fmap_remove_all, cl_fmap_merge, cl_fmap_delta
  *
  *	Search:
  *		cl_fmap_apply_func
--- 100,106 ----
  *
  *	Manipulation:
  *		cl_fmap_insert, cl_fmap_get, cl_fmap_remove_item,
cl_fmap_remove,
! *		cl_fmap_remove_all, cl_fmap_merge, cl_fmap_delta,
cl_fmap_get_next
  *
  *	Search:
  *		cl_fmap_apply_func
***************
*** 672,678 ****
  *	cl_fmap_get does not remove the item from the flexi map.
  *
  * SEE ALSO
! *	Flexi Map, cl_fmap_remove
  *********/
  
  /****f* Component Library: Flexi Map/cl_fmap_remove_item
--- 672,714 ----
  *	cl_fmap_get does not remove the item from the flexi map.
  *
  * SEE ALSO
! *	Flexi Map, cl_fmap_remove, cl_fmap_get_next
! *********/
! 
! /****f* Component Library: Flexi Map/cl_fmap_get_next
! * NAME
! *	cl_fmap_get_next
! *
! * DESCRIPTION
! *	The cl_fmap_get_next function returns the first map item
associated with a
! *	key > the key specified.
! *
! * SYNOPSIS
! */
! cl_fmap_item_t*
! cl_fmap_get_next(
! 	IN	const cl_fmap_t* const	p_map,
! 	IN	const void* const		p_key );
! /*
! * PARAMETERS
! *	p_map
! *		[in] Pointer to a cl_fmap_t structure from which to
retrieve the
! *		item with the specified key.
! *
! *	p_key
! *		[in] Pointer to a key value used to search for the
desired map item.
! *
! * RETURN VALUES
! *	Pointer to the first map item with a key > the  desired key
value.
! *
! *	Pointer to the map end if there was no item with a key > the
desired key
! *	value stored in the flexi map.
! *
! * NOTES
! *	cl_fmap_get_next does not remove the item from the flexi map.
! *
! * SEE ALSO
! *	Flexi Map, cl_fmap_remove, cl_fmap_get
  *********/
  
  /****f* Component Library: Flexi Map/cl_fmap_remove_item
diff -r -c orig2/osm/include/complib/cl_map.h
fixed/osm/include/complib/cl_map.h
*** orig2/osm/include/complib/cl_map.h	Wed Jun 20 08:57:45 2007
--- fixed/osm/include/complib/cl_map.h	Wed Jun 20 09:30:51 2007
***************
*** 96,102 ****
  *
  *	Manipulation
  *		cl_map_insert, cl_map_get, cl_map_remove_item,
cl_map_remove,
! *		cl_map_remove_all, cl_map_merge, cl_map_delta
  *
  *	Attributes:
  *		cl_map_count, cl_is_map_empty, cl_is_map_inited
--- 96,102 ----
  *
  *	Manipulation
  *		cl_map_insert, cl_map_get, cl_map_remove_item,
cl_map_remove,
! *		cl_map_remove_all, cl_map_merge, cl_map_delta,
cl_map_get_next
  *
  *	Attributes:
  *		cl_map_count, cl_is_map_empty, cl_is_map_inited
***************
*** 628,634 ****
  *	cl_map_get does not remove the item from the map.
  *
  * SEE ALSO
! *	Map, cl_map_remove
  *********/
  
  /****f* Component Library: Map/cl_map_remove_item
--- 628,670 ----
  *	cl_map_get does not remove the item from the map.
  *
  * SEE ALSO
! *	Map, cl_map_remove, cl_map_get_next
! *********/
! 
! /****f* Component Library: Map/cl_map_get_next
! * NAME
! *	cl_map_get_next
! *
! * DESCRIPTION
! *	The cl_qmap_get_next function returns the first object
associated with a
! *	key > the key specified.
! *
! * SYNOPSIS
! */
! void*
! cl_map_get_next(
! 	IN	const cl_map_t* const	p_map,
! 	IN	const uint64_t			key );
! /*
! * PARAMETERS
! *	p_map
! *		[in] Pointer to a map from which to retrieve the object
with
! *		the specified key.
! *
! *	key
! *		[in] Key value used to search for the desired object.
! *
! * RETURN VALUES
! *	Pointer to the first object with a key > the desired key value.
! *
! *	NULL if there was no item with a key > the desired key
! *	value stored in the map.
! *
! * NOTES
! *	cl_map_get does not remove the item from the map.
! *
! * SEE ALSO
! *	Map, cl_map_remove, cl_map_get
  *********/
  
  /****f* Component Library: Map/cl_map_remove_item
diff -r -c orig2/osm/include/complib/cl_qmap.h
fixed/osm/include/complib/cl_qmap.h
*** orig2/osm/include/complib/cl_qmap.h	Wed Jun 20 08:57:45 2007
--- fixed/osm/include/complib/cl_qmap.h	Wed Jun 20 09:43:19 2007
***************
*** 98,104 ****
  *
  *	Manipulation:
  *		cl_qmap_insert, cl_qmap_get, cl_qmap_remove_item,
cl_qmap_remove,
! *		cl_qmap_remove_all, cl_qmap_merge, cl_qmap_delta
  *
  *	Search:
  *		cl_qmap_apply_func
--- 98,104 ----
  *
  *	Manipulation:
  *		cl_qmap_insert, cl_qmap_get, cl_qmap_remove_item,
cl_qmap_remove,
! *		cl_qmap_remove_all, cl_qmap_merge, cl_qmap_delta,
cl_qmap_get_next
  *
  *	Search:
  *		cl_qmap_apply_func
***************
*** 749,755 ****
  *	cl_qmap_get does not remove the item from the quick map.
  *
  * SEE ALSO
! *	Quick Map, cl_qmap_remove
  *********/
  
  /****f* Component Library: Quick Map/cl_qmap_remove_item
--- 749,791 ----
  *	cl_qmap_get does not remove the item from the quick map.
  *
  * SEE ALSO
! *	Quick Map, cl_qmap_get_next, cl_qmap_remove
! *********/
! 
! /****f* Component Library: Quick Map/cl_qmap_get_next
! * NAME
! *	cl_qmap_get_next
! *
! * DESCRIPTION
! *	The cl_qmap_get_next function returns the first map item
associated with a
! *	key > the key specified.
! *
! * SYNOPSIS
! */
! cl_map_item_t*
! cl_qmap_get_next(
! 	IN	const cl_qmap_t* const	p_map,
! 	IN	const uint64_t			key );
! /*
! * PARAMETERS
! *	p_map
! *		[in] Pointer to a cl_qmap_t structure from which to
retrieve the
! *		first item with a key > the specified key.
! *
! *	key
! *		[in] Key value used to search for the desired map item.
! *
! * RETURN VALUES
! *	Pointer to the first map item with a key > the desired key
value.
! *
! *	Pointer to the map end if there was no item with a key > the
desired key
! *	value stored in the quick map.
! *
! * NOTES
! *	cl_qmap_get_next does not remove the item from the quick map.
! *
! * SEE ALSO
! *	Quick Map, cl_qmap_get, cl_qmap_remove
  *********/
  
  /****f* Component Library: Quick Map/cl_qmap_remove_item

Todd Rimmer
Chief Architect 
QLogic System Interconnect Group
Voice: 610-233-4852     Fax: 610-233-4777
Todd.Rimmer at QLogic.com  www.QLogic.com



More information about the general mailing list