diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2018-03-08 11:26:13 +0000 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2018-03-08 11:26:14 +0000 |
| commit | 3ef91576b96de7051dacc2132cddfb486b46e863 (patch) | |
| tree | 8ae5b6109272dfc7ae177cb086b2afaaac7bd12b /io/task.c | |
| parent | 854a4436dd313eaeb51c275d00526d60437915d2 (diff) | |
| parent | 1939ccdaa61ce6a1f57d83277b3d41d3a9ad3c58 (diff) | |
| download | focaccia-qemu-3ef91576b96de7051dacc2132cddfb486b46e863.tar.gz focaccia-qemu-3ef91576b96de7051dacc2132cddfb486b46e863.zip | |
Merge remote-tracking branch 'remotes/berrange/tags/qio-next-pull-request' into staging
# gpg: Signature made Wed 07 Mar 2018 11:24:41 GMT
# gpg: using RSA key BE86EBB415104FDF
# gpg: Good signature from "Daniel P. Berrange <dan@berrange.com>"
# gpg: aka "Daniel P. Berrange <berrange@redhat.com>"
# Primary key fingerprint: DAF3 A6FD B26B 6291 2D0E 8E3F BE86 EBB4 1510 4FDF
* remotes/berrange/tags/qio-next-pull-request:
qio: non-default context for TLS handshake
qio: non-default context for async conn
qio: non-default context for threaded qtask
qio: store gsources for net listeners
qio: introduce qio_channel_add_watch_{full|source}
qio: rename qio_task_thread_result
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'io/task.c')
| -rw-r--r-- | io/task.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/io/task.c b/io/task.c index 3ce556017c..2886a2c1bc 100644 --- a/io/task.c +++ b/io/task.c @@ -77,10 +77,11 @@ struct QIOTaskThreadData { QIOTaskWorker worker; gpointer opaque; GDestroyNotify destroy; + GMainContext *context; }; -static gboolean gio_task_thread_result(gpointer opaque) +static gboolean qio_task_thread_result(gpointer opaque) { struct QIOTaskThreadData *data = opaque; @@ -91,6 +92,10 @@ static gboolean gio_task_thread_result(gpointer opaque) data->destroy(data->opaque); } + if (data->context) { + g_main_context_unref(data->context); + } + g_free(data); return FALSE; @@ -100,6 +105,7 @@ static gboolean gio_task_thread_result(gpointer opaque) static gpointer qio_task_thread_worker(gpointer opaque) { struct QIOTaskThreadData *data = opaque; + GSource *idle; trace_qio_task_thread_run(data->task); data->worker(data->task, data->opaque); @@ -110,7 +116,11 @@ static gpointer qio_task_thread_worker(gpointer opaque) * the worker results */ trace_qio_task_thread_exit(data->task); - g_idle_add(gio_task_thread_result, data); + + idle = g_idle_source_new(); + g_source_set_callback(idle, qio_task_thread_result, data, NULL); + g_source_attach(idle, data->context); + return NULL; } @@ -118,15 +128,21 @@ static gpointer qio_task_thread_worker(gpointer opaque) void qio_task_run_in_thread(QIOTask *task, QIOTaskWorker worker, gpointer opaque, - GDestroyNotify destroy) + GDestroyNotify destroy, + GMainContext *context) { struct QIOTaskThreadData *data = g_new0(struct QIOTaskThreadData, 1); QemuThread thread; + if (context) { + g_main_context_ref(context); + } + data->task = task; data->worker = worker; data->opaque = opaque; data->destroy = destroy; + data->context = context; trace_qio_task_thread_start(task, worker, opaque); qemu_thread_create(&thread, |