This is the mail archive of the
libc-help@sourceware.org
mailing list for the glibc project.
Re: question about queue.h
- From: walter harms <wharms at bfs dot de>
- To: Bert Wesarg <bert dot wesarg at googlemail dot com>
- Cc: "Sadashiiv, Halesh" <halesh dot sadashiv at ap dot sony dot com>,libc-help at sourceware dot org
- Date: Wed, 16 Jul 2008 19:04:07 +0200
- Subject: Re: question about queue.h
- References: <7B7EF7F090B9804A830ACC82F2CDE95D3783E6@insardxms01.ap.sony.com> <487B4A12.4030709@bfs.de> <36ca99e90807141012o65ee3961j2a2a37572d4adf23@mail.gmail.com>
- Reply-to: wharms at bfs dot de
Bert Wesarg wrote:
> Hi,
>
> On Mon, Jul 14, 2008 at 14:44, walter harms <wharms@bfs.de> wrote:
>> why should i need a 'previous next element' ? That is the current element. IMHO that is useless.
>> i guess: in the beginning that was a "typo" and somebody fixed the comment.
> No. Have you tried to compile a program with your proposed fix? I
> suggest not, because you would get compile errors.
>
> If you would have read the queue.h file from the beginning, you may
> have stumble over this:
>
> * A list is headed by a single forward pointer (or an array of forward
> * pointers for a hash table header). The elements are doubly linked
> * so that an arbitrary element can be removed without a need to
> * traverse the list. New elements can be added to the list before
> * or after an existing element or at the head of the list. A list
> * may only be traversed in the forward direction.
>
> So, the LIST is a list, which provides O(1) insertion and deletion,
> but only forward traversal. To achieve this, you only need the
> reference to the previously next pointer, which is exactly what is
> implemented.
of cause i read the statement but obviously i did not understand it.
I have a double linked list what is supposed to be used in one
direction. Who needs that ?
later versions of queue.h (e.g. http://freebsd.active-venture.com/FreeBSD-srctree/newsrc/sys/queue.h.html)
have a single linked list and more. there is also remque() and insque().
i am not sure what should i make from this situation. perhaps i will continue
rewriting the macros and later merge them with insque().
if someone is interessted in lists he/she may like to take a look at this thread.
linked lists that can run in shared mem.
http://ml.osdir.com/os.freebsd.architechture/2002-11/msg00054.html
ntl i would like to thank all people trying to explain this unusual configuration.
re,
wh
>
> For example in the LIST_INSERT_AFTER macro, the last line:
>
> (elm)->field.le_prev = &(listelm)->field.le_next;
>
> You see, you store the reference to the le_next field into the le_prev field.
>
> Or in the LIST_INSERT_BEFORE macro:
>
> *(listelm)->field.le_prev = (elm);
>
> you dereference the le_prev file and get store a new value for this
> le_next field.
>
> But best shown in the LIST_REMOVE macro:
>
> *(elm)->field.le_prev = (elm)->field.le_next;
>
> you bend the le_next pointer behind your le_prev pointer to your
> le_next pointer.
>
> regards
> Bert
>
>> re,
>> wh
>
>