From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:45088) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R8kzC-00062I-5A for qemu-devel@nongnu.org; Tue, 27 Sep 2011 23:39:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R8kzA-0005Ws-WE for qemu-devel@nongnu.org; Tue, 27 Sep 2011 23:39:06 -0400 Received: from e23smtp03.au.ibm.com ([202.81.31.145]:57216) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R8kzA-0005WF-An for qemu-devel@nongnu.org; Tue, 27 Sep 2011 23:39:04 -0400 Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [202.81.31.245]) by e23smtp03.au.ibm.com (8.14.4/8.13.1) with ESMTP id p8S3XKIt027872 for ; Wed, 28 Sep 2011 13:33:20 +1000 Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p8S3cmGL2482300 for ; Wed, 28 Sep 2011 13:38:51 +1000 Received: from d23av03.au.ibm.com (loopback [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p8S3cmdF024876 for ; Wed, 28 Sep 2011 13:38:48 +1000 Received: from [127.0.0.1] ([9.115.122.21]) by d23av03.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id p8S3cjw1024254 for ; Wed, 28 Sep 2011 13:38:47 +1000 Message-ID: <4E8296A1.1000407@linux.vnet.ibm.com> Date: Wed, 28 Sep 2011 11:38:09 +0800 From: Wayne Xia MIME-Version: 1.0 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [RFC] potential risk for macro QTAILQ_INSERT_BEFORE List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org 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. -- Best Regards Wayne Xia mail:xiawenc@linux.vnet.ibm.com tel:86-010-82450803