You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
perf tools: Introduce intlist
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>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
ee8dd3ca43
commit
70b40c4a43
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user