#87233# fixed disposing sequence: context entries, smgr, tdmgr

This commit is contained in:
Daniel Boelzle
2001-06-07 10:55:14 +00:00
parent cebdbf8951
commit e12b6ba3d5

View File

@@ -2,9 +2,9 @@
* *
* $RCSfile: component_context.cxx,v $ * $RCSfile: component_context.cxx,v $
* *
* $Revision: 1.5 $ * $Revision: 1.6 $
* *
* last change: $Author: dbo $ $Date: 2001-06-01 11:47:46 $ * last change: $Author: dbo $ $Date: 2001-06-07 11:55:14 $
* *
* The Contents of this file are made available subject to the terms of * The Contents of this file are made available subject to the terms of
* either of the following licenses * either of the following licenses
@@ -86,12 +86,15 @@
#include <hash_map> #include <hash_map>
#define SMGR_NAME "com.sun.star.lang.ServiceManager"
#define TDMGR_NAME "com.sun.star.reflection.TypeDescriptionManager"
using namespace ::osl; using namespace ::osl;
using namespace ::rtl; using namespace ::rtl;
using namespace ::com::sun::star::uno; using namespace ::com::sun::star::uno;
using namespace ::com::sun::star; using namespace ::com::sun::star;
namespace cppu namespace cppu
{ {
@@ -212,22 +215,22 @@ Any ComponentContext::getValueByName( OUString const & rName )
if (xInstance.is()) if (xInstance.is())
{ {
ClearableMutexGuard aGuard( m_mutex ); ClearableMutexGuard aGuard( m_mutex );
if (! pEntry->bLateInitService) // inited in the meantime? if (pEntry->bLateInitService)
{
pEntry->value.setValue( &xInstance, ::getCppuType( &xInstance ) );
pEntry->bLateInitService = false;
}
else // inited in the meantime
{ {
aGuard.clear(); aGuard.clear();
// service has entered the context in the meantime // service has entered the context in the meantime
// => try to dispose this one // => try to dispose this object
Reference< lang::XComponent > xComp( xInstance, UNO_QUERY ); Reference< lang::XComponent > xComp( xInstance, UNO_QUERY );
if (xComp.is()) if (xComp.is())
{ {
xComp->dispose(); xComp->dispose();
} }
} }
else
{
pEntry->value.setValue( &xInstance, ::getCppuType( &xInstance ) );
pEntry->bLateInitService = false;
}
return pEntry->value; return pEntry->value;
} }
@@ -253,8 +256,7 @@ Any ComponentContext::getValueByName( OUString const & rName )
return Any(); // error occured return Any(); // error occured
} }
else if (m_xDelegate.is())
if (m_xDelegate.is())
{ {
return m_xDelegate->getValueByName( rName ); return m_xDelegate->getValueByName( rName );
} }
@@ -281,11 +283,17 @@ void ComponentContext::disposing()
::fprintf( stderr, "> disposing context %p\n", this ); ::fprintf( stderr, "> disposing context %p\n", this );
#endif #endif
// dispose all context objects Reference< lang::XComponent > xTDMgr; // to be disposed separately
// first dispose all context objects
t_map::const_iterator iPos( m_map.begin() ); t_map::const_iterator iPos( m_map.begin() );
for ( ; iPos != m_map.end(); ++iPos ) for ( ; iPos != m_map.end(); ++iPos )
{ {
ContextEntry * pEntry = iPos->second; ContextEntry * pEntry = iPos->second;
// service manager disposed separately
if (!m_xSMgr.is() || !iPos->first.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(SMGR_NAME) ))
{
Reference< lang::XComponent > xComp; Reference< lang::XComponent > xComp;
if (pEntry->bLateInitService) if (pEntry->bLateInitService)
@@ -300,12 +308,21 @@ void ComponentContext::disposing()
} }
if (xComp.is()) if (xComp.is())
{
if (iPos->first.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(TDMGR_NAME) ))
{
// disposed separately
xTDMgr = xComp;
}
else
{ {
xComp->dispose(); xComp->dispose();
} }
} }
}
}
// dispose service manager // second dispose service manager
if (m_bDisposeSMgr) if (m_bDisposeSMgr)
{ {
Reference< lang::XComponent > xComp( m_xSMgr, UNO_QUERY ); Reference< lang::XComponent > xComp( m_xSMgr, UNO_QUERY );
@@ -315,11 +332,18 @@ void ComponentContext::disposing()
} }
} }
// last dispose of tdmgr: revoke callback from cppu runtime
if (xTDMgr.is())
{
xTDMgr->dispose();
}
// everything is disposed, hopefully nobody accesses the context anymore... // everything is disposed, hopefully nobody accesses the context anymore...
for ( iPos = m_map.begin(); iPos != m_map.end(); ++iPos ) for ( iPos = m_map.begin(); iPos != m_map.end(); ++iPos )
{ {
delete iPos->second; delete iPos->second;
} }
m_map.clear(); m_map.clear();
} }
//__________________________________________________________________________________________________ //__________________________________________________________________________________________________
@@ -334,10 +358,9 @@ ComponentContext::ComponentContext(
{ {
ContextEntry_Init const & rEntry = pEntries[ nEntries ]; ContextEntry_Init const & rEntry = pEntries[ nEntries ];
if (rEntry.name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.lang.ServiceManager") )) if (rEntry.name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(SMGR_NAME) ))
{ {
if (rEntry.value >>= m_xSMgr) rEntry.value >>= m_xSMgr;
continue;
} }
m_map[ rEntry.name ] = new ContextEntry( rEntry.bLateInitService, rEntry.value ); m_map[ rEntry.name ] = new ContextEntry( rEntry.bLateInitService, rEntry.value );
} }