On Mon, 2 Sep 2013 11:27:16 -0300 Ulisses Furquim <uliss...@gmail.com> said:

> Raster,
> 
> On Sat, Aug 31, 2013 at 1:31 AM, Carsten Haitzler <ras...@rasterman.com>
> wrote:
> > On Fri, 30 Aug 2013 10:58:55 -0300 Ulisses Furquim <uliss...@gmail.com>
> > said:
> >
> >> Raster,
> >>
> >> On Fri, Aug 30, 2013 at 5:11 AM, Carsten Haitzler <ras...@rasterman.com>
> >> wrote:
> >> > On Thu, 29 Aug 2013 10:26:50 -0300 Ulisses Furquim <uliss...@gmail.com>
> >> > said:
> >> >
> >> >> Raster,
> >> >>
> >> >> On Thu, Aug 29, 2013 at 9:18 AM, Carsten Haitzler  - Enlightenment Git
> >> >> <no-re...@enlightenment.org> wrote:
> >> >> > raster pushed a commit to branch master.
> >> >> >
> >> >> > commit 42a46214c4f9b35c0e1f5a84c56ea76ba2235eae
> >> >> > Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
> >> >> > Date:   Thu Aug 29 21:18:04 2013 +0900
> >> >> >
> >> >> >     other async render issue - sync ALL rendering canvases, not just
> >> >> > one
> >> >> > ---
> >> >> >  src/lib/evas/canvas/evas_render.c          |  2 ++
> >> >> >  src/lib/evas/common/evas_thread_render.c   | 21 ++++++++++++++++++++-
> >> >> >  src/lib/evas/include/evas_common_private.h |  4 +++-
> >> >> >  3 files changed, 25 insertions(+), 2 deletions(-)
> >> >> >
> >> >> > diff --git a/src/lib/evas/canvas/evas_render.c
> >> >> > b/src/lib/evas/canvas/evas_render.c index b04d606..4fbe9e2 100644
> >> >> > --- a/src/lib/evas/canvas/evas_render.c
> >> >> > +++ b/src/lib/evas/canvas/evas_render.c
> >> >> > @@ -2235,6 +2235,7 @@ _canvas_render_dump(Eo *eo_e EINA_UNUSED, void
> >> >> > *_pd, va_list *list EINA_UNUSED) Evas_Public_Data *e = _pd;
> >> >> >     Evas_Layer *lay;
> >> >> >
> >> >> > +   evas_thread_queue_block();
> >> >> >     evas_render_rendering_wait(e);
> >> >> >     evas_cache_async_freeze();
> >> >>
> >> >> This might deadlock. If the queue is no empty and we have there the
> >> >> commands for e then we'll wait forever in _rendering_wait() in the
> >> >> main thread and the render thread will sleep forever trying to acquire
> >> >> the evas_thread_block_lock. Right?
> >> >
> >> > fixed. i didnt notice evas->rendering was set in evas_render as opposed
> >> > to the rendering handle in the async thread. :)
> >>
> >> Well, yes, your change solves the deadlock. But I want to know what
> >> you want, really. Do you want a call to sync all canvases? This lock
> >> is not doing that. We'd need to wait all canvases rendering flags to
> >> be set to false and then return. This way we wouldn't have any pending
> >> commands in the render thread.
> >
> > in doing the async rendering the code to dump data was totally disabled.
> > image data with refcounts > 0 were now never dumped. why? why fix for "i
> > have a background thread still using that data to render while my mainloop
> > is dumping". the "wait for evas to finish" waits for the GIVEN evas to
> > finish... ONLY that one. but the background async renderer may march on to
> > the NEXT canvas wanting a render in the queue and it doesn't wait for that.
> > it continues and we just now dumped images from memory it needs. as the
> > load data is done before the async renderer begins and it assumes data is
> > there and ready, so this block basically forces the dump cal to wait for
> > the async renderer to finish going through ALL queued rendering so far -
> > not just once canvas, but all of them, since its a mutex lock around that
> > block of code. this then allows all image data to be dumped from memory
> > (even refcount > 0) which is what the original intent and code was doing.
> > now it's safe and any new renders come from the mainloop afte the dump and
> > they can/will re-load data from files if needed for the async renderer to
> > work properly. no - it's not pretty, but it fixed the dump functionality.
> 
> This problem is now hard to reproduce but we still have a race with
> your fix. That lock doesn't guarantee what you want. If you happen to
> acquire the lock in the main thread just before the render thread
> tries to acquire it then after you clean up and release the lock the
> render thread will acquire it and we have a problem. Even though still
> difficult to happen this race is more prone to happen if the canvas
> you passed to _rendering_wait() is not rendering at that moment.
> 
> Moreover, I don't like this lock in the render thread and being able
> to block/unblock it. It's a deadlock wanting to happen. I'll see what
> I can do here but we need a proper sync all canvases function. It
> should be simple if we can just wait on the rendering flags for all
> canvases.

that was my other option for the fix. but then i'd have to track a list of all
canvases etc. etc. so this was was simpler. :) i was taking the view that since
it is the mainloop that triggers the render and also does the dump - any
rendering will have been triggered long before this. we could add a counter to
the cond wakeups. ie if mainloop issues a cond wakeup, reander thread needs to
decrement it when its done and back waiting (another lock plus counter). then
we lock+unlock (to force a big sleeping block if rendering is busy) and just
check counter is 0, since mainloop is the only one that ++'s the counter it can
only go down now... until it hits 0.
- if not we have a race

-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to