Commit 5b3ac23f authored by Peter Xu's avatar Peter Xu Committed by Stefan Hajnoczi
Browse files

iothread: delay the context release to finalize



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 2b316774 ("qemu-char: do not operate on sources from
finalize callbacks").

Reviewed-by: default avatarFam Zheng <famz@redhat.com>
Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
Message-id: 20170928025958.1420-5-peterx@redhat.com
Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
parent 82d90705
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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;
        }
    }

@@ -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) {