flex_array: add helpers to get and put to make pointers easy to use
Getting and putting arrays of pointers with flex arrays is a PITA. You have to remember to pass &ptr to the _put and you have to do weird and wacky casting to get the ptr back from the _get. Add two functions flex_array_get_ptr() and flex_array_put_ptr() to handle all of the magic. [akpm@linux-foundation.org: simplification suggested by Joe] Signed-off-by: Eric Paris <eparis@redhat.com> Cc: David Rientjes <rientjes@google.com> Cc: Dave Hansen <dave@linux.vnet.ibm.com> Cc: Joe Perches <joe@perches.com> Cc: James Morris <jmorris@namei.org> Cc: Joe Perches <joe@perches.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
559b140a36
commit
ea98eed9bc
|
@ -70,4 +70,9 @@ int flex_array_clear(struct flex_array *fa, unsigned int element_nr);
|
|||
void *flex_array_get(struct flex_array *fa, unsigned int element_nr);
|
||||
int flex_array_shrink(struct flex_array *fa);
|
||||
|
||||
#define flex_array_put_ptr(fa, nr, src, gfp) \
|
||||
flex_array_put(fa, nr, &(void *)(src), gfp)
|
||||
|
||||
void *flex_array_get_ptr(struct flex_array *fa, unsigned int element_nr);
|
||||
|
||||
#endif /* _FLEX_ARRAY_H */
|
||||
|
|
|
@ -171,6 +171,8 @@ __fa_get_part(struct flex_array *fa, int part_nr, gfp_t flags)
|
|||
* Note that this *copies* the contents of @src into
|
||||
* the array. If you are trying to store an array of
|
||||
* pointers, make sure to pass in &ptr instead of ptr.
|
||||
* You may instead wish to use the flex_array_put_ptr()
|
||||
* helper function.
|
||||
*
|
||||
* Locking must be provided by the caller.
|
||||
*/
|
||||
|
@ -265,7 +267,8 @@ int flex_array_prealloc(struct flex_array *fa, unsigned int start,
|
|||
*
|
||||
* Returns a pointer to the data at index @element_nr. Note
|
||||
* that this is a copy of the data that was passed in. If you
|
||||
* are using this to store pointers, you'll get back &ptr.
|
||||
* are using this to store pointers, you'll get back &ptr. You
|
||||
* may instead wish to use the flex_array_get_ptr helper.
|
||||
*
|
||||
* Locking must be provided by the caller.
|
||||
*/
|
||||
|
@ -286,6 +289,26 @@ void *flex_array_get(struct flex_array *fa, unsigned int element_nr)
|
|||
return &part->elements[index_inside_part(fa, element_nr)];
|
||||
}
|
||||
|
||||
/**
|
||||
* flex_array_get_ptr - pull a ptr back out of the array
|
||||
* @fa: the flex array from which to extract data
|
||||
* @element_nr: index of the element to fetch from the array
|
||||
*
|
||||
* Returns the pointer placed in the flex array at element_nr using
|
||||
* flex_array_put_ptr(). This function should not be called if the
|
||||
* element in question was not set using the _put_ptr() helper.
|
||||
*/
|
||||
void *flex_array_get_ptr(struct flex_array *fa, unsigned int element_nr)
|
||||
{
|
||||
void **tmp;
|
||||
|
||||
tmp = flex_array_get(fa, element_nr);
|
||||
if (!tmp)
|
||||
return NULL;
|
||||
|
||||
return *tmp;
|
||||
}
|
||||
|
||||
static int part_is_free(struct flex_array_part *part)
|
||||
{
|
||||
int i;
|
||||
|
|
Loading…
Reference in New Issue