Kaydet (Commit) ed2a220f authored tarafından Bjoern Michaelsen's avatar Bjoern Michaelsen

oooimprovement6: #i100159# catching the OnLogRotate thread in a clean fashion

üst 5d5d4aee
...@@ -35,15 +35,21 @@ ...@@ -35,15 +35,21 @@
#include "soapsender.hxx" #include "soapsender.hxx"
#include <com/sun/star/ucb/XSimpleFileAccess.hpp> #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
#include <com/sun/star/frame/XDesktop.hpp>
#include <com/sun/star/frame/XTerminateListener.hpp>
#include <osl/mutex.hxx> #include <osl/mutex.hxx>
#include <osl/thread.hxx> #include <osl/thread.hxx>
#include <osl/time.h> #include <osl/time.h>
#include <cppuhelper/implbase1.hxx>
#include <memory>
using namespace ::com::sun::star::beans; using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::lang; using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::task; using namespace ::com::sun::star::task;
using namespace ::com::sun::star::uno; using namespace ::com::sun::star::uno;
using ::com::sun::star::frame::XTerminateListener;
using ::com::sun::star::frame::XDesktop;
using ::com::sun::star::ucb::XSimpleFileAccess; using ::com::sun::star::ucb::XSimpleFileAccess;
using ::rtl::OUString; using ::rtl::OUString;
using ::std::vector; using ::std::vector;
...@@ -102,7 +108,8 @@ namespace ...@@ -102,7 +108,8 @@ namespace
public: public:
OnLogRotateThread(Reference<XMultiServiceFactory> sf); OnLogRotateThread(Reference<XMultiServiceFactory> sf);
virtual void SAL_CALL run(); virtual void SAL_CALL run();
void disposing(); OnLogRotateThread* disposing();
private: private:
Reference<XMultiServiceFactory> m_ServiceFactory; Reference<XMultiServiceFactory> m_ServiceFactory;
::osl::Mutex m_ServiceFactoryMutex; ::osl::Mutex m_ServiceFactoryMutex;
...@@ -135,11 +142,35 @@ namespace ...@@ -135,11 +142,35 @@ namespace
} }
} }
void OnLogRotateThread::disposing() OnLogRotateThread* OnLogRotateThread::disposing()
{ {
::osl::Guard< ::osl::Mutex> service_factory_guard(m_ServiceFactoryMutex); ::osl::Guard< ::osl::Mutex> service_factory_guard(m_ServiceFactoryMutex);
m_ServiceFactory.clear(); m_ServiceFactory.clear();
return this;
} }
class OnLogRotateThreadWatcher : public ::cppu::WeakImplHelper1<XTerminateListener>
{
public:
OnLogRotateThreadWatcher(Reference<XMultiServiceFactory> sf)
: m_Thread(new OnLogRotateThread(sf))
{
m_Thread->create();
}
virtual ~OnLogRotateThreadWatcher()
{ m_Thread->disposing()->terminate(); };
// XTerminateListener
virtual void SAL_CALL queryTermination(const EventObject&) throw(RuntimeException)
{ };
virtual void SAL_CALL notifyTermination(const EventObject&) throw(RuntimeException)
{ m_Thread->disposing()->terminate(); };
// XEventListener
virtual void SAL_CALL disposing(const EventObject&) throw(RuntimeException)
{ m_Thread->disposing()->terminate(); };
private:
::std::auto_ptr<OnLogRotateThread> m_Thread;
};
} }
namespace oooimprovement namespace oooimprovement
...@@ -163,9 +194,11 @@ namespace oooimprovement ...@@ -163,9 +194,11 @@ namespace oooimprovement
const Reference<XJobListener>& listener) const Reference<XJobListener>& listener)
throw(RuntimeException) throw(RuntimeException)
{ {
OnLogRotateThread* thread = new OnLogRotateThread(m_ServiceFactory); Reference<XDesktop> xDesktop(
thread->create(); m_ServiceFactory->createInstance(OUString::createFromAscii("com.sun.star.frame.Desktop")),
UNO_QUERY);
if(xDesktop.is())
xDesktop->addTerminateListener(Reference<XTerminateListener>(new OnLogRotateThreadWatcher(m_ServiceFactory)));
Any result; Any result;
listener->jobFinished(Reference<XAsyncJob>(this), result); listener->jobFinished(Reference<XAsyncJob>(this), result);
} }
......
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