Adapted AsyncEventNotifier to safer-to-use salhelper::Thread
This commit is contained in:
@@ -42,9 +42,10 @@ $(eval $(call gb_Library_add_defs,comphelper,\
|
||||
))
|
||||
|
||||
$(eval $(call gb_Library_add_linked_libs,comphelper,\
|
||||
sal \
|
||||
cppuhelper \
|
||||
cppu \
|
||||
cppuhelper \
|
||||
sal \
|
||||
salhelper \
|
||||
ucbhelper \
|
||||
$(gb_STDLIBS) \
|
||||
))
|
||||
|
||||
@@ -29,12 +29,13 @@
|
||||
#ifndef COMPHELPER_ASYNCNOTIFICATION_HXX
|
||||
#define COMPHELPER_ASYNCNOTIFICATION_HXX
|
||||
|
||||
#include <osl/thread.hxx>
|
||||
#include <rtl/ref.hxx>
|
||||
#include <comphelper/comphelperdllapi.h>
|
||||
#include <rtl/alloc.h>
|
||||
#include "sal/config.h"
|
||||
|
||||
#include <memory>
|
||||
#include "boost/scoped_ptr.hpp"
|
||||
#include "comphelper/comphelperdllapi.h"
|
||||
#include "rtl/ref.hxx"
|
||||
#include "sal/types.h"
|
||||
#include "salhelper/thread.hxx"
|
||||
|
||||
//........................................................................
|
||||
namespace comphelper
|
||||
@@ -109,26 +110,25 @@ namespace comphelper
|
||||
events in the queue. As soon as you add an event, the thread is woken up, processes the event,
|
||||
and sleeps again.
|
||||
*/
|
||||
class COMPHELPER_DLLPUBLIC AsyncEventNotifier :public ::osl::Thread
|
||||
,public ::rtl::IReference
|
||||
class COMPHELPER_DLLPUBLIC AsyncEventNotifier: public salhelper::Thread
|
||||
{
|
||||
friend struct EventNotifierImpl;
|
||||
|
||||
private:
|
||||
::std::auto_ptr< EventNotifierImpl > m_pImpl;
|
||||
boost::scoped_ptr< EventNotifierImpl > m_pImpl;
|
||||
|
||||
SAL_DLLPRIVATE virtual ~AsyncEventNotifier();
|
||||
|
||||
// Thread
|
||||
virtual void SAL_CALL run();
|
||||
virtual void SAL_CALL onTerminated();
|
||||
SAL_DLLPRIVATE virtual void execute();
|
||||
|
||||
public:
|
||||
/** constructs a notifier thread
|
||||
*/
|
||||
AsyncEventNotifier();
|
||||
|
||||
// IReference implementations
|
||||
virtual oslInterlockedCount SAL_CALL acquire();
|
||||
virtual oslInterlockedCount SAL_CALL release();
|
||||
@param name the thread name, see ::osl_setThreadName; must not be
|
||||
null
|
||||
*/
|
||||
AsyncEventNotifier(char const * name);
|
||||
|
||||
/** terminates the thread
|
||||
|
||||
@@ -156,9 +156,6 @@ namespace comphelper
|
||||
/** removes all events for the given event processor from the queue
|
||||
*/
|
||||
void removeEventsForProcessor( const ::rtl::Reference< IEventProcessor >& _xProcessor );
|
||||
|
||||
protected:
|
||||
virtual ~AsyncEventNotifier();
|
||||
};
|
||||
|
||||
//====================================================================
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
ph comphelper : cppuhelper ucbhelper offapi officecfg salhelper LIBXSLT:libxslt NULL
|
||||
ch comphelper : BOOST:boost cppuhelper ucbhelper offapi officecfg salhelper LIBXSLT:libxslt NULL
|
||||
ch comphelper\prj nmake - all ch_all NULL
|
||||
|
||||
@@ -142,8 +142,8 @@ namespace comphelper
|
||||
//= AsyncEventNotifier
|
||||
//====================================================================
|
||||
//--------------------------------------------------------------------
|
||||
AsyncEventNotifier::AsyncEventNotifier()
|
||||
:m_pImpl( new EventNotifierImpl )
|
||||
AsyncEventNotifier::AsyncEventNotifier(char const * name):
|
||||
Thread(name), m_pImpl(new EventNotifierImpl)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -191,13 +191,8 @@ namespace comphelper
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void AsyncEventNotifier::run()
|
||||
void AsyncEventNotifier::execute()
|
||||
{
|
||||
acquire();
|
||||
|
||||
// keep us alive, in case we're terminated in the mid of the following
|
||||
::rtl::Reference< AsyncEventNotifier > xKeepAlive( this );
|
||||
|
||||
do
|
||||
{
|
||||
AnyEventRef aNextEvent;
|
||||
@@ -248,32 +243,6 @@ namespace comphelper
|
||||
while ( sal_True );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void SAL_CALL AsyncEventNotifier::onTerminated()
|
||||
{
|
||||
Thread::onTerminated();
|
||||
// when we were started (->run), we aquired ourself. Release this now
|
||||
// that we were finally terminated
|
||||
release();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
oslInterlockedCount SAL_CALL AsyncEventNotifier::acquire()
|
||||
{
|
||||
return osl_incrementInterlockedCount( &m_pImpl->m_refCount );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
oslInterlockedCount SAL_CALL AsyncEventNotifier::release()
|
||||
{
|
||||
if ( 0 == osl_decrementInterlockedCount( &m_pImpl->m_refCount ) )
|
||||
{
|
||||
delete this;
|
||||
return 0;
|
||||
}
|
||||
return m_pImpl->m_refCount;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
} // namespace comphelper
|
||||
//........................................................................
|
||||
|
||||
@@ -166,7 +166,7 @@ namespace dbaccess
|
||||
m_pEventBroadcaster->removeEventsForProcessor( this );
|
||||
m_pEventBroadcaster->terminate();
|
||||
m_pEventBroadcaster->join();
|
||||
m_pEventBroadcaster = NULL;
|
||||
m_pEventBroadcaster.clear();
|
||||
}
|
||||
|
||||
lang::EventObject aEvent( m_rDocument );
|
||||
@@ -190,7 +190,7 @@ namespace dbaccess
|
||||
m_bInitialized = true;
|
||||
if ( m_pEventBroadcaster.is() )
|
||||
// there are already pending asynchronous events
|
||||
m_pEventBroadcaster->create();
|
||||
m_pEventBroadcaster->launch();
|
||||
}
|
||||
|
||||
void DocumentEventNotifier_Impl::impl_notifyEvent_nothrow( const DocumentEvent& _rEvent )
|
||||
@@ -220,11 +220,12 @@ namespace dbaccess
|
||||
{
|
||||
if ( !m_pEventBroadcaster.is() )
|
||||
{
|
||||
m_pEventBroadcaster.set( new ::comphelper::AsyncEventNotifier );
|
||||
m_pEventBroadcaster.set(
|
||||
new ::comphelper::AsyncEventNotifier("DocumentEventNotifier"));
|
||||
if ( m_bInitialized )
|
||||
// start processing the events if and only if we (our document, respectively) are
|
||||
// already initialized
|
||||
m_pEventBroadcaster->create();
|
||||
m_pEventBroadcaster->launch();
|
||||
}
|
||||
m_pEventBroadcaster->addEvent( new DocumentEventHolder( _rEvent ), this );
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ $(eval $(call gb_Library_add_linked_libs,pcr,\
|
||||
cppuhelper \
|
||||
cppu \
|
||||
sal \
|
||||
salhelper \
|
||||
$(gb_STDLIBS) \
|
||||
))
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
ex extensions : officecfg TRANSLATIONS:translations DESKTOP:rdbmaker svx SANE:sane TWAIN:twain np_sdk offapi stoc ZLIB:zlib CURL:curl LIBXSLT:libxslt CPPUNIT:cppunit NULL
|
||||
ex extensions : officecfg salhelper TRANSLATIONS:translations DESKTOP:rdbmaker svx SANE:sane TWAIN:twain np_sdk offapi stoc ZLIB:zlib CURL:curl LIBXSLT:libxslt CPPUNIT:cppunit NULL
|
||||
ex extensions\prj nmake - all ex_prj NULL
|
||||
|
||||
# Fails at the moment
|
||||
|
||||
@@ -126,8 +126,13 @@ namespace pcr
|
||||
::osl::MutexGuard aGuard( getMutex() );
|
||||
if ( !s_pNotifier.is() )
|
||||
{
|
||||
s_pNotifier.set( new ::comphelper::AsyncEventNotifier );
|
||||
s_pNotifier->create();
|
||||
s_pNotifier.set(
|
||||
new ::comphelper::AsyncEventNotifier("browserlistbox"));
|
||||
s_pNotifier->launch();
|
||||
//TODO: a protocol is missing how to join with the launched
|
||||
// thread before exit(3), to ensure the thread is no longer
|
||||
// relying on any infrastructure while that infrastructure is
|
||||
// being shut down in atexit handlers
|
||||
}
|
||||
return s_pNotifier;
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ $(eval $(call gb_Library_add_linked_libs,frm,\
|
||||
editeng \
|
||||
i18nisolang1 \
|
||||
sal \
|
||||
salhelper \
|
||||
sfx \
|
||||
svl \
|
||||
svt \
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
fm forms : TRANSLATIONS:translations oovbaapi svx sfx2 QADEVOOO:qadevOOo LIBXSLT:libxslt NULL
|
||||
fm forms : TRANSLATIONS:translations oovbaapi salhelper svx sfx2 QADEVOOO:qadevOOo LIBXSLT:libxslt NULL
|
||||
fm forms usr1 - all fm_mkofrm NULL
|
||||
fm forms\prj nmake - all fm_prj NULL
|
||||
|
||||
|
||||
@@ -1528,7 +1528,6 @@ namespace frm
|
||||
:OBoundControl( _rxFactory, VCL_CONTROL_LISTBOX, sal_False )
|
||||
,m_aChangeListeners( m_aMutex )
|
||||
,m_aItemListeners( m_aMutex )
|
||||
,m_pItemBroadcaster( NULL )
|
||||
{
|
||||
DBG_CTOR(OListBoxControl,NULL);
|
||||
|
||||
@@ -1614,8 +1613,9 @@ namespace frm
|
||||
{
|
||||
if ( !m_pItemBroadcaster.is() )
|
||||
{
|
||||
m_pItemBroadcaster.set( new ::comphelper::AsyncEventNotifier );
|
||||
m_pItemBroadcaster->create();
|
||||
m_pItemBroadcaster.set(
|
||||
new ::comphelper::AsyncEventNotifier("ListBox"));
|
||||
m_pItemBroadcaster->launch();
|
||||
}
|
||||
m_pItemBroadcaster->addEvent( new ItemEventDescription( _rEvent ), this );
|
||||
}
|
||||
@@ -1701,15 +1701,20 @@ namespace frm
|
||||
m_aChangeListeners.disposeAndClear( aEvent );
|
||||
m_aItemListeners.disposeAndClear( aEvent );
|
||||
|
||||
rtl::Reference< comphelper::AsyncEventNotifier > t;
|
||||
{
|
||||
::osl::MutexGuard aGuard( m_aMutex );
|
||||
if ( m_pItemBroadcaster.is() )
|
||||
{
|
||||
t = m_pItemBroadcaster;
|
||||
m_pItemBroadcaster->removeEventsForProcessor( this );
|
||||
m_pItemBroadcaster->terminate();
|
||||
m_pItemBroadcaster = NULL;
|
||||
}
|
||||
}
|
||||
if (t.is()) {
|
||||
t->join();
|
||||
}
|
||||
|
||||
OBoundControl::disposing();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user