qemu-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]