Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Minimal example of TAILQ usage out of <sys/queue.h> library

Tags:

c

linux

gcc

queue

Can some one provide minimal example of TAILQ usage out of linux system library with explanation in c which can be compiled using gcc in Linux?

like image 975
Khamidulla Avatar asked Mar 11 '14 02:03

Khamidulla


People also ask

What is Tailq in C?

The TAILQ_ENTRY macro is used to establish the pointers used to insert items into the list. You place it into your structure that you want to list up.

What is Tailq in Linux?

Creation A tail queue is headed by a structure defined by the TAILQ_HEAD() macro. This structure contains a pair of pointers, one to the first element in the queue and the other to the last element in the queue. The elements are doubly linked so that an arbitrary element can be removed without traversing the queue.


1 Answers

The TAILQ_ENTRY macro is used to establish the pointers used to insert items into the list. You place it into your structure that you want to list up.

struct foo {
    TAILQ_ENTRY(foo) tailq;
    int datum;
    /* ... */
};

The TAILQ_HEAD is used to define a structure that will act as the container for your link list elements. You provide it with a structure name, and the name of the type that it will contain.

TAILQ_HEAD(fooq, foo);

Use TAILQ_INIT to initialize an instance of your list container.

struct fooq q;
TAILQ_INIT(&q);

Use the TAILQ_INSERT_* macros to add elements.

struct foo data[3] = { foo(3), foo(7), foo(1) };
TAILQ_INSERT_HEAD(&q, &data[0], tailq);
TAILQ_INSERT_AFTER(&q, &data[0], &data[1], tailq);
TAILQ_INSERT_TAIL(&q, &data[2], tailq);

You can use TAILQ_FOREACH and TAILQ_FOREACH_REVERSE to traverse the list.

struct foo *p;
TAILQ_FOREACH(p, &q, tailq) {
    printf(" %d", p->datum);
}
puts("");

If you want to iterate over the list while removing all its elements, it is probably easier to use a while loop and use the TAILQ_EMPTY and TAILQ_FIRST macros.

while (!TAILQ_EMPTY(&q)) {
    p = TAILQ_FIRST(&q);
    TAILQ_REMOVE(&q, p, tailq);
    /* ... */
}

The above code was mostly taken verbatim from an example I wrote and tested on IDEONE.

like image 56
jxh Avatar answered Oct 25 '22 10:10

jxh