rpms/openoffice.org/F-13 openoffice.org-3.3.0.ooo113117.extensions.broken.scanner.shutdown.patch, NONE, 1.1 openoffice.org.spec, 1.2204, 1.2205

Caolan McNamara caolanm at fedoraproject.org
Tue Jul 13 09:36:58 UTC 2010


Author: caolanm

Update of /cvs/pkgs/rpms/openoffice.org/F-13
In directory cvs01.phx2.fedoraproject.org:/tmp/cvs-serv16592

Modified Files:
	openoffice.org.spec 
Added Files:
	openoffice.org-3.3.0.ooo113117.extensions.broken.scanner.shutdown.patch 
Log Message:
Resolves: rhbz#613278 [abrt] crash in SANE shutdown (caolanm)

openoffice.org-3.3.0.ooo113117.extensions.broken.scanner.shutdown.patch:
 scanner.cxx |    3 +
 scanner.hxx |    5 +-
 scanunx.cxx |  101 +++++++++++++++++++++++++++++++++++++++---------------------
 scanwin.cxx |   12 ++++---
 4 files changed, 79 insertions(+), 42 deletions(-)

--- NEW FILE openoffice.org-3.3.0.ooo113117.extensions.broken.scanner.shutdown.patch ---
diff -ru extensions.orig/source/scanner/scanner.cxx extensions/source/scanner/scanner.cxx
--- extensions.orig/source/scanner/scanner.cxx	2010-07-12 20:17:35.000000000 +0100
+++ extensions/source/scanner/scanner.cxx	2010-07-13 10:17:25.000000000 +0100
@@ -43,13 +43,14 @@
 ScannerManager::ScannerManager() :
 	mpData( NULL )
 {
+	AcquireData();
 }
 
 // -----------------------------------------------------------------------------
 
 ScannerManager::~ScannerManager()
 {
-	DestroyData();
+	ReleaseData();
 }
 
 // -----------------------------------------------------------------------------
diff -ru extensions.orig/source/scanner/scanner.hxx extensions/source/scanner/scanner.hxx
--- extensions.orig/source/scanner/scanner.hxx	2010-07-12 20:17:35.000000000 +0100
+++ extensions/source/scanner/scanner.hxx	2010-07-13 09:27:57.000000000 +0100
@@ -73,7 +73,8 @@
 	vos::OMutex								maProtector;
 	void*									mpData;
 
-	void									DestroyData();
+	void									AcquireData();
+	void									ReleaseData();
 
 public:
 
@@ -105,7 +106,7 @@
 	void									Unlock() { maProtector.release(); }
 
 	void*									GetData() const { return mpData; }
-	void									SetData( void* pData ) { DestroyData(); mpData = pData; }
+	void									SetData( void* pData ) { ReleaseData(); mpData = pData; }
 };
 
 // -----------------------------------------------------------------------------
diff -ru extensions.orig/source/scanner/scanunx.cxx extensions/source/scanner/scanunx.cxx
--- extensions.orig/source/scanner/scanunx.cxx	2010-07-12 20:17:35.000000000 +0100
+++ extensions/source/scanner/scanunx.cxx	2010-07-13 10:16:41.000000000 +0100
@@ -31,6 +31,7 @@
 #include <sanedlg.hxx>
 #include <vos/thread.hxx>
 #include <tools/list.hxx>
+#include <boost/shared_ptr.hpp>
 
 #if OSL_DEBUG_LEVEL > 1
 #include <stdio.h>
@@ -113,12 +114,41 @@
 	vos::OMutex			m_aProtector;
 	ScanError			m_nError;
     bool				m_bBusy;
+
+    SaneHolder() : m_nError(ScanError_ScanErrorNone), m_bBusy(false) {}
 };
 
-DECLARE_LIST( SaneHolderList, SaneHolder* )
+namespace
+{
+    typedef std::vector< boost::shared_ptr<SaneHolder> > sanevec;
+    class allSanes
+    {
+    private:
+        int mnRefCount;
+    public:
+        sanevec m_aSanes;
+        allSanes() : mnRefCount(0) {}
+        void acquire();
+        void release();
+    };
+
+    void allSanes::acquire()
+    {
+        ++mnRefCount;
+    }
+
+    void allSanes::release()
+    {
+        // was unused, now because of i99835: "Scanning interface not SANE API
+        // compliant" destroy all SaneHolder to get Sane Dtor called
+        --mnRefCount;
+        if (!mnRefCount)
+            m_aSanes.clear();
+    }
 
-static SaneHolderList	allSanes;
-static vos::OMutex		aSaneProtector;
+    struct theSaneProtector : public rtl::Static<vos::OMutex, theSaneProtector> {}; 
+    struct theSanes : public rtl::Static<allSanes, theSanes> {}; 
+}
 
 // -----------------
 // - ScannerThread -
@@ -126,7 +156,7 @@
 
 class ScannerThread : public vos::OThread
 {
-	SaneHolder*									m_pHolder;
+	boost::shared_ptr<SaneHolder>				m_pHolder;
 	REF( com::sun::star::lang::XEventListener )	m_xListener;
 	ScannerManager*								m_pManager; // just for the disposing call
 
@@ -134,7 +164,7 @@
 	virtual void run();
 	virtual void onTerminated() { delete this; }
 public:
-	ScannerThread( SaneHolder* pHolder,
+	ScannerThread( boost::shared_ptr<SaneHolder> pHolder,
 				   const REF( com::sun::star::lang::XEventListener )& listener,
 				   ScannerManager* pManager );
 	virtual ~ScannerThread();
@@ -143,7 +173,7 @@
 // -----------------------------------------------------------------------------
 
 ScannerThread::ScannerThread(
-                             SaneHolder* pHolder,
+                             boost::shared_ptr<SaneHolder> pHolder,
                              const REF( com::sun::star::lang::XEventListener )& listener,
                              ScannerManager* pManager )
         : m_pHolder( pHolder ), m_xListener( listener ), m_pManager( pManager )
@@ -192,16 +222,16 @@
 // - ScannerManager -
 // ------------------
 
-void ScannerManager::DestroyData()
+void ScannerManager::AcquireData()
 {
-	// was unused, now because of i99835: "Scanning interface not SANE API compliant"
-	// delete all SaneHolder to get Sane Dtor called
-	int i;
-	for ( i = allSanes.Count(); i > 0; i-- )
-	{
-		SaneHolder *pSaneHolder = allSanes.GetObject(i-1);
-		if ( pSaneHolder ) delete pSaneHolder;
-	}
+    vos::OGuard aGuard( theSaneProtector::get() );
+    theSanes::get().acquire();
+}
+
+void ScannerManager::ReleaseData()
+{
+    vos::OGuard aGuard( theSaneProtector::get() );
+    theSanes::get().release();
 }
 
 // -----------------------------------------------------------------------------
@@ -224,17 +254,14 @@
 
 SEQ( ScannerContext ) ScannerManager::getAvailableScanners() throw()
 {
-	vos::OGuard aGuard( aSaneProtector );
+	vos::OGuard aGuard( theSaneProtector::get() );
+	sanevec &rSanes = theSanes::get().m_aSanes;
 
-	if( ! allSanes.Count() )
+	if( rSanes.empty() )
 	{
-		SaneHolder* pSaneHolder = new SaneHolder;
-		pSaneHolder->m_nError = ScanError_ScanErrorNone;
-        pSaneHolder->m_bBusy = false;
+		boost::shared_ptr<SaneHolder> pSaneHolder(new SaneHolder);
 		if( Sane::IsSane() )
-			allSanes.Insert( pSaneHolder );
-		else
-			delete pSaneHolder;
+			rSanes.push_back( pSaneHolder );
 	}
 
 	if( Sane::IsSane() )
@@ -252,20 +279,21 @@
 
 BOOL ScannerManager::configureScanner( ScannerContext& scanner_context ) throw( ScannerException )
 {
-	vos::OGuard aGuard( aSaneProtector );
+	vos::OGuard aGuard( theSaneProtector::get() );
+	sanevec &rSanes = theSanes::get().m_aSanes;
 
 #if OSL_DEBUG_LEVEL > 1
     fprintf( stderr, "ScannerManager::configureScanner\n" );
 #endif
 
-	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= allSanes.Count() )
+	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= rSanes.size() )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner does not exist" ),
 			REF( XScannerManager )( this ),
 			ScanError_InvalidContext
 			);
 
-    SaneHolder* pHolder = allSanes.GetObject( scanner_context.InternalData );
+    boost::shared_ptr<SaneHolder> pHolder = rSanes[scanner_context.InternalData];
     if( pHolder->m_bBusy )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner is busy" ),
@@ -286,19 +314,20 @@
 void ScannerManager::startScan( const ScannerContext& scanner_context,
 								const REF( com::sun::star::lang::XEventListener )& listener ) throw( ScannerException )
 {
-	vos::OGuard aGuard( aSaneProtector );
+	vos::OGuard aGuard( theSaneProtector::get() );
+	sanevec &rSanes = theSanes::get().m_aSanes;
 
 #if OSL_DEBUG_LEVEL > 1
     fprintf( stderr, "ScannerManager::startScan\n" );
 #endif
 
-	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= allSanes.Count() )
+	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= rSanes.size() )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner does not exist" ),
 			REF( XScannerManager )( this ),
 			ScanError_InvalidContext
 			);
-	SaneHolder* pHolder = allSanes.GetObject( scanner_context.InternalData );
+	boost::shared_ptr<SaneHolder> pHolder = rSanes[scanner_context.InternalData];
     if( pHolder->m_bBusy )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner is busy" ),
@@ -315,16 +344,17 @@
 
 ScanError ScannerManager::getError( const ScannerContext& scanner_context ) throw( ScannerException )
 {
-	vos::OGuard aGuard( aSaneProtector );
+	vos::OGuard aGuard( theSaneProtector::get() );
+	sanevec &rSanes = theSanes::get().m_aSanes;
 
-	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= allSanes.Count() )
+	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= rSanes.size() )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner does not exist" ),
 			REF( XScannerManager )( this ),
 			ScanError_InvalidContext
 			);
 
-	SaneHolder* pHolder = allSanes.GetObject( scanner_context.InternalData );
+	boost::shared_ptr<SaneHolder> pHolder = rSanes[scanner_context.InternalData];
 
 	return pHolder->m_nError;
 }
@@ -333,15 +363,16 @@
 
 REF( AWT::XBitmap ) ScannerManager::getBitmap( const ScannerContext& scanner_context ) throw( ScannerException )
 {
-	vos::OGuard aGuard( aSaneProtector );
+	vos::OGuard aGuard( theSaneProtector::get() );
+	sanevec &rSanes = theSanes::get().m_aSanes;
 
-	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= allSanes.Count() )
+	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= rSanes.size() )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner does not exist" ),
 			REF( XScannerManager )( this ),
 			ScanError_InvalidContext
 			);
-	SaneHolder* pHolder = allSanes.GetObject( scanner_context.InternalData );
+	boost::shared_ptr<SaneHolder> pHolder = rSanes[scanner_context.InternalData];
 
 	vos::OGuard aProtGuard( pHolder->m_aProtector );
 
diff -ru extensions.orig/source/scanner/scanwin.cxx extensions/source/scanner/scanwin.cxx
--- extensions.orig/source/scanner/scanwin.cxx	2010-07-12 20:17:35.000000000 +0100
+++ extensions/source/scanner/scanwin.cxx	2010-07-13 09:28:40.000000000 +0100
@@ -887,7 +887,11 @@
 // - ScannerManager -
 // ------------------
 
-void ScannerManager::DestroyData()
+void ScannerManager::AcquireData()
+{
+}
+
+void ScannerManager::ReleaseData()
 {
 	if( mpData )
 	{
@@ -979,7 +983,7 @@
 		}
 
 		GlobalUnlock( hDIB );
-		DestroyData();
+		ReleaseData();
 	}
 
 	return aRet;
@@ -1009,7 +1013,7 @@
 	if( rContext.InternalData != 0 || rContext.ScannerName != ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TWAIN" ) ) )
 		throw ScannerException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Scanner does not exist" ) ), xThis, ScanError_InvalidContext );
 
-	DestroyData();
+	ReleaseData();
 
 	return aTwain.SelectSource( *this );
 }
@@ -1025,7 +1029,7 @@
 	if( rContext.InternalData != 0 || rContext.ScannerName != ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TWAIN" ) ) )
 		throw ScannerException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Scanner does not exist" ) ), xThis, ScanError_InvalidContext );
 
-	DestroyData();
+	ReleaseData();
 	aTwain.PerformTransfer( *this, rxListener );
 }
 


Index: openoffice.org.spec
===================================================================
RCS file: /cvs/pkgs/rpms/openoffice.org/F-13/openoffice.org.spec,v
retrieving revision 1.2204
retrieving revision 1.2205
diff -u -p -r1.2204 -r1.2205
--- openoffice.org.spec	25 Jun 2010 19:09:10 -0000	1.2204
+++ openoffice.org.spec	13 Jul 2010 09:36:57 -0000	1.2205
@@ -165,6 +165,7 @@ Patch94: openoffice.org-3.3.0.ooo112516.
 Patch95: openoffice.org-3.3.0.ooo107490.cppu.lifecycle.patch
 Patch96: openoffice.org-3.3.0.ooo112567.vcl.embeddedbitmaps.patch
 Patch97: openoffice.org-3.3.0.ooo112657.sw.rtf.dont-crash-on-merged-cells-without-clmgf.patch
+Patch98: openoffice.org-3.3.0.ooo113117.extensions.broken.scanner.shutdown.patch
 
 %{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
 %define instdir %{_libdir}
@@ -1760,6 +1761,7 @@ cp -p %{SOURCE5} external/unowinreg/unow
 %patch95 -p0 -b .ooo107490.cppu.lifecycle.patch
 %patch96 -p0 -b .ooo112567.vcl.embeddedbitmaps.patch
 %patch97 -p1 -b .ooo112657.sw.rtf.dont-crash-on-merged-cells-without-clmgf.patch
+%patch98 -p0 -b .ooo113117.extensions.broken.scanner.shutdown.patch
 
 %build
 echo build start time is `date`, diskspace: `df -h . | tail -n 1`
@@ -4245,9 +4247,10 @@ fi
 %endif
 
 %changelog
-* Fri Jun 25 2010 Caolán McNamara <caolanm at redhat.com> - 1:3.2.0-12.27.UNBUILT
-- Resolves: rhbz#608114 cppu-licecycle issues
+* Tue Jul 13 2010 Caolán McNamara <caolanm at redhat.com> - 1:3.2.0-12.27.UNBUILT
+- Resolves: rhbz#608114 cppu-lifecycle issues (caolanm)
 - Resolves: rhbz#566831 [abrt] crash in GetFrmSize (dtardon)
+- Resolves: rhbz#613278 [abrt] crash in SANE shutdown (caolanm)
 
 * Mon Jun 21 2010 Caolán McNamara <caolanm at redhat.com> - 1:3.2.0-12.26
 - Resolves: rhbz#606021 openoffice.org-3.3.0.ooo112567.vcl.embeddedbitmaps.patch



More information about the scm-commits mailing list