diff options
author | Peter Xu <peterx@redhat.com> | 2018-03-05 14:43:22 +0800 |
---|---|---|
committer | Daniel P. Berrangé <berrange@redhat.com> | 2018-03-06 10:19:05 +0000 |
commit | a17536c594bfed94d05667b419f747b692f5fc7f (patch) | |
tree | 6e623ad270bb97e1eae6685e32d80e110b55247a /io | |
parent | 938c8b79e5249d41469151e30268cfaf88bdb588 (diff) | |
download | qemu-a17536c594bfed94d05667b419f747b692f5fc7f.zip qemu-a17536c594bfed94d05667b419f747b692f5fc7f.tar.gz qemu-a17536c594bfed94d05667b419f747b692f5fc7f.tar.bz2 |
qio: non-default context for threaded qtask
qio_task_run_in_thread() allows main thread to run blocking operations
in the background. However it has an assumption on that it's always
working with the default context. This patch tries to allow the threaded
QIO task framework to run with non-default gcontext.
Currently no functional change so far, so the QIOTasks are still always
running on main context.
Reviewed-by: Daniel P. Berrange <berrange@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Diffstat (limited to 'io')
-rw-r--r-- | io/channel-socket.c | 9 | ||||
-rw-r--r-- | io/dns-resolver.c | 3 | ||||
-rw-r--r-- | io/task.c | 20 |
3 files changed, 26 insertions, 6 deletions
diff --git a/io/channel-socket.c b/io/channel-socket.c index 8359b66..b4d914b 100644 --- a/io/channel-socket.c +++ b/io/channel-socket.c @@ -188,7 +188,8 @@ void qio_channel_socket_connect_async(QIOChannelSocket *ioc, qio_task_run_in_thread(task, qio_channel_socket_connect_worker, addrCopy, - (GDestroyNotify)qapi_free_SocketAddress); + (GDestroyNotify)qapi_free_SocketAddress, + NULL); } @@ -246,7 +247,8 @@ void qio_channel_socket_listen_async(QIOChannelSocket *ioc, qio_task_run_in_thread(task, qio_channel_socket_listen_worker, addrCopy, - (GDestroyNotify)qapi_free_SocketAddress); + (GDestroyNotify)qapi_free_SocketAddress, + NULL); } @@ -322,7 +324,8 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc, qio_task_run_in_thread(task, qio_channel_socket_dgram_worker, data, - qio_channel_socket_dgram_worker_free); + qio_channel_socket_dgram_worker_free, + NULL); } diff --git a/io/dns-resolver.c b/io/dns-resolver.c index 8c92407..187f725 100644 --- a/io/dns-resolver.c +++ b/io/dns-resolver.c @@ -234,7 +234,8 @@ void qio_dns_resolver_lookup_async(QIODNSResolver *resolver, qio_task_run_in_thread(task, qio_dns_resolver_lookup_worker, data, - qio_dns_resolver_lookup_data_free); + qio_dns_resolver_lookup_data_free, + NULL); } @@ -77,6 +77,7 @@ struct QIOTaskThreadData { QIOTaskWorker worker; gpointer opaque; GDestroyNotify destroy; + GMainContext *context; }; @@ -91,6 +92,10 @@ static gboolean qio_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 qio_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(qio_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, |