Commit b03ea8da authored by Mirsal Ennaime's avatar Mirsal Ennaime

Use a private dbus connection in the inhibit and telepathy modules

libdbus has multiple thread-safety issues and using private connections
(ie: not shared with other vlc modules) helps avoiding some of them.
parent f8881c68
...@@ -111,7 +111,11 @@ static int Activate( vlc_object_t *p_this ) ...@@ -111,7 +111,11 @@ static int Activate( vlc_object_t *p_this )
p_sys->p_input = NULL; p_sys->p_input = NULL;
dbus_error_init( &error ); dbus_error_init( &error );
p_sys->p_conn = dbus_bus_get( DBUS_BUS_SESSION, &error );
/* connect privately to the session bus
* the connection will not be shared with other vlc modules which use dbus,
* thus avoiding a whole class of concurrency issues */
p_sys->p_conn = dbus_bus_get_private( DBUS_BUS_SESSION, &error );
if( !p_sys->p_conn ) if( !p_sys->p_conn )
{ {
msg_Err( p_this, "Failed to connect to the D-Bus session daemon: %s", msg_Err( p_this, "Failed to connect to the D-Bus session daemon: %s",
...@@ -146,6 +150,10 @@ static void Deactivate( vlc_object_t *p_this ) ...@@ -146,6 +150,10 @@ static void Deactivate( vlc_object_t *p_this )
UnInhibit( p_intf, FREEDESKTOP ); UnInhibit( p_intf, FREEDESKTOP );
if( p_sys->i_cookie[GNOME] ) if( p_sys->i_cookie[GNOME] )
UnInhibit( p_intf, GNOME ); UnInhibit( p_intf, GNOME );
/* The dbus connection is private,
* so we are responsible for closing it */
dbus_connection_close( p_sys->p_conn );
dbus_connection_unref( p_sys->p_conn ); dbus_connection_unref( p_sys->p_conn );
free( p_sys ); free( p_sys );
......
...@@ -89,9 +89,12 @@ static int Open( vlc_object_t *p_this ) ...@@ -89,9 +89,12 @@ static int Open( vlc_object_t *p_this )
if( !p_intf->p_sys ) if( !p_intf->p_sys )
return VLC_ENOMEM; return VLC_ENOMEM;
/* connect to the session bus */
dbus_error_init( &error ); dbus_error_init( &error );
p_intf->p_sys->p_conn = dbus_bus_get( DBUS_BUS_SESSION, &error );
/* connect privately to the session bus
* the connection will not be shared with other vlc modules which use dbus,
* thus avoiding a whole class of concurrency issues */
p_intf->p_sys->p_conn = dbus_bus_get_private( DBUS_BUS_SESSION, &error );
if( !p_intf->p_sys->p_conn ) if( !p_intf->p_sys->p_conn )
{ {
msg_Err( p_this, "Failed to connect to the DBus session daemon: %s", msg_Err( p_this, "Failed to connect to the DBus session daemon: %s",
...@@ -140,7 +143,9 @@ static void Close( vlc_object_t *p_this ) ...@@ -140,7 +143,9 @@ static void Close( vlc_object_t *p_this )
/* Do not check for VLC_ENOMEM as we're closing */ /* Do not check for VLC_ENOMEM as we're closing */
SendToTelepathy( p_intf, "" ); SendToTelepathy( p_intf, "" );
/* we won't use the DBus connection anymore */ /* The dbus connection is private,
* so we are responsible for closing it */
dbus_connection_close( p_intf->p_sys->p_conn );
dbus_connection_unref( p_intf->p_sys->p_conn ); dbus_connection_unref( p_intf->p_sys->p_conn );
/* Destroy structure */ /* Destroy structure */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment