From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34523) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZtFaL-000059-R6 for qemu-devel@nongnu.org; Mon, 02 Nov 2015 08:55:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZtFaH-0002Aj-PL for qemu-devel@nongnu.org; Mon, 02 Nov 2015 08:55:45 -0500 References: <1446044465-19312-1-git-send-email-den@openvz.org> <1446044465-19312-2-git-send-email-den@openvz.org> <20151030154135.GA16864@stefanha-x1.localdomain> <563619E7.9060305@openvz.org> <20151102131236.GC10139@stefanha-x1.localdomain> <563767A5.5030801@openvz.org> From: Paolo Bonzini Message-ID: <56376B57.3090806@redhat.com> Date: Mon, 2 Nov 2015 14:55:35 +0100 MIME-Version: 1.0 In-Reply-To: <563767A5.5030801@openvz.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/4] fifolock: create rfifolock_is_locked helper List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Denis V. Lunev" , Stefan Hajnoczi Cc: qemu-devel@nongnu.org, Stefan Hajnoczi , qemu-stable@nongnu.org On 02/11/2015 14:39, Denis V. Lunev wrote: >> This is thread-safe: >> >> bool owner; >> >> qemu_mutex_lock(&r->lock); >> owner = r->nesting > 0 && qemu_thread_is_self(&r->owner_thread); >> qemu_mutex_unlock(&r->lock); >> >> return owner; > yep, I know. > > But I do not want to take the lock for check. You can use a trylock. If it fails, it is definitely safe to return false. > IMHO it would be better to > > @@ -68,11 +68,16 @@ void rfifolock_lock(RFifoLock *r) > void rfifolock_unlock(RFifoLock *r) > { > qemu_mutex_lock(&r->lock); > - assert(r->nesting > 0); > - assert(qemu_thread_is_self(&r->owner_thread)); > + assert(rfifolock_is_owner(r)); > if (--r->nesting == 0) { > + qemu_thread_clear(&r->owner_thread); > r->head++; > qemu_cond_broadcast(&r->cond); > } > qemu_mutex_unlock(&r->lock); > } > + > +bool rfifolock_is_owner(RFifoLock *r) > +{ > + return r->nesting > 0 && qemu_thread_is_self(&r->owner_thread); > +} > > which does not require lock and thread safe. I think it requires memory barriers though. But it can be simplified: if you clear owner_thread, you do not need to check r->nesting in rfifolock_is_owner. Clearing owner_thread can be done with a simple memset. Paolo