Lines Matching refs:task
56 QIOTask *task; in qio_task_new() local
58 task = g_new0(QIOTask, 1); in qio_task_new()
60 task->source = source; in qio_task_new()
62 task->func = func; in qio_task_new()
63 task->opaque = opaque; in qio_task_new()
64 task->destroy = destroy; in qio_task_new()
65 qemu_mutex_init(&task->thread_lock); in qio_task_new()
66 qemu_cond_init(&task->thread_cond); in qio_task_new()
68 trace_qio_task_new(task, source, func, opaque); in qio_task_new()
70 return task; in qio_task_new()
73 static void qio_task_free(QIOTask *task) in qio_task_free() argument
75 qemu_mutex_lock(&task->thread_lock); in qio_task_free()
76 if (task->thread) { in qio_task_free()
77 if (task->thread->destroy) { in qio_task_free()
78 task->thread->destroy(task->thread->opaque); in qio_task_free()
81 if (task->thread->context) { in qio_task_free()
82 g_main_context_unref(task->thread->context); in qio_task_free()
85 g_free(task->thread); in qio_task_free()
88 if (task->destroy) { in qio_task_free()
89 task->destroy(task->opaque); in qio_task_free()
91 if (task->destroyResult) { in qio_task_free()
92 task->destroyResult(task->result); in qio_task_free()
94 if (task->err) { in qio_task_free()
95 error_free(task->err); in qio_task_free()
97 object_unref(task->source); in qio_task_free()
99 qemu_mutex_unlock(&task->thread_lock); in qio_task_free()
100 qemu_mutex_destroy(&task->thread_lock); in qio_task_free()
101 qemu_cond_destroy(&task->thread_cond); in qio_task_free()
103 g_free(task); in qio_task_free()
109 QIOTask *task = opaque; in qio_task_thread_result() local
111 trace_qio_task_thread_result(task); in qio_task_thread_result()
112 qio_task_complete(task); in qio_task_thread_result()
120 QIOTask *task = opaque; in qio_task_thread_worker() local
122 trace_qio_task_thread_run(task); in qio_task_thread_worker()
124 task->thread->worker(task, task->thread->opaque); in qio_task_thread_worker()
131 trace_qio_task_thread_exit(task); in qio_task_thread_worker()
133 qemu_mutex_lock(&task->thread_lock); in qio_task_thread_worker()
135 task->thread->completion = g_idle_source_new(); in qio_task_thread_worker()
136 g_source_set_callback(task->thread->completion, in qio_task_thread_worker()
137 qio_task_thread_result, task, NULL); in qio_task_thread_worker()
138 g_source_attach(task->thread->completion, in qio_task_thread_worker()
139 task->thread->context); in qio_task_thread_worker()
140 g_source_unref(task->thread->completion); in qio_task_thread_worker()
141 trace_qio_task_thread_source_attach(task, task->thread->completion); in qio_task_thread_worker()
143 qemu_cond_signal(&task->thread_cond); in qio_task_thread_worker()
144 qemu_mutex_unlock(&task->thread_lock); in qio_task_thread_worker()
150 void qio_task_run_in_thread(QIOTask *task, in qio_task_run_in_thread() argument
168 task->thread = data; in qio_task_run_in_thread()
170 trace_qio_task_thread_start(task, worker, opaque); in qio_task_run_in_thread()
174 task, in qio_task_run_in_thread()
179 void qio_task_wait_thread(QIOTask *task) in qio_task_wait_thread() argument
181 qemu_mutex_lock(&task->thread_lock); in qio_task_wait_thread()
182 g_assert(task->thread != NULL); in qio_task_wait_thread()
183 while (task->thread->completion == NULL) { in qio_task_wait_thread()
184 qemu_cond_wait(&task->thread_cond, &task->thread_lock); in qio_task_wait_thread()
187 trace_qio_task_thread_source_cancel(task, task->thread->completion); in qio_task_wait_thread()
188 g_source_destroy(task->thread->completion); in qio_task_wait_thread()
189 qemu_mutex_unlock(&task->thread_lock); in qio_task_wait_thread()
191 qio_task_thread_result(task); in qio_task_wait_thread()
195 void qio_task_complete(QIOTask *task) in qio_task_complete() argument
197 task->func(task, task->opaque); in qio_task_complete()
198 trace_qio_task_complete(task); in qio_task_complete()
199 qio_task_free(task); in qio_task_complete()
203 void qio_task_set_error(QIOTask *task, in qio_task_set_error() argument
206 error_propagate(&task->err, err); in qio_task_set_error()
210 bool qio_task_propagate_error(QIOTask *task, in qio_task_propagate_error() argument
213 if (task->err) { in qio_task_propagate_error()
214 error_propagate(errp, task->err); in qio_task_propagate_error()
215 task->err = NULL; in qio_task_propagate_error()
223 void qio_task_set_result_pointer(QIOTask *task, in qio_task_set_result_pointer() argument
227 task->result = result; in qio_task_set_result_pointer()
228 task->destroyResult = destroy; in qio_task_set_result_pointer()
232 gpointer qio_task_get_result_pointer(QIOTask *task) in qio_task_get_result_pointer() argument
234 return task->result; in qio_task_get_result_pointer()
238 Object *qio_task_get_source(QIOTask *task) in qio_task_get_source() argument
240 return task->source; in qio_task_get_source()