From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40763) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bv7Oc-0007k9-DW for qemu-devel@nongnu.org; Fri, 14 Oct 2016 14:39:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bv7Ob-0004Ps-AZ for qemu-devel@nongnu.org; Fri, 14 Oct 2016 14:39:54 -0400 Date: Fri, 14 Oct 2016 14:39:11 -0400 (EDT) From: Paolo Bonzini Message-ID: <1393181308.3689495.1476470351686.JavaMail.zimbra@redhat.com> In-Reply-To: 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> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit 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: Jianjun Duan 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 > > 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); 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 > > > >