Skip to content

Instantly share code, notes, and snippets.

@ydm
Last active October 31, 2016 07:42
Show Gist options
  • Save ydm/5138713 to your computer and use it in GitHub Desktop.
Save ydm/5138713 to your computer and use it in GitHub Desktop.
I'm too stupid for this
typedef struct {
int val;
struct klist_node node;
} knode_t;
/* Not the wisest way of doing it for sure. */
knode_t *
my_klist_first (struct klist *list)
{
struct klist_iter iter;
struct klist_node *n;
klist_iter_init (list, &iter);
n = klist_next (&iter);
klist_iter_exit (&iter);
return n ? list_entry(n, knode_t, node) : NULL;
}
int
klist_example
{
/* List creation */
DEFINE_KLIST (my_klist, NULL, NULL);
struct klist_iter iter;
struct klist_node *e;
int i;
/* Insertion */
for (i = 0; i < 10; i++) {
knode_t *n = kzalloc (sizeof (knode_t), GFP_KERNEL);
n->val = i;
/* klist_add_head (&n->node, &my_klist); */
klist_add_tail (&n->node, &my_klist);
}
/* Iteration */
klist_iter_init (&my_klist, &iter);
while ((e = klist_next (&iter)) != NULL) {
printk (KERN_INFO "%p --> %d\n", e,
list_entry (e, knode_t, node)->val);
}
klist_iter_exit (&iter);
/* Free list data */
klist_iter_init (&my_klist, &iter);
while ((e = klist_next (&iter)) != NULL) {
knode_t *entry;
entry = list_entry(e, knode_t, node);
printk (KERN_INFO "deleting %p -> %d\n", e, entry->val);
/* Release memory for knode_t */
kfree (entry);
/* Release memory for klist_node */
klist_del (e); /* or klist_remove (e); */
}
klist_iter_exit (&iter);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment