qblist.h(3)

NAME
qblist.h - This is a kernel style list implementation.

SYNOPSIS

#include <stdint.h>
#include <qb/qbdefs.h>

  Data Structures
struct qb_list_head

  Macros
#define QB_LIST_DECLARE(name) struct qb_list_head name = { &(name), &(name) }
Declare and initialize a list head.
#define QB_INIT_LIST_HEAD(ptr)
#define qb_list_entry(ptr, type, member) ((type *)((char *)(ptr)-(char*)(&((type *)0)->member)))
Get the struct for this entry.
#define qb_list_first_entry(ptr, type, member) qb_list_entry((ptr)->next, type, member)
Get the first element from a list.
#define qb_list_for_each(pos, head) for (pos = (head)->next; pos != (head); pos = pos->next)
Iterate over a list.
#define qb_list_for_each_reverse(pos, head) for (pos = (head)->prev; pos != (head); pos = pos->prev)
Iterate over a list backwards.
#define qb_list_for_each_safe(pos, n, head)
Iterate over a list safe against removal of list entry.
#define qb_list_for_each_entry(pos, head, member)
Iterate over list of given type.
#define qb_list_for_each_entry_reverse(pos, head, member)
Iterate backwards over list of given type.
#define qb_list_for_each_entry_safe(pos, n, head, member)
Iterate over list of given type safe against removal of list entry.
#define qb_list_for_each_entry_safe_reverse(pos, n, head, member)
Iterate backwards over list safe against removal.
#define qb_list_for_each_entry_from(pos, head, member)
Iterate over list of given type from the current point.

  Functions
static void qb_list_init (struct qb_list_head *head)
Initialize the list entry.
static void qb_list_add (struct qb_list_head *element, struct qb_list_head *head)
Add this element to the list.
static void qb_list_add_tail (struct qb_list_head *element, struct qb_list_head *head)
Add to the list (but at the end of the list).
static void qb_list_del (struct qb_list_head *_remove)
Delete an entry from the list.
static void qb_list_replace (struct qb_list_head *old, struct qb_list_head *new)
Replace old entry by new one.
static int qb_list_is_last (const struct qb_list_head *list, const struct qb_list_head *head)
Tests whether list is the last entry in list head.
static int32_t qb_list_empty (const struct qb_list_head *head)
A quick test to see if the list is empty (pointing to it's self).
static void qb_list_splice (struct qb_list_head *list, struct qb_list_head *head)
Join two lists.
static void qb_list_splice_tail (struct qb_list_head *list, struct qb_list_head *head)
Join two lists, each list being a queue.
static int32_t qb_list_length (struct qb_list_head *head)
Count the number of items in the list.

Detailed Description

This is a kernel style list implementation.

Author:
    Steven Dake sdake@redhat.com

Macro Definition Documentation

  #define QB_INIT_LIST_HEAD(ptr)
Value:

do {         (ptr)->next = (ptr); (ptr)->prev = (ptr); } while (0)

  #define QB_LIST_DECLARE(name) struct qb_list_head name = { &(name), &(name) }

Declare and initialize a list head.

  #define qb_list_entry(ptr, type, member) ((type *)((char *)(ptr)-(char*)(&((type *)0)->member)))

Get the struct for this entry.

Parameters:
    ptr the &struct list_head pointer.
    type the type of the struct this is embedded in.
    member the name of the list_struct within the struct.

  #define qb_list_first_entry(ptr, type, member) qb_list_entry((ptr)->next, type, member)

Get the first element from a list.

Parameters:
    ptr the &struct list_head pointer.
    type the type of the struct this is embedded in.
    member the name of the list_struct within the struct.

  #define qb_list_for_each(pos, head) for (pos = (head)->next; pos != (head); pos = pos->next)

Iterate over a list.

Parameters:
    pos the &struct list_head to use as a loop counter.
    head the head for your list.

Referenced by qb_list_length().

  #define qb_list_for_each_entry(pos, head, member)
Value:

for (pos = qb_list_entry((head)->next, typeof(*pos), member);               &pos->member != (head);                                                 pos = qb_list_entry(pos->member.next, typeof(*pos), member))

Iterate over list of given type.

Parameters:
    pos the type * to use as a loop counter.
    head the head for your list.
    member the name of the list_struct within the struct.

  #define qb_list_for_each_entry_from(pos, head, member)
Value:

for (; &pos->member != (head);                                                         pos = qb_list_entry(pos->member.next, typeof(*pos), member))

Iterate over list of given type from the current point.

Parameters:
    pos the type * to use as a loop cursor.
    head the head for your list.
    member the name of the list_struct within the struct.

  #define qb_list_for_each_entry_reverse(pos, head, member)
Value:

for (pos = qb_list_entry((head)->prev, typeof(*pos), member);               &pos->member != (head);                                                 pos = qb_list_entry(pos->member.prev, typeof(*pos), member))

Iterate backwards over list of given type.

Parameters:
    pos the type to use as a loop counter.
    head the head for your list.
    member the name of the list_struct within the struct.

  #define qb_list_for_each_entry_safe(pos, n, head, member)
Value:

for (pos = qb_list_entry((head)->next, typeof(*pos), member),                          n = qb_list_entry(pos->member.next, typeof(*pos), member);                    &pos->member != (head);                                                         pos = n, n = qb_list_entry(n->member.next, typeof(*n), member))

Iterate over list of given type safe against removal of list entry.

Parameters:
    pos the type * to use as a loop cursor.
    n another type * to use as temporary storage
    head the head for your list.
    member the name of the list_struct within the struct.

  #define qb_list_for_each_entry_safe_reverse(pos, n, head, member)
Value:

for (pos = qb_list_entry((head)->prev, typeof(*pos), member),                          n = qb_list_entry(pos->member.prev, typeof(*pos), member);                    &pos->member != (head);                                                         pos = n, n = qb_list_entry(n->member.prev, typeof(*n), member))

Iterate backwards over list safe against removal.

Parameters:
    pos the type * to use as a loop cursor.
    n another type * to use as temporary storage
    head the head for your list.
    member the name of the list_struct within the struct.

  #define qb_list_for_each_reverse(pos, head) for (pos = (head)->prev; pos != (head); pos = pos->prev)

Iterate over a list backwards.

Parameters:
    pos the &struct list_head to use as a loop counter.
    head the head for your list.

  #define qb_list_for_each_safe(pos, n, head)
Value:

for (pos = (head)->next, n = pos->next; pos != (head);                 pos = n, n = pos->next)

Iterate over a list safe against removal of list entry.

Parameters:
    pos the &struct list_head to use as a loop counter.
    n another &struct list_head to use as temporary storage
    head the head for your list.

Function Documentation

  static void qb_list_add (struct qb_list_head * element, struct qb_list_head * head) [inline], [static]

Add this element to the list.

Parameters:
    element the new element to insert.
    head pointer to the list head

References qb_list_head::next, and qb_list_head::prev.

  static void qb_list_add_tail (struct qb_list_head * element, struct qb_list_head * head) [inline], [static]

Add to the list (but at the end of the list).

Parameters:
    element pointer to the element to add
    head pointer to the list head

See also:
    qb_list_add()

References qb_list_head::next, and qb_list_head::prev.

  static void qb_list_del (struct qb_list_head * _remove) [inline], [static]

Delete an entry from the list.

Parameters:
    _remove the list item to remove

References qb_list_head::next, and qb_list_head::prev.

  static int32_t qb_list_empty (const struct qb_list_head * head) [inline], [static]

A quick test to see if the list is empty (pointing to it's self).

Parameters:
    head pointer to the list head

Returns:
    boolean true/false

References qb_list_head::next.

Referenced by qb_list_splice(), and qb_list_splice_tail().

  static void qb_list_init (struct qb_list_head * head) [inline], [static]

Initialize the list entry. Points next and prev pointers to head.

Parameters:
    head pointer to the list head

References qb_list_head::next, and qb_list_head::prev.

  static int qb_list_is_last (const struct qb_list_head * list, const struct qb_list_head * head) [inline], [static]

Tests whether list is the last entry in list head.

Parameters:
    list the entry to test
    head the head of the list

Returns:
    boolean true/false

References qb_list_head::next.

  static int32_t qb_list_length (struct qb_list_head * head) [inline], [static]

Count the number of items in the list.

Parameters:
    head the head for your list.

Returns:
    length of the list.

References qb_list_for_each.

  static void qb_list_replace (struct qb_list_head * old, struct qb_list_head * new) [inline], [static]

Replace old entry by new one.

Parameters:
    old the element to be replaced
    new the new element to insert

References qb_list_head::next, and qb_list_head::prev.

  static void qb_list_splice (struct qb_list_head * list, struct qb_list_head * head) [inline], [static]

Join two lists.

Parameters:
    list the new list to add.
    head the place to add it in the first list.

Note:
    The 'list' is reinitialised

References qb_list_head::next, qb_list_head::prev, and qb_list_empty().

  static void qb_list_splice_tail (struct qb_list_head * list, struct qb_list_head * head) [inline], [static]

Join two lists, each list being a queue.

Parameters:
    list the new list to add.
    head the place to add it in the first list.

References qb_list_head::next, qb_list_head::prev, and qb_list_empty().

Author

Generated automatically by Doxygen for libqb from the source code.