Re: [Rhythmbox-devel] idle rhythmbox



Hi Peter,

On Sun, 2007-05-13 at 21:19 +0100, Peter Robinson wrote:
> I've played with this a bit more this afternoon using the blog posts
> that you mentioned. I have no idea whether what I've found is an issue
> but from Federico's blog post the g_timeout_add  is seems to be a
> problem. From what I found there seems to be 2 of these that are
> called regularly. I may be barking up the wrong tree though.

Thanks for looking into this. I'd done a bit of investigation into
Rhythmbox's idle wakeups a while back, and noted some things on a bug:
http://bugzilla.gnome.org/show_bug.cgi?id=399012


> First one is in shell/rb-shell-clipboard.c in the function
> rb_shell_clipboard_idle_poll_deletions, line 764. It seems to call the
> else option regularly (every 0.3 seconds from what I can tell) even
> when RB is doing nothing. Not sure why it needs to do what ever its
> doing with a clipboard every 0.3 seconds.

This one should be fixed in 0.10.0.


> Second one is in rhythmdb/rhythmdb.c in the rhythmdb_idle_poll_events,
> line 2003. When idle it runs the else branch every second. Not sure
> what it does every second but being the DB it may not be fixable.

This is the hard one. While it is certainly fixable, it's somewhat
complicated to do so. It's been a while since I looked at it, so I might
not be remembering exactly, but basically what happens is:

The database has many events that must be processed in the main thread,
and those events can be added from any thread. We also process the
events in chunks, and want it to not start processing them more than
once a second. It currently works by having an a thread-safe queue which
the events get places on, and once a second a timeout runs in the main
thread to process them (with some other bits to not block the main
thread too long, etc).


A better way to do it would be to have a "schedule event" function which
places the event on the queue, checks if there is already a timeout
active and creates one if not (all in a thread-safe way). The timeout
would do exactly what it does now, except that if it had a run without
processing anything it removes itself. It is important that it removes
itself after a run without processing, not when it drains the queue, so
that it doesn't run more than once a second.

There are some other minor complications to it as well, which is where I
got stuck last time. I can't remember exactly what they were though.


Cheers,

-- 
"'The Internet' cannot be moved to the recycle bin. Do you wish to
delete 'The Internet' now ?" -- Windows explorer



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]