sd/source/ui/dlg/RemoteDialog.cxx | 2 +- sd/source/ui/dlg/RemoteDialogClientBox.cxx | 7 +++---- sd/source/ui/dlg/RemoteDialogClientBox.hxx | 8 ++------ sd/source/ui/remotecontrol/AvahiNetworkService.cxx | 10 ++++++++++ sd/source/ui/remotecontrol/BluetoothServer.cxx | 8 ++++++++ 5 files changed, 24 insertions(+), 11 deletions(-)
New commits: commit 0f1357200ee710e84389e927859eac75d24323d3 Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Oct 14 17:46:57 2013 +0200 D-Bus is not thread safe ...so it could happen that both the main thread at > internal_bus_get > dbus_bus_get_private > avahi_dbus_bus_get > avahi_client_new > sd::AvahiNetworkService::setup > sd::DiscoveryService::DiscoveryService > sd::DiscoveryService::setup > SdDLL::RegisterRemotes [...] as well as the thread > internal_bus_get > dbus_bus_get > dbusConnectToNameOnBus > sd::BluetoothServer::run > threadFunc > osl_thread_start_Impl > start_thread spawned from the main thread at > sd::BluetoothServer::setup > sd::RemoteServer::setup > SdDLL::RegisterRemotes [...] are in D-Bus's internal_bus_get simultaneously (with disastrous consequences, like SEGV) despite the _DBUS_LOCK(bus) there, unless you previously called dbus_threads_init_default. (Which the D-Bus documentation makes you believe can be called from multiple threads, though a look at the implemenation makes it clear that it really should be called from the main thread before any other threads are created---which we still don't do; oh my.) Other places that (indirectly) use D-Bus (tubes/source/file-transfer-helper.c, vcl/generic/fontmanager/fontconfig.cxx, vcl/unx/gtk/window/gtksalframe.cxx might need this, too. Change-Id: I912829c615b46b05a89c07bd044b04f1e5f5e7ba diff --git a/sd/source/ui/remotecontrol/AvahiNetworkService.cxx b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx index 8fc4eb7..34b94a3 100644 --- a/sd/source/ui/remotecontrol/AvahiNetworkService.cxx +++ b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx @@ -8,6 +8,7 @@ */ #include <time.h> #include <iostream> +#include <new> #include <stdlib.h> #include <assert.h> @@ -20,6 +21,8 @@ #include <avahi-common/timeval.h> #include <avahi-common/thread-watch.h> +#include <dbus/dbus.h> + #include <sal/log.hxx> #include "AvahiNetworkService.hxx" @@ -149,6 +152,13 @@ static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UN } void AvahiNetworkService::setup() { + // Avahi internally uses D-Bus, which requires the following in order to be + // thread-safe (and we potentially access D-Bus from different threads in + // different places of the code base): + if (!dbus_threads_init_default()) { + throw std::bad_alloc(); + } + int error = 0; avahiService = this; if (!(threaded_poll = avahi_threaded_poll_new())) { diff --git a/sd/source/ui/remotecontrol/BluetoothServer.cxx b/sd/source/ui/remotecontrol/BluetoothServer.cxx index ccdf03f..1deab3c 100644 --- a/sd/source/ui/remotecontrol/BluetoothServer.cxx +++ b/sd/source/ui/remotecontrol/BluetoothServer.cxx @@ -11,6 +11,7 @@ #include <iostream> #include <iomanip> +#include <new> #include <sal/log.hxx> @@ -586,6 +587,13 @@ BluetoothServer::BluetoothServer( std::vector<Communicator*>* pCommunicators ) mpCommunicators( pCommunicators ) { #ifdef LINUX_BLUETOOTH + // D-Bus requires the following in order to be thread-safe (and we + // potentially access D-Bus from different threads in different places of + // the code base): + if (!dbus_threads_init_default()) { + throw std::bad_alloc(); + } + mpImpl.reset(new BluetoothServer::Impl()); #endif } commit e202ea3ab830f64b1305b6a6031a807a2c12ebdc Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Oct 14 15:23:05 2013 +0200 Remove unused/null sd::ClientBox::m_pServer Change-Id: I5d79bcd75088d5ba2aa773ebf0809281cab07924 diff --git a/sd/source/ui/dlg/RemoteDialog.cxx b/sd/source/ui/dlg/RemoteDialog.cxx index 8aec838..5da2882 100644 --- a/sd/source/ui/dlg/RemoteDialog.cxx +++ b/sd/source/ui/dlg/RemoteDialog.cxx @@ -22,7 +22,7 @@ RemoteDialog::RemoteDialog( Window *pWindow ) : ModalDialog( pWindow, SdResId( DLG_PAIR_REMOTE ) ), mButtonConnect( this, SdResId( BTN_CONNECT ) ), mButtonCancel( this, SdResId( BTN_CANCEL ) ), - mClientBox( this, NULL, SdResId( LB_SERVERS ) ) + mClientBox( this, SdResId( LB_SERVERS ) ) { FreeResource(); diff --git a/sd/source/ui/dlg/RemoteDialogClientBox.cxx b/sd/source/ui/dlg/RemoteDialogClientBox.cxx index bce4935..f1eef9d 100644 --- a/sd/source/ui/dlg/RemoteDialogClientBox.cxx +++ b/sd/source/ui/dlg/RemoteDialogClientBox.cxx @@ -21,6 +21,7 @@ #include "RemoteDialogClientBox.hxx" #include "RemoteDialog.hrc" +#include "RemoteServer.hxx" #include "comphelper/processfactory.hxx" #include "com/sun/star/i18n/CollatorOptions.hpp" @@ -62,8 +63,7 @@ ClientRemovedListener::~ClientRemovedListener() //------------------------------------------------------------------------------ // ClientBox //------------------------------------------------------------------------------ -ClientBox::ClientBox( Dialog* pParent, RemoteServer *pServer, - const SdResId& aId ) : +ClientBox::ClientBox( Dialog* pParent, const SdResId& aId ) : Control( pParent, aId ), m_bHasScrollBar( false ), m_bHasActive( false ), @@ -77,8 +77,7 @@ ClientBox::ClientBox( Dialog* pParent, RemoteServer *pServer, m_nExtraHeight( 2 ), m_aPinBox( this, SdResId( INPUT_PIN ) ), m_aPinDescription( this, SdResId( TEXT_PIN ) ), - m_pScrollBar( new ScrollBar( this, WB_VERT ) ), - m_pServer( pServer ) + m_pScrollBar( new ScrollBar( this, WB_VERT ) ) { m_pScrollBar->SetScrollHdl( LINK( this, ClientBox, ScrollHdl ) ); m_pScrollBar->EnableDrag(); diff --git a/sd/source/ui/dlg/RemoteDialogClientBox.hxx b/sd/source/ui/dlg/RemoteDialogClientBox.hxx index 9c59057..522225a 100644 --- a/sd/source/ui/dlg/RemoteDialogClientBox.hxx +++ b/sd/source/ui/dlg/RemoteDialogClientBox.hxx @@ -32,7 +32,6 @@ #include <boost/shared_ptr.hpp> -#include "RemoteServer.hxx" #include "sdresid.hxx" namespace sd { @@ -48,6 +47,7 @@ namespace sd { // struct ClientBoxEntry //------------------------------------------------------------------------------ struct ClientBoxEntry; +struct ClientInfo; typedef ::boost::shared_ptr< ClientBoxEntry > TClientBoxEntry; @@ -112,7 +112,6 @@ class ClientBox: com::sun::star::uno::Reference< ClientRemovedListener > m_xRemoveListener; - RemoteServer *m_pServer; //This mutex is used for synchronizing access to m_vEntries. //Currently it is used to synchronize adding, removing entries and //functions like getItemName, getItemDescription, etc. to prevent @@ -141,8 +140,7 @@ class ClientBox: public: - ClientBox( Dialog* pParent, RemoteServer *pServer, - const SdResId& aId ); + ClientBox( Dialog* pParent, const SdResId& aId ); ~ClientBox(); void MouseButtonDown( const MouseEvent& rMEvt ); @@ -174,8 +172,6 @@ public: void checkEntries(); OUString getPin(); - - RemoteServer* getServer() const { return m_pServer; } }; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits