δΊ 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:xiaw...@linux.vnet.ibm.com tel:86-010-82450803