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. Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux