From patchwork Fri Jan 13 16:34:03 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 135928 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 0D4A4B6F65 for ; Sat, 14 Jan 2012 03:58:06 +1100 (EST) Received: from localhost ([::1]:50313 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rlk5u-0006fQ-FM for incoming@patchwork.ozlabs.org; Fri, 13 Jan 2012 11:35:10 -0500 Received: from eggs.gnu.org ([140.186.70.92]:35099) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rlk5C-0004RG-Sa for qemu-devel@nongnu.org; Fri, 13 Jan 2012 11:34:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Rlk57-0007AC-5i for qemu-devel@nongnu.org; Fri, 13 Jan 2012 11:34:26 -0500 Received: from mail-yx0-f173.google.com ([209.85.213.173]:33564) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rlk57-00079B-1n for qemu-devel@nongnu.org; Fri, 13 Jan 2012 11:34:21 -0500 Received: by mail-yx0-f173.google.com with SMTP id l8so376293yen.4 for ; Fri, 13 Jan 2012 08:34:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=sender:from:to:subject:date:message-id:x-mailer:in-reply-to :references; bh=RlHn9FyRok7Valu9kCPK7BoJU1GPs+Q/hJs1PL4FQKk=; b=GxtNZO8yBXRLRLm0AhlbUcizx7kVhpmbpX94huNasjgpInJ2mbWjs6qn4Rc3xkUVpA qt595hn2MbI+qSlTu/KnmDN2B392xVeBejw7h9NFJOT6Q1WnOVoXYwaYmvUyXcfe3eSn KXU0NYxBh6H8RynrgOtrnyto+JYCOQOrcvjzk= Received: by 10.236.140.36 with SMTP id d24mr2765729yhj.84.1326472460751; Fri, 13 Jan 2012 08:34:20 -0800 (PST) Received: from localhost.localdomain (93-34-200-238.ip51.fastwebnet.it. [93.34.200.238]) by mx.google.com with ESMTPS id c44sm15349825yhm.5.2012.01.13.08.34.18 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 13 Jan 2012 08:34:19 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 13 Jan 2012 17:34:03 +0100 Message-Id: <1326472445-25966-4-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.7.1 In-Reply-To: <1326472445-25966-1-git-send-email-pbonzini@redhat.com> References: <1326472445-25966-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.213.173 Subject: [Qemu-devel] [PATCH v2 3/5] qemu-queue: drop QCIRCLEQ X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org The main advantage of circular lists (the fact that the head node has the same memory layout as any other node) is completely negated by the implementation in qemu-queue.h. Not surprisingly, nobody uses QCIRCLEQ. While this might change if RCU is ever adopted by QEMU, the QLIST is also RCU-friendly and in fact it is used in a RCU-like manner by 9pfs already. So, just kill QCIRCLEQ. Signed-off-by: Paolo Bonzini --- qemu-queue.h | 122 +-------------------------------------------------------- 1 files changed, 3 insertions(+), 119 deletions(-) diff --git a/qemu-queue.h b/qemu-queue.h index 6021057..92df809 100644 --- a/qemu-queue.h +++ b/qemu-queue.h @@ -3,7 +3,7 @@ /* * Qemu version: Copy from netbsd, removed debug code, removed some of * the implementations. Left in singly-linked lists, lists, simple - * queues, tail queues and circular queues. + * queues, and tail queues. */ /* @@ -41,8 +41,8 @@ #define QEMU_SYS_QUEUE_H_ /* - * This file defines five types of data structures: singly-linked lists, - * lists, simple queues, tail queues, and circular queues. + * This file defines four types of data structures: singly-linked lists, + * lists, simple queues, and tail queues. * * A singly-linked list is headed by a single forward pointer. The * elements are singly linked for minimum space and pointer manipulation @@ -75,14 +75,6 @@ * after an existing element, at the head of the list, or at the end of * the list. A tail queue may be traversed in either direction. * - * A circle queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or after - * an existing element, at the head of the list, or at the end of the list. - * A circle queue may be traversed in either direction, but has a more - * complex end of list detection. - * * For details on the use of these macros, see the queue(3) manual page. */ @@ -432,112 +424,4 @@ struct { \ #define QTAILQ_PREV(elm, headname, field) \ (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) - -/* - * Circular queue definitions. - */ -#define QCIRCLEQ_HEAD(name, type) \ -struct name { \ - struct type *cqh_first; /* first element */ \ - struct type *cqh_last; /* last element */ \ -} - -#define QCIRCLEQ_HEAD_INITIALIZER(head) \ - { (void *)&head, (void *)&head } - -#define QCIRCLEQ_ENTRY(type) \ -struct { \ - struct type *cqe_next; /* next element */ \ - struct type *cqe_prev; /* previous element */ \ -} - -/* - * Circular queue functions. - */ -#define QCIRCLEQ_INIT(head) do { \ - (head)->cqh_first = (void *)(head); \ - (head)->cqh_last = (void *)(head); \ -} while (/*CONSTCOND*/0) - -#define QCIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ - (elm)->field.cqe_next = (listelm)->field.cqe_next; \ - (elm)->field.cqe_prev = (listelm); \ - if ((listelm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (listelm)->field.cqe_next->field.cqe_prev = (elm); \ - (listelm)->field.cqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define QCIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ - (elm)->field.cqe_next = (listelm); \ - (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ - if ((listelm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (listelm)->field.cqe_prev->field.cqe_next = (elm); \ - (listelm)->field.cqe_prev = (elm); \ -} while (/*CONSTCOND*/0) - -#define QCIRCLEQ_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.cqe_next = (head)->cqh_first; \ - (elm)->field.cqe_prev = (void *)(head); \ - if ((head)->cqh_last == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (head)->cqh_first->field.cqe_prev = (elm); \ - (head)->cqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define QCIRCLEQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.cqe_next = (void *)(head); \ - (elm)->field.cqe_prev = (head)->cqh_last; \ - if ((head)->cqh_first == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (head)->cqh_last->field.cqe_next = (elm); \ - (head)->cqh_last = (elm); \ -} while (/*CONSTCOND*/0) - -#define QCIRCLEQ_REMOVE(head, elm, field) do { \ - if ((elm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm)->field.cqe_prev; \ - else \ - (elm)->field.cqe_next->field.cqe_prev = \ - (elm)->field.cqe_prev; \ - if ((elm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm)->field.cqe_next; \ - else \ - (elm)->field.cqe_prev->field.cqe_next = \ - (elm)->field.cqe_next; \ -} while (/*CONSTCOND*/0) - -#define QCIRCLEQ_FOREACH(var, head, field) \ - for ((var) = ((head)->cqh_first); \ - (var) != (const void *)(head); \ - (var) = ((var)->field.cqe_next)) - -#define QCIRCLEQ_FOREACH_REVERSE(var, head, field) \ - for ((var) = ((head)->cqh_last); \ - (var) != (const void *)(head); \ - (var) = ((var)->field.cqe_prev)) - -/* - * Circular queue access methods. - */ -#define QCIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) -#define QCIRCLEQ_FIRST(head) ((head)->cqh_first) -#define QCIRCLEQ_LAST(head) ((head)->cqh_last) -#define QCIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) -#define QCIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) - -#define QCIRCLEQ_LOOP_NEXT(head, elm, field) \ - (((elm)->field.cqe_next == (void *)(head)) \ - ? ((head)->cqh_first) \ - : (elm->field.cqe_next)) -#define QCIRCLEQ_LOOP_PREV(head, elm, field) \ - (((elm)->field.cqe_prev == (void *)(head)) \ - ? ((head)->cqh_last) \ - : (elm->field.cqe_prev)) - #endif /* !QEMU_SYS_QUEUE_H_ */