mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33:54 -06:00
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>
This commit is contained in:
parent
938c8b79e5
commit
a17536c594
5 changed files with 33 additions and 8 deletions
20
io/task.c
20
io/task.c
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue