[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC] potential risk for macro QTAILQ_INSERT_BEFORE
From: |
Wayne Xia |
Subject: |
Re: [Qemu-devel] [RFC] potential risk for macro QTAILQ_INSERT_BEFORE |
Date: |
Thu, 29 Sep 2011 10:08:32 +0800 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.23) Gecko/20110920 Thunderbird/3.1.15 |
δΊ 2011-9-28 16:43, Jan Kiszka ει:
> On 2011-09-28 05:38, Wayne Xia wrote:
>> Hi, during my coding, I found macro a bit different from other
>> QTAIL macros.
>>
>> QTAILQ_INSERT_AFTER was defined as:
>> -----------------------------------------------------------
>> #define QTAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
>> if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
>> (elm)->field.tqe_next->field.tqe_prev = \
>> &(elm)->field.tqe_next; \
>> else \
>> (head)->tqh_last =&(elm)->field.tqe_next; \
>> (listelm)->field.tqe_next = (elm); \
>> (elm)->field.tqe_prev =&(listelm)->field.tqe_next; \
>> } while (/*CONSTCOND*/0)
>> ---------------------------------------------------------
>> QTAILQ_INSERT_BEFORE is defined as following:
>>
>> #define QTAILQ_INSERT_BEFORE(listelm, elm, field) do {
>> (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
>> (elm)->field.tqe_next = (listelm); \
>> *(listelm)->field.tqe_prev = (elm); \
>> (listelm)->field.tqe_prev =&(elm)->field.tqe_next; \
>> } while (/*CONSTCOND*/0)
>> ----------------------------------------------------------
>>
>> It did not take care of "head" as QTAILQ_INSERT_AFTER did, so I am
>> wondering what would happen if I use QTAILQ_INSERT_BEFORE to insert one
>> element to a queue that have only one element in it, would it happen
>> that the queue head pointer is not updated and the real first element
>> is lost? Currently some codes in qemu have used this macro.
>
> The code is fine: a QTAILQ head consists of a dummy entry element that
> looks for the first element as if a normal element would precede it. In
> contrast, there is no dummy "end element", the last one just points to
> NULL. Therefore we need to handle this separately.
Thanks Jan, made a test program showing the macro is OK, the dummy
element works like a magic.
>
> Jan
>
--
Best Regards
Wayne Xia
mail:address@hidden
tel:86-010-82450803