From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33710) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YL8UP-0003Y4-Pc for qemu-devel@nongnu.org; Tue, 10 Feb 2015 05:56:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YL8UH-00076h-8g for qemu-devel@nongnu.org; Tue, 10 Feb 2015 05:56:21 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52597) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YL8UH-00076Y-0t for qemu-devel@nongnu.org; Tue, 10 Feb 2015 05:56:13 -0500 Message-ID: <54D9E3BF.1090109@redhat.com> Date: Tue, 10 Feb 2015 11:55:59 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <1423564888-14933-1-git-send-email-kwolf@redhat.com> <1423564888-14933-3-git-send-email-kwolf@redhat.com> In-Reply-To: <1423564888-14933-3-git-send-email-kwolf@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH 2/3] coroutine: Clean up qemu_coroutine_enter() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf , qemu-devel@nongnu.org Cc: famz@redhat.com, wu.wubin@huawei.com, stefanha@redhat.com On 10/02/2015 11:41, Kevin Wolf wrote: > + ret = qemu_coroutine_switch(self, co, COROUTINE_ENTER); > + > + qemu_co_queue_run_restart(co); > + > + switch (ret) { > + case COROUTINE_YIELD: > + return; > + case COROUTINE_TERMINATE: > + trace_qemu_coroutine_terminate(co); > + coroutine_delete(co); > + return; > + default: Say you have: co1 co2 ------------------------------------------------------------------------ 1 qemu_co_mutex_lock(&m); 2 qemu_coroutine_yield(); 3 qemu_co_mutex_lock(&m); 4 qemu_co_mutex_unlock(&m); 5 qemu_coroutine_yield(); Then you have: 1 mutex->locked = true; 2 coroutine_swap(co1, leader, COROUTINE_YIELD); 3 while (mutex->locked) { qemu_co_queue_wait(&mutex->queue); '--> QTAILQ_INSERT_TAIL(&queue->entries, self, co_queue_next); qemu_coroutine_yield(); '--> coroutine_swap(co2, leader, COROUTINE_YIELD); } 4 mutex->locked = false; qemu_co_queue_next(&mutex->queue); '--> qemu_co_queue_do_restart(queue, true); '--> QTAILQ_REMOVE(&queue->entries, next, co_queue_next); QTAILQ_INSERT_TAIL(&self->co_queue_wakeup, next, co_queue_next); 5 coroutine_swap(co1, leader, COROUTINE_YIELD); And co2 is never reentered until co1 terminates. Right? Paolo