From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47822) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VUcsh-0008IT-A0 for qemu-devel@nongnu.org; Fri, 11 Oct 2013 09:35:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VUcsZ-0001Kb-KE for qemu-devel@nongnu.org; Fri, 11 Oct 2013 09:35:51 -0400 Received: from mx1.redhat.com ([209.132.183.28]:25871) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VUcsZ-0001KN-53 for qemu-devel@nongnu.org; Fri, 11 Oct 2013 09:35:43 -0400 Date: Fri, 11 Oct 2013 15:35:38 +0200 From: Stefan Hajnoczi Message-ID: <20131011133538.GA22465@stefanha-thinkpad.redhat.com> References: <1381312531-28723-1-git-send-email-stefanha@redhat.com> <1381312531-28723-2-git-send-email-stefanha@redhat.com> <5257BD03.6010808@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5257BD03.6010808@linux.vnet.ibm.com> Subject: Re: [Qemu-devel] [PATCH 1/2] rfifolock: add recursive FIFO lock List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Wenchao Xia Cc: Kevin Wolf , Paolo Bonzini , qemu-devel@nongnu.org, Michael Roth On Fri, Oct 11, 2013 at 04:55:31PM +0800, Wenchao Xia wrote: > > +/* Recursive FIFO lock > > + * > > + * This lock provides more features than a plain mutex: > > + * > > + * 1. Fairness - enforces FIFO order. > > + * 2. Nesting - can be taken recursively. > > + * 3. Contention callback - optional, called when thread must wait. > > + * > > + * The recursive FIFO lock is heavyweight so prefer other synchronization > > + * primitives if you do not need its features. > > + */ > > +typedef struct { > > + QemuMutex lock; /* protects all fields */ > > + > > + /* FIFO order */ > > + unsigned int head; /* active ticket number */ > > + unsigned int tail; /* waiting ticket number */ > > + QemuCond cond; /* used to wait for our ticket number */ > > + > > + /* Nesting */ > > + QemuThread owner_thread; /* thread that currently has ownership */ > > + unsigned int nesting; /* amount of nesting levels */ > > + > > + /* Contention callback */ > > + void (*cb)(void *); /* called when thread must wait, with ->lock > > + * held so it may not recursively lock/unlock > > + */ > > + void *cb_opaque; > > +} RFifoLock; > > + > If you respin, the define can be moved to util/rfifolock.c, leave > typedef struct RFifoLock RFifoLock; > in header. Then the struct cannot be embedded as a field, it would require heap allocation of all RFifoLocks. This is why I chose to include the definition in the header file. Stefan