-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Built on rblist - like strlist. Used in the next patch. Signed-off-by: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1343709095-7089-4-git-send-email-dsahern@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
- Loading branch information
David Ahern
authored and
Arnaldo Carvalho de Melo
committed
Aug 3, 2012
1 parent
ee8dd3c
commit 70b40c4
Showing
3 changed files
with
178 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
/* | ||
* Based on intlist.c by: | ||
* (c) 2009 Arnaldo Carvalho de Melo <acme@redhat.com> | ||
* | ||
* Licensed under the GPLv2. | ||
*/ | ||
|
||
#include <errno.h> | ||
#include <stdlib.h> | ||
#include <linux/compiler.h> | ||
|
||
#include "intlist.h" | ||
|
||
static struct rb_node *intlist__node_new(struct rblist *rblist __used, | ||
const void *entry) | ||
{ | ||
int i = (int)((long)entry); | ||
struct rb_node *rc = NULL; | ||
struct int_node *node = malloc(sizeof(*node)); | ||
|
||
if (node != NULL) { | ||
node->i = i; | ||
rc = &node->rb_node; | ||
} | ||
|
||
return rc; | ||
} | ||
|
||
static void int_node__delete(struct int_node *ilist) | ||
{ | ||
free(ilist); | ||
} | ||
|
||
static void intlist__node_delete(struct rblist *rblist __used, | ||
struct rb_node *rb_node) | ||
{ | ||
struct int_node *node = container_of(rb_node, struct int_node, rb_node); | ||
|
||
int_node__delete(node); | ||
} | ||
|
||
static int intlist__node_cmp(struct rb_node *rb_node, const void *entry) | ||
{ | ||
int i = (int)((long)entry); | ||
struct int_node *node = container_of(rb_node, struct int_node, rb_node); | ||
|
||
return node->i - i; | ||
} | ||
|
||
int intlist__add(struct intlist *ilist, int i) | ||
{ | ||
return rblist__add_node(&ilist->rblist, (void *)((long)i)); | ||
} | ||
|
||
void intlist__remove(struct intlist *ilist __used, struct int_node *node) | ||
{ | ||
int_node__delete(node); | ||
} | ||
|
||
struct int_node *intlist__find(struct intlist *ilist, int i) | ||
{ | ||
struct int_node *node = NULL; | ||
struct rb_node *rb_node = rblist__find(&ilist->rblist, (void *)((long)i)); | ||
|
||
if (rb_node) | ||
node = container_of(rb_node, struct int_node, rb_node); | ||
|
||
return node; | ||
} | ||
|
||
struct intlist *intlist__new(void) | ||
{ | ||
struct intlist *ilist = malloc(sizeof(*ilist)); | ||
|
||
if (ilist != NULL) { | ||
rblist__init(&ilist->rblist); | ||
ilist->rblist.node_cmp = intlist__node_cmp; | ||
ilist->rblist.node_new = intlist__node_new; | ||
ilist->rblist.node_delete = intlist__node_delete; | ||
} | ||
|
||
return ilist; | ||
} | ||
|
||
void intlist__delete(struct intlist *ilist) | ||
{ | ||
if (ilist != NULL) | ||
rblist__delete(&ilist->rblist); | ||
} | ||
|
||
struct int_node *intlist__entry(const struct intlist *ilist, unsigned int idx) | ||
{ | ||
struct int_node *node = NULL; | ||
struct rb_node *rb_node; | ||
|
||
rb_node = rblist__entry(&ilist->rblist, idx); | ||
if (rb_node) | ||
node = container_of(rb_node, struct int_node, rb_node); | ||
|
||
return node; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
#ifndef __PERF_INTLIST_H | ||
#define __PERF_INTLIST_H | ||
|
||
#include <linux/rbtree.h> | ||
#include <stdbool.h> | ||
|
||
#include "rblist.h" | ||
|
||
struct int_node { | ||
struct rb_node rb_node; | ||
int i; | ||
}; | ||
|
||
struct intlist { | ||
struct rblist rblist; | ||
}; | ||
|
||
struct intlist *intlist__new(void); | ||
void intlist__delete(struct intlist *ilist); | ||
|
||
void intlist__remove(struct intlist *ilist, struct int_node *in); | ||
int intlist__add(struct intlist *ilist, int i); | ||
|
||
struct int_node *intlist__entry(const struct intlist *ilist, unsigned int idx); | ||
struct int_node *intlist__find(struct intlist *ilist, int i); | ||
|
||
static inline bool intlist__has_entry(struct intlist *ilist, int i) | ||
{ | ||
return intlist__find(ilist, i) != NULL; | ||
} | ||
|
||
static inline bool intlist__empty(const struct intlist *ilist) | ||
{ | ||
return rblist__empty(&ilist->rblist); | ||
} | ||
|
||
static inline unsigned int intlist__nr_entries(const struct intlist *ilist) | ||
{ | ||
return rblist__nr_entries(&ilist->rblist); | ||
} | ||
|
||
/* For intlist iteration */ | ||
static inline struct int_node *intlist__first(struct intlist *ilist) | ||
{ | ||
struct rb_node *rn = rb_first(&ilist->rblist.entries); | ||
return rn ? rb_entry(rn, struct int_node, rb_node) : NULL; | ||
} | ||
static inline struct int_node *intlist__next(struct int_node *in) | ||
{ | ||
struct rb_node *rn; | ||
if (!in) | ||
return NULL; | ||
rn = rb_next(&in->rb_node); | ||
return rn ? rb_entry(rn, struct int_node, rb_node) : NULL; | ||
} | ||
|
||
/** | ||
* intlist_for_each - iterate over a intlist | ||
* @pos: the &struct int_node to use as a loop cursor. | ||
* @ilist: the &struct intlist for loop. | ||
*/ | ||
#define intlist__for_each(pos, ilist) \ | ||
for (pos = intlist__first(ilist); pos; pos = intlist__next(pos)) | ||
|
||
/** | ||
* intlist_for_each_safe - iterate over a intlist safe against removal of | ||
* int_node | ||
* @pos: the &struct int_node to use as a loop cursor. | ||
* @n: another &struct int_node to use as temporary storage. | ||
* @ilist: the &struct intlist for loop. | ||
*/ | ||
#define intlist__for_each_safe(pos, n, ilist) \ | ||
for (pos = intlist__first(ilist), n = intlist__next(pos); pos;\ | ||
pos = n, n = intlist__next(n)) | ||
#endif /* __PERF_INTLIST_H */ |