Description

The list_create() function initializes a new list. The driver supplies the storage
for the list handle, the size of an individual element, and the
offset of a list_node_t within the element to use for the links
of the list.

The list_destroy() function destroys the list handle, including freeing any resources that
may have been internally allocated for the list. The list must be
empty when this function is called.

The list_insert_after() and list_insert_before() functions insert new_item into the linked list at
a location after or before the reference item, which must already be
on the list.

The list_insert_head() and list_insert_tail() functions insert the new_item on the list at
either the head or tail of the list. (The head is
the first item, the tail is the last item).

The list_remove() function removes the item from the list.

The list_remove_head() and list_remove_tail() functions remove the head (first) or tail (last)
item from the list. The item removed is returned to the caller.
If the list is empty when these functions are called, then no
change is made and NULL is returned to the caller.

The list_head() and list_tail() functions simply return the head (first) or tail
(last) item on the list. NULL is returned if the list
is empty.

The list_next() and list_prev() functions return the next or previous item in
the list, relative to the named reference item which must be linked
on the list.

The list_is_empty() function returns 0 if the list has items in it,
or non-zero otherwise.

The list_link_init() function initializes the list_node_t. It is functionally equivalent to bzero(node,
sizeof(*node));

The list_link_active() function returns non-zero if the node is on an active
list.

The list_move_tail() function is used to append the items on the src
list to the end of the dst list. It is mandatory that
the two lists were initialized using identical size and offset parameters. Upon
completion, the src list will be empty.

The list_link_replace() function swaps two items on a list. Note that
the items need not be on the same list, but extreme care
must be used to ensure that both lists are protected from concurrent
accesses and that the lists were initialized with identical size and offset parameters.