public inbox for linux-rdma@vger.kernel.org
 help / color / mirror / Atom feed
From: Sasha Khapyorsky <sashak-smomgflXvOZWk0Htik3J/w@public.gmane.org>
To: linux-rdma <linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Cc: Eli Dorfman <elid-smomgflXvOZWk0Htik3J/w@public.gmane.org>,
	Slava Strebkov <slavas-smomgflXvOZWk0Htik3J/w@public.gmane.org>,
	Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>,
	Hal Rosenstock
	<hal.rosenstock-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Subject: [PATCH] complib/cl_fleximap: add cl_fmap_match() function
Date: Fri, 13 Nov 2009 22:38:56 +0200	[thread overview]
Message-ID: <20091113203856.GT7192@me> (raw)
In-Reply-To: <20091113201144.GS7192@me>


Add cl_fmap_match() function - it is similar for cl_fmap_get() (getting
fleximap item by key) with difference that instead of using the map's
default comparison routine custom compare function can be passed there
as a parameter.

This can be useful for matching map item by a key pattern.

Signed-off-by: Sasha Khapyorsky <sashak-smomgflXvOZWk0Htik3J/w@public.gmane.org>
---

This function is used in IPv6 SNM MGID compression patch.

 opensm/complib/cl_map.c              |   14 ++++++++++--
 opensm/complib/libosmcomp.map        |    1 +
 opensm/include/complib/cl_fleximap.h |   36 ++++++++++++++++++++++++++++++++++
 3 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/opensm/complib/cl_map.c b/opensm/complib/cl_map.c
index d851bf8..f5fb1f3 100644
--- a/opensm/complib/cl_map.c
+++ b/opensm/complib/cl_map.c
@@ -1144,8 +1144,9 @@ void cl_fmap_init(IN cl_fmap_t * const p_map, IN cl_pfn_fmap_cmp_t pfn_compare)
 	cl_fmap_remove_all(p_map);
 }
 
-cl_fmap_item_t *cl_fmap_get(IN const cl_fmap_t * const p_map,
-			    IN const void *const p_key)
+cl_fmap_item_t *cl_fmap_match(IN const cl_fmap_t * const p_map,
+			      IN const void *const p_key,
+			      IN cl_pfn_fmap_cmp_t pfn_compare)
 {
 	cl_fmap_item_t *p_item;
 	int cmp;
@@ -1156,7 +1157,8 @@ cl_fmap_item_t *cl_fmap_get(IN const cl_fmap_t * const p_map,
 	p_item = __cl_fmap_root(p_map);
 
 	while (p_item != &p_map->nil) {
-		cmp = p_map->pfn_compare(p_key, p_item->p_key);
+		cmp = pfn_compare ? pfn_compare(p_key, p_item->p_key) :
+			p_map->pfn_compare(p_key, p_item->p_key);
 
 		if (!cmp)
 			break;	/* just right */
@@ -1170,6 +1172,12 @@ cl_fmap_item_t *cl_fmap_get(IN const cl_fmap_t * const p_map,
 	return (p_item);
 }
 
+cl_fmap_item_t *cl_fmap_get(IN const cl_fmap_t * const p_map,
+			    IN const void *const p_key)
+{
+	return cl_fmap_match(p_map, p_key, p_map->pfn_compare);
+}
+
 cl_fmap_item_t *cl_fmap_get_next(IN const cl_fmap_t * const p_map,
 				 IN const void *const p_key)
 {
diff --git a/opensm/complib/libosmcomp.map b/opensm/complib/libosmcomp.map
index 788eb2a..52410cc 100644
--- a/opensm/complib/libosmcomp.map
+++ b/opensm/complib/libosmcomp.map
@@ -66,6 +66,7 @@ OSMCOMP_2.3 {
 		cl_map_merge;
 		cl_map_delta;
 		cl_fmap_init;
+		cl_fmap_match;
 		cl_fmap_get;
 		cl_fmap_get_next;
 		cl_fmap_apply_func;
diff --git a/opensm/include/complib/cl_fleximap.h b/opensm/include/complib/cl_fleximap.h
index ec008cf..b74040f 100644
--- a/opensm/include/complib/cl_fleximap.h
+++ b/opensm/include/complib/cl_fleximap.h
@@ -619,6 +619,42 @@ cl_fmap_item_t *cl_fmap_insert(IN cl_fmap_t * const p_map,
 *	Flexi Map, cl_fmap_remove, cl_fmap_item_t
 *********/
 
+/****f* Component Library: Flexi Map/cl_fmap_match
+* NAME
+*	cl_fmap_get
+*
+* DESCRIPTION
+*	The cl_fmap_match function returns the map item matching a key.
+*
+* SYNOPSIS
+*/
+cl_fmap_item_t *cl_fmap_match(IN const cl_fmap_t * const p_map,
+			      IN const void *const p_key,
+			      IN cl_pfn_fmap_cmp_t pfn_compare);
+/*
+* 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.
+*
+*	pfn_compare
+*		[in] Pointer to a compare function to invoke to compare the
+*		keys of items in the map. Passing NULL here makes such call
+*		to be equivalent to using cl_fmap_get().
+*
+* RETURN VALUES
+*	Pointer to the map item matching the desired key value.
+*
+*	Pointer to the map end if there was no item matching the desired key
+*	value stored in the flexi map.
+*
+* SEE ALSO
+*	Flexi Map, cl_fmap_remove, cl_fmap_get
+*********/
+
 /****f* Component Library: Flexi Map/cl_fmap_get
 * NAME
 *	cl_fmap_get
-- 
1.6.5.2

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2009-11-13 20:38 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-13  6:19 [PATCH] opensm/osm_sa_mcmember_record.c: move mgid allocation code Sasha Khapyorsky
2009-11-13  6:21 ` [PATCH] opensm/osm_sa_member_record.c: mlid independent MGID generator Sasha Khapyorsky
2009-11-13 20:11   ` [PATCH] osm_sa_mcmember_record.c: pass MCM Record data to mlid allocator Sasha Khapyorsky
2009-11-13 20:38     ` Sasha Khapyorsky [this message]
2009-11-13 20:40       ` [PATCH RFC] opensm: compress IPV6 SNM groups to use a single MLID Sasha Khapyorsky
2009-11-16 15:35         ` Hal Rosenstock
     [not found]           ` <f0e08f230911160735i69ad3671m9a2667900b933e13-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2009-11-26 16:36             ` Sasha Khapyorsky
2009-11-26 16:37               ` [PATCH] opensm: IPv6 SNM update for man page and usage Sasha Khapyorsky
2009-11-30 19:48               ` [PATCH RFC] opensm: compress IPV6 SNM groups to use a single MLID Hal Rosenstock
     [not found]                 ` <f0e08f230911301148t8d573c7lf1f67972b5438b72-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2009-12-01 14:58                   ` Sasha Khapyorsky
2009-12-01 16:00                     ` Hal Rosenstock
2009-11-16 15:30       ` [PATCH] complib/cl_fleximap: add cl_fmap_match() function Hal Rosenstock

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091113203856.GT7192@me \
    --to=sashak-smomgflxvozwk0htik3j/w@public.gmane.org \
    --cc=elid-smomgflXvOZWk0Htik3J/w@public.gmane.org \
    --cc=hal.rosenstock-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=slavas-smomgflXvOZWk0Htik3J/w@public.gmane.org \
    --cc=weiny2-i2BcT+NCU+M@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox