Re: [Qemu-devel] [PATCH 3/3] iothread: delay the context release to finalize

2017-09-24 Thread Fam Zheng
On Mon, 09/25 13:50, Peter Xu wrote:
> On Mon, Sep 25, 2017 at 01:30:02PM +0800, Fam Zheng wrote:
> > On Mon, 09/25 13:23, Peter Xu wrote:
> > > On Fri, Sep 22, 2017 at 09:09:22PM +0800, Fam Zheng wrote:
> > > > On Fri, 09/22 16:56, Peter Xu wrote:
> > > > > 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.
> > > > 
> > > > Would be nice if you can also mention the glib bug that "required" this 
> > > > in the
> > > > commit message.
> > > 
> > > I can add it, but I am not sure it's very closely related (and I'm
> > > afraid that may confuse more people).  Say, even without that bug, I
> > > would still think it not a good idea to free the context in the loop,
> > > especially considering that we have the finalize function there.  Thanks,
> > 
> > It's interesting to know if or not your future change will break without 
> > this
> > patch, this is especially useful for backport.
> 
> I haven't tried to run with iothread and without this patch, but I
> think it should fail, so this patch should be needed.
> 
> The point is that we should not destroy the context before explicitly
> calling remove_fd_in_watch() if the context is running chardevs.
> Without this patch, this rule does not satisfy.  And IIUC this rule
> comes from the glib bug.
> 
> Anyway, I'll mention it in commit message to clarify.

OK, thanks for the explanations! My r-b still stands with the amended commit
log.

Fam



Re: [Qemu-devel] [PATCH 3/3] iothread: delay the context release to finalize

2017-09-24 Thread Peter Xu
On Mon, Sep 25, 2017 at 01:30:02PM +0800, Fam Zheng wrote:
> On Mon, 09/25 13:23, Peter Xu wrote:
> > On Fri, Sep 22, 2017 at 09:09:22PM +0800, Fam Zheng wrote:
> > > On Fri, 09/22 16:56, Peter Xu wrote:
> > > > 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.
> > > 
> > > Would be nice if you can also mention the glib bug that "required" this 
> > > in the
> > > commit message.
> > 
> > I can add it, but I am not sure it's very closely related (and I'm
> > afraid that may confuse more people).  Say, even without that bug, I
> > would still think it not a good idea to free the context in the loop,
> > especially considering that we have the finalize function there.  Thanks,
> 
> It's interesting to know if or not your future change will break without this
> patch, this is especially useful for backport.

I haven't tried to run with iothread and without this patch, but I
think it should fail, so this patch should be needed.

The point is that we should not destroy the context before explicitly
calling remove_fd_in_watch() if the context is running chardevs.
Without this patch, this rule does not satisfy.  And IIUC this rule
comes from the glib bug.

Anyway, I'll mention it in commit message to clarify.

-- 
Peter Xu



Re: [Qemu-devel] [PATCH 3/3] iothread: delay the context release to finalize

2017-09-24 Thread Fam Zheng
On Mon, 09/25 13:23, Peter Xu wrote:
> On Fri, Sep 22, 2017 at 09:09:22PM +0800, Fam Zheng wrote:
> > On Fri, 09/22 16:56, Peter Xu wrote:
> > > 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.
> > 
> > Would be nice if you can also mention the glib bug that "required" this in 
> > the
> > commit message.
> 
> I can add it, but I am not sure it's very closely related (and I'm
> afraid that may confuse more people).  Say, even without that bug, I
> would still think it not a good idea to free the context in the loop,
> especially considering that we have the finalize function there.  Thanks,

It's interesting to know if or not your future change will break without this
patch, this is especially useful for backport.

Fam



Re: [Qemu-devel] [PATCH 3/3] iothread: delay the context release to finalize

2017-09-24 Thread Peter Xu
On Fri, Sep 22, 2017 at 09:09:22PM +0800, Fam Zheng wrote:
> On Fri, 09/22 16:56, Peter Xu wrote:
> > 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.
> 
> Would be nice if you can also mention the glib bug that "required" this in the
> commit message.

I can add it, but I am not sure it's very closely related (and I'm
afraid that may confuse more people).  Say, even without that bug, I
would still think it not a good idea to free the context in the loop,
especially considering that we have the finalize function there.  Thanks,

> 
> Reviewed-by: Fam Zheng 
> 
> > 
> > Delay the destruction of gcontext to iothread finalize.  Then we can do:
> > 
> >   iothread_stop(thread);
> >   some_cleanup_on_resources();
> >   iothread_destroy(thread);
> > 
> > Signed-off-by: Peter Xu 
> > ---
> >  iothread.c | 6 --
> >  1 file changed, 4 insertions(+), 2 deletions(-)
> > 
> > diff --git a/iothread.c b/iothread.c
> > index 894756b..b95369b 100644
> > --- a/iothread.c
> > +++ b/iothread.c
> > @@ -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(>init_done_cond);
> >  qemu_mutex_destroy(>init_done_lock);
> >  if (!iothread->ctx) {
> > -- 
> > 2.7.4
> > 
> > 

-- 
Peter Xu



Re: [Qemu-devel] [PATCH 3/3] iothread: delay the context release to finalize

2017-09-22 Thread Fam Zheng
On Fri, 09/22 16:56, Peter Xu wrote:
> 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.

Would be nice if you can also mention the glib bug that "required" this in the
commit message.

Reviewed-by: Fam Zheng 

> 
> Delay the destruction of gcontext to iothread finalize.  Then we can do:
> 
>   iothread_stop(thread);
>   some_cleanup_on_resources();
>   iothread_destroy(thread);
> 
> Signed-off-by: Peter Xu 
> ---
>  iothread.c | 6 --
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/iothread.c b/iothread.c
> index 894756b..b95369b 100644
> --- a/iothread.c
> +++ b/iothread.c
> @@ -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(>init_done_cond);
>  qemu_mutex_destroy(>init_done_lock);
>  if (!iothread->ctx) {
> -- 
> 2.7.4
> 
> 



[Qemu-devel] [PATCH 3/3] iothread: delay the context release to finalize

2017-09-22 Thread Peter Xu
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);

Signed-off-by: Peter Xu 
---
 iothread.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/iothread.c b/iothread.c
index 894756b..b95369b 100644
--- a/iothread.c
+++ b/iothread.c
@@ -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(>init_done_cond);
 qemu_mutex_destroy(>init_done_lock);
 if (!iothread->ctx) {
-- 
2.7.4