Skip to content

Commit

Permalink
iothread: delay the context release to finalize
Browse files Browse the repository at this point in the history
When gcontext is used with iothread, the context will be destroyed
during iothread_stop().  That's not good since sometimes we would like
to keep the resources until iothread is destroyed, but we may want to
stop the thread before that point.

Delay the destruction of gcontext to iothread finalize.  Then we can do:

  iothread_stop(thread);
  some_cleanup_on_resources();
  iothread_destroy(thread);

We may need this patch if we want to run chardev IOs in iothreads and
hopefully clean them up correctly.  For more specific information,
please see 2b31677 ("qemu-char: do not operate on sources from
finalize callbacks").

Reviewed-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
Message-id: 20170928025958.1420-5-peterx@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
  • Loading branch information
xzpeter authored and stefanhaRH committed Oct 3, 2017
1 parent 82d9070 commit 5b3ac23
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions iothread.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,6 @@ static void *iothread_run(void *opaque)
g_main_loop_unref(loop);

g_main_context_pop_thread_default(iothread->worker_context);
g_main_context_unref(iothread->worker_context);
iothread->worker_context = NULL;
}
}

Expand Down Expand Up @@ -117,6 +115,10 @@ static void iothread_instance_finalize(Object *obj)
IOThread *iothread = IOTHREAD(obj);

iothread_stop(iothread);
if (iothread->worker_context) {
g_main_context_unref(iothread->worker_context);
iothread->worker_context = NULL;
}
qemu_cond_destroy(&iothread->init_done_cond);
qemu_mutex_destroy(&iothread->init_done_lock);
if (!iothread->ctx) {
Expand Down

0 comments on commit 5b3ac23

Please sign in to comment.