From nobody Mon Feb 9 23:40:12 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 155007584471729.836513739121642; Wed, 13 Feb 2019 08:37:24 -0800 (PST) Received: from localhost ([127.0.0.1]:59798 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtxXC-0001Mg-KN for importer@patchew.org; Wed, 13 Feb 2019 11:37:18 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39214) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtxG6-00045e-Fv for qemu-devel@nongnu.org; Wed, 13 Feb 2019 11:19:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtxG2-0005K5-4a for qemu-devel@nongnu.org; Wed, 13 Feb 2019 11:19:38 -0500 Received: from mx1.redhat.com ([209.132.183.28]:57042) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gtxG1-0005B7-F6 for qemu-devel@nongnu.org; Wed, 13 Feb 2019 11:19:33 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BB03BC06A81A; Wed, 13 Feb 2019 16:19:21 +0000 (UTC) Received: from localhost (ovpn-112-60.ams2.redhat.com [10.36.112.60]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2418260BE2; Wed, 13 Feb 2019 16:19:20 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Wed, 13 Feb 2019 17:18:51 +0100 Message-Id: <20190213161913.22107-4-marcandre.lureau@redhat.com> In-Reply-To: <20190213161913.22107-1-marcandre.lureau@redhat.com> References: <20190213161913.22107-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Wed, 13 Feb 2019 16:19:21 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL v2 03/25] io: store reference to thread information in the QIOTask struct X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Daniel P. Berrang=C3=A9 Currently the struct QIOTaskThreadData is only needed by the worker thread, but a subsequent patch will need to access it from another context. Signed-off-by: Daniel P. Berrang=C3=A9 Message-Id: <20190211182442.8542-2-berrange@redhat.com> Signed-off-by: Marc-Andr=C3=A9 Lureau --- io/task.c | 64 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/io/task.c b/io/task.c index 2886a2c1bc..396866b10f 100644 --- a/io/task.c +++ b/io/task.c @@ -24,6 +24,14 @@ #include "qemu/thread.h" #include "trace.h" =20 +struct QIOTaskThreadData { + QIOTaskWorker worker; + gpointer opaque; + GDestroyNotify destroy; + GMainContext *context; +}; + + struct QIOTask { Object *source; QIOTaskFunc func; @@ -32,6 +40,7 @@ struct QIOTask { Error *err; gpointer result; GDestroyNotify destroyResult; + struct QIOTaskThreadData *thread; }; =20 =20 @@ -57,6 +66,18 @@ QIOTask *qio_task_new(Object *source, =20 static void qio_task_free(QIOTask *task) { + if (task->thread) { + if (task->thread->destroy) { + task->thread->destroy(task->thread->opaque); + } + + if (task->thread->context) { + g_main_context_unref(task->thread->context); + } + + g_free(task->thread); + } + if (task->destroy) { task->destroy(task->opaque); } @@ -72,31 +93,12 @@ static void qio_task_free(QIOTask *task) } =20 =20 -struct QIOTaskThreadData { - QIOTask *task; - QIOTaskWorker worker; - gpointer opaque; - GDestroyNotify destroy; - GMainContext *context; -}; - - static gboolean qio_task_thread_result(gpointer opaque) { - struct QIOTaskThreadData *data =3D opaque; + QIOTask *task =3D opaque; =20 - trace_qio_task_thread_result(data->task); - qio_task_complete(data->task); - - if (data->destroy) { - data->destroy(data->opaque); - } - - if (data->context) { - g_main_context_unref(data->context); - } - - g_free(data); + trace_qio_task_thread_result(task); + qio_task_complete(task); =20 return FALSE; } @@ -104,22 +106,23 @@ static gboolean qio_task_thread_result(gpointer opaqu= e) =20 static gpointer qio_task_thread_worker(gpointer opaque) { - struct QIOTaskThreadData *data =3D opaque; + QIOTask *task =3D opaque; GSource *idle; =20 - trace_qio_task_thread_run(data->task); - data->worker(data->task, data->opaque); + trace_qio_task_thread_run(task); + + task->thread->worker(task, task->thread->opaque); =20 /* We're running in the background thread, and must only * ever report the task results in the main event loop * thread. So we schedule an idle callback to report * the worker results */ - trace_qio_task_thread_exit(data->task); + trace_qio_task_thread_exit(task); =20 idle =3D g_idle_source_new(); - g_source_set_callback(idle, qio_task_thread_result, data, NULL); - g_source_attach(idle, data->context); + g_source_set_callback(idle, qio_task_thread_result, task, NULL); + g_source_attach(idle, task->thread->context); =20 return NULL; } @@ -138,17 +141,18 @@ void qio_task_run_in_thread(QIOTask *task, g_main_context_ref(context); } =20 - data->task =3D task; data->worker =3D worker; data->opaque =3D opaque; data->destroy =3D destroy; data->context =3D context; =20 + task->thread =3D data; + trace_qio_task_thread_start(task, worker, opaque); qemu_thread_create(&thread, "io-task-worker", qio_task_thread_worker, - data, + task, QEMU_THREAD_DETACHED); } =20 --=20 2.21.0.rc0.1.g036caf7885