From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48707) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bv9l6-0000XI-8e for qemu-devel@nongnu.org; Fri, 14 Oct 2016 17:11:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bv9l1-00089e-SQ for qemu-devel@nongnu.org; Fri, 14 Oct 2016 17:11:15 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:59357) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1bv9l1-00089I-KD for qemu-devel@nongnu.org; Fri, 14 Oct 2016 17:11:11 -0400 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.17/8.16.0.17) with SMTP id u9EL9kNn087514 for ; Fri, 14 Oct 2016 17:11:09 -0400 Received: from e37.co.us.ibm.com (e37.co.us.ibm.com [32.97.110.158]) by mx0a-001b2d01.pphosted.com with ESMTP id 262ywk2ukr-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 14 Oct 2016 17:11:09 -0400 Received: from localhost by e37.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 14 Oct 2016 15:11:08 -0600 References: <1476394254-7987-1-git-send-email-duanj@linux.vnet.ibm.com> <1476394254-7987-3-git-send-email-duanj@linux.vnet.ibm.com> <20161014104447.GC2030@work-vm> <897cd09c-dc83-202d-52af-8df381b967f2@redhat.com> <1393181308.3689495.1476470351686.JavaMail.zimbra@redhat.com> From: Jianjun Duan Date: Fri, 14 Oct 2016 14:10:59 -0700 MIME-Version: 1.0 In-Reply-To: <1393181308.3689495.1476470351686.JavaMail.zimbra@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Message-Id: <3afa5c92-f1a5-ee06-ace4-906995f9aa21@linux.vnet.ibm.com> Subject: Re: [Qemu-devel] [Qemu-ppc] [QEMU PATCH v6 2/2] migration: migrate QTAILQ List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: "Dr. David Alan Gilbert" , qemu-devel@nongnu.org, qemu-ppc@nongnu.org, dmitry@daynix.com, peter maydell , kraxel@redhat.com, mst@redhat.com, david@gibson.dropbear.id.au, veroniabahaa@gmail.com, quintela@redhat.com, amit shah , mreitz@redhat.com, kwolf@redhat.com, rth@twiddle.net, aurelien@aurel32.net, leon alrae , blauwirbel@gmail.com, mark cave-ayland , mdroth@linux.vnet.ibm.com On 10/14/2016 11:39 AM, Paolo Bonzini wrote: > >>> Another possibility is a macro like >>> >>> #define field_at_offset(base, offset, type) \ >>> ((type) (((char *) (base)) + (offset))) >>> >>> so that you can do >>> >>> *field_at_offset(void **, elm, (entry) + QTAILQ_NEXT_OFFSET) = NULL; >>> *field_at_offset(void ***, elm, (entry) + QTAILQ_PREV_OFFSET) = >>> *field_at_offset(void ***, head, QTAILQ_LAST_OFFSET); >>> **field_at_offset(void ***, head, QTAILQ_LAST_OFFSET) = (elm); >>> *field_at_offset(void ***, head, QTAILQ_LAST_OFFSET) = >>> field_at_offset(void **, elm, (entry) + QTAILQ_NEXT_OFFSET); >> >> The thing is that we don't know type at all. So only the offset values >> is used. This is intended for QTAILQ of any type. > > Sure, my code is identical to yours---just with more macros for readability, > and a little more type-safe. Another possibility: > > #define QTAILQ_RAW_NEXT(elm, entry) \ > (*field_at_offset(void **, elm, (entry) + QTAILQ_NEXT_OFFSET)) > #define QTAILQ_RAW_PREV(elm, entry) \ > (*field_at_offset(void ***, elm, (entry) + QTAILQ_PREV_OFFSET)) > #define QTAILQ_RAW_LAST(head) \ > (*field_at_offset(void ***, head, QTAILQ_LAST_OFFSET)) > > QTAILQ_RAW_NEXT(elm, entry) = NULL; > QTAILQ_RAW_PREV(elm, entry) = QTAILQ_RAW_LAST(head); > *QTAILQ_RAW_LAST(head) = (elm); > QTAILQ_RAW_LAST(head) = &QTAILQ_RAW_NEXT(elm, entry); > You are right. The readability can be approved. Thanks, Jianjun > Thanks, > > Paolo > >> Thanks, >> Jianjun >> >>> >>> or something like that (note that I've always used the same type for >>> next and last, by the way). >>> >>> Paolo >>> >> >> >