[pulseaudio-discuss] [PATCH reserve 2/2] Initialize monitor's busy status to false if we own the device.

Tanu Kaskinen tanuk at iki.fi
Tue Jan 15 16:56:36 PST 2013


On Tue, 2013-01-15 at 09:50 +0100, David Henningsson wrote:
> On 01/12/2013 07:22 PM, Tanu Kaskinen wrote:
> > Bug found by David Henningsson.
> > ---
> >   reserve-monitor.c |   74 +++++++++++++++++++++++++++++++++++++++++++----------
> >   1 file changed, 60 insertions(+), 14 deletions(-)
> >
> > diff --git a/reserve-monitor.c b/reserve-monitor.c
> > index 4097a6f..39a0c77 100644
> > --- a/reserve-monitor.c
> > +++ b/reserve-monitor.c
> > @@ -59,6 +59,22 @@ struct rm_monitor {
> >   	"member='NameOwnerChanged',"		\
> >   	"arg0='%s'"
> >
> > +static unsigned get_busy(
> > +	DBusConnection *c,
> > +	const char *name_owner) {
> > +
> > +	const char *un;
> > +
> > +	if (!name_owner || !*name_owner)
> > +		return FALSE;
> > +
> > +	if ((un = dbus_bus_get_unique_name(c)))
> > +		if (strcmp(name_owner, un) == 0)
> > +			return FALSE;
> > +
> > +	return TRUE;
> > +}
> > +
> >   static DBusHandlerResult filter_handler(
> >   	DBusConnection *c,
> >   	DBusMessage *s,
> > @@ -87,16 +103,7 @@ static DBusHandlerResult filter_handler(
> >   		if (strcmp(name, m->service_name) == 0) {
> >   			unsigned old_busy = m->busy;
> >
> > -			m->busy = !!(new && *new);
> > -
> > -			/* If we ourselves own the device, then don't consider this 'busy' */
> 
> This comment got lost. Should be moved to the get_busy function

Ok.

> 
> > -			if (m->busy) {
> > -				const char *un;
> > -
> > -				if ((un = dbus_bus_get_unique_name(c)))
> > -					if (strcmp(new, un) == 0)
> > -						m->busy = FALSE;
> > -			}
> > +			m->busy = get_busy(c, new);
> >
> >   			if (m->busy != old_busy && m->change_cb) {
> >   				m->ref++;
> > @@ -115,11 +122,13 @@ invalid:
> >   int rm_watch(
> >   	rm_monitor **_m,
> >   	DBusConnection *connection,
> > -	const char*device_name,
> > +	const char *device_name,
> >   	rm_change_cb_t change_cb,
> >   	DBusError *error)  {
> >
> >   	rm_monitor *m = NULL;
> > +	DBusMessage *msg = NULL, *reply = NULL;
> > +	const char *name_owner;
> >   	int r;
> >   	DBusError _error;
> >
> > @@ -178,13 +187,44 @@ int rm_watch(
> >
> >   	m->matching = 1;
> >
> > -	m->busy = dbus_bus_name_has_owner(m->connection, m->service_name, error);
> > +	if (!(msg = dbus_message_new_method_call(DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "GetNameOwner"))) {
> > +		r = -ENOMEM;
> > +		goto fail;
> > +	}
> 
> The rm_watch function is long enough already - I'd prefer if you move 
> the new code to a separate get_name_ower function (even if that would 
> mean a strdup).

Will do.

-- 
Tanu



More information about the pulseaudio-discuss mailing list