mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-21 14:34:19 +00:00
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
2 changed files with 29 additions and 1 deletions
|
@ -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);
|
void *flex_array_get(struct flex_array *fa, unsigned int element_nr);
|
||||||
int flex_array_shrink(struct flex_array *fa);
|
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 */
|
#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
|
* Note that this *copies* the contents of @src into
|
||||||
* the array. If you are trying to store an array of
|
* the array. If you are trying to store an array of
|
||||||
* pointers, make sure to pass in &ptr instead of ptr.
|
* 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.
|
* 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
|
* 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
|
* 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.
|
* 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)];
|
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)
|
static int part_is_free(struct flex_array_part *part)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
Loading…
Add table
Reference in a new issue