[g-a-devel] [Accessibility] a11y / D-Bus / lifecycle ...

Eitan Isaacson eitan at ascender.com
Tue Dec 18 07:21:39 PST 2007

> 	The 'loan' concept is to handle references efficiently that we receive
> during an event emission (AFAIR) - that is more cunning ;-) the basic
> problem is we get a lot of events containing references which are 'live'
> only for the lifetime of the synchronous event emission, but we don't
> want to take a ref on all of them so we do:
> IPC		libspi		client
> -> incoming event
> 		create 'borrowed' reference
> 		->		on to libspi client code
> a)				client code does a ref ...
> 		<-
> b)		check reference - did it get reffed ?
> 		yes -> convert to a permanant ref
> ref	<-
> 	As you see if a) does not occur, b) does not need to either and we save
> a round-trip 'ref' call per event emission.

In pyatspi we are currently not taking advantage of this optimization,
when we receive an event, all remote objects in the event's structure
are referenced, so basically we get up to 2*3 extra round trips for each
event we receive (event.source, event.host_application and
event.any_data). I have an ugly patch sitting in bugzilla that assures
we only ref objects that we are holding a reference to after the event
callback returns:

It depends on weak reference support for pycorba objects. I put that in
pyorbit's trunk recently:

I am not completely convinced it is giving us a real performance boost,
for two reasons:
1) I don't know what kind of perf overhead my cruddy patch has, even
though the wire traffic is lessened.
2) Since our system is synchronous, most applications (like Orca) will
choose to decouple the event handling by queuing, and hold references to
the event's remote objects after the callback returns, so a ref() is
done in most cases.

Nonetheless here are some numbers on a short automated UI test with

So bottom line, the loaning thing is cool, but we haven't been using it
correctly until now.


More information about the Accessibility mailing list