diff options
author | Oliver Bolte <obo@openoffice.org> | 2003-09-04 09:56:23 +0000 |
---|---|---|
committer | Oliver Bolte <obo@openoffice.org> | 2003-09-04 09:56:23 +0000 |
commit | 63b29b855679536c4bc0acc6690ebb2ff91e42aa (patch) | |
tree | db5c6e03ef2cc664d93f16725a4bc56c3df9330b /sal/rtl | |
parent | 8d0e840cc247d7c2e86fddd6b21016dbd6b398d0 (diff) |
INTEGRATION: CWS cliuno01 (1.22.22); FILE MERGED
2003/08/12 09:07:56 dbo 1.22.22.2: #i8359# path normalizing
2003/07/22 10:25:16 dbo 1.22.22.1: #i8359# caching bootstrap files
Diffstat (limited to 'sal/rtl')
-rw-r--r-- | sal/rtl/source/bootstrap.cxx | 146 |
1 files changed, 111 insertions, 35 deletions
diff --git a/sal/rtl/source/bootstrap.cxx b/sal/rtl/source/bootstrap.cxx index f34f1df6db9b..d4274447a318 100644 --- a/sal/rtl/source/bootstrap.cxx +++ b/sal/rtl/source/bootstrap.cxx @@ -2,9 +2,9 @@ * * $RCSfile: bootstrap.cxx,v $ * - * $Revision: 1.23 $ + * $Revision: 1.24 $ * - * last change: $Author: hr $ $Date: 2003-07-16 17:22:32 $ + * last change: $Author: obo $ $Date: 2003-09-04 10:56:23 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -59,8 +59,6 @@ * ************************************************************************/ -#include <memory> - #include "macro.hxx" #ifndef _OSL_DIAGNOSE_H_ @@ -92,16 +90,12 @@ #include <rtl/byteseq.hxx> #endif -#ifndef INCLUDED_LIST #include <list> -#define INCLUDED_LIST -#endif +#include <hash_map> -using rtl::OString; -using rtl::OUString; -using rtl::OStringToOUString; -using rtl::OUStringToOString; +using namespace ::rtl; +using namespace ::osl; //---------------------------------------------------------------------------- @@ -376,7 +370,8 @@ static NameValueList s_rtl_bootstrap_set_list; struct Bootstrap_Impl { - ::std::auto_ptr< Bootstrap_Impl > _base_ini; + sal_Int32 _nRefCount; + Bootstrap_Impl * _base_ini; NameValueList _nameValueList; OUString _iniName; @@ -394,18 +389,28 @@ struct Bootstrap_Impl static inline bool path_exists( ::rtl::OUString const & path ) { - ::osl::DirectoryItem dirItem; - return (::osl::DirectoryItem::E_None == - ::osl::DirectoryItem::get( path, dirItem )); + DirectoryItem dirItem; + return (DirectoryItem::E_None == DirectoryItem::get( path, dirItem )); } Bootstrap_Impl::Bootstrap_Impl( OUString const & rIniName ) - : _iniName (rIniName) + : _nRefCount( 0 ), + _iniName (rIniName), + _base_ini( 0 ) { - OUString const & base_ini = getIniFileNameImpl(); - if (!rIniName.equals( base_ini ) && path_exists( base_ini )) + OUString base_ini( getIniFileNameImpl() ); + // normalize path + FileStatus status( FileStatusMask_FileURL ); + DirectoryItem dirItem; + if (DirectoryItem::E_None == DirectoryItem::get( base_ini, dirItem ) && + DirectoryItem::E_None == dirItem.getFileStatus( status )) { - _base_ini.reset( new Bootstrap_Impl( base_ini ) ); + base_ini = status.getFileURL(); + if (! rIniName.equals( base_ini )) + { + _base_ini = static_cast< Bootstrap_Impl * >( + rtl_bootstrap_args_open( base_ini.pData ) ); + } } #if OSL_DEBUG_LEVEL > 1 @@ -459,6 +464,8 @@ Bootstrap_Impl::Bootstrap_Impl( OUString const & rIniName ) Bootstrap_Impl::~Bootstrap_Impl() { + if (_base_ini != 0) + rtl_bootstrap_args_close( _base_ini ); } @@ -481,7 +488,7 @@ sal_Bool Bootstrap_Impl::getValue( } else { - if (0 != _base_ini.get()) + if (0 != _base_ini) { if (_base_ini->getValue( pName, ppValue, pDefault )) return sal_True; @@ -566,28 +573,97 @@ sal_Bool Bootstrap_Impl::getValue( extern "C" { -rtlBootstrapHandle SAL_CALL rtl_bootstrap_args_open(rtl_uString * pIniName) +// map<> may be preferred here, but hash_map<> is implemented fully inline, +// thus there is no need to link against the stlport. +typedef ::std::hash_map< + OUString, Bootstrap_Impl *, + OUStringHash, ::std::equal_to< OUString >, + MyAllocator< OUString > > t_bootstrap_map; +static t_bootstrap_map s_bootstrap_map; + +rtlBootstrapHandle SAL_CALL rtl_bootstrap_args_open( rtl_uString * pIniName ) { OUString workDir; - OUString iniName (pIniName); - - osl_getProcessWorkingDir(&workDir.pData); - osl::FileBase::getAbsoluteFileURL(workDir, iniName, iniName); + OUString iniName( pIniName ); + + osl_getProcessWorkingDir( &workDir.pData ); + FileBase::getAbsoluteFileURL( workDir, iniName, iniName ); + // normalize path + FileStatus status( FileStatusMask_FileURL ); + DirectoryItem dirItem; + if (DirectoryItem::E_None != DirectoryItem::get( iniName, dirItem ) || + DirectoryItem::E_None != dirItem.getFileStatus( status )) + { + return 0; + } + iniName = status.getFileURL(); - Bootstrap_Impl * pImpl = new Bootstrap_Impl (iniName); - return static_cast<rtlBootstrapHandle>(pImpl); + Bootstrap_Impl * that; + ResettableMutexGuard guard( Mutex::getGlobalMutex() ); + t_bootstrap_map::const_iterator iFind( s_bootstrap_map.find( iniName ) ); + if (iFind == s_bootstrap_map.end()) + { + guard.clear(); + that = new Bootstrap_Impl( iniName ); + guard.reset(); + iFind = s_bootstrap_map.find( iniName ); + if (iFind == s_bootstrap_map.end()) + { + ++that->_nRefCount; + ::std::pair< t_bootstrap_map::iterator, bool > insertion( + s_bootstrap_map.insert( + t_bootstrap_map::value_type( iniName, that ) ) ); + OSL_ASSERT( insertion.second ); + } + else + { + Bootstrap_Impl * obsolete = that; + that = iFind->second; + ++that->_nRefCount; + guard.clear(); + delete obsolete; + } + } + else + { + that = iFind->second; + ++that->_nRefCount; + } + return static_cast< rtlBootstrapHandle >( that ); } - -void SAL_CALL rtl_bootstrap_args_close(rtlBootstrapHandle handle) +void SAL_CALL rtl_bootstrap_args_close( rtlBootstrapHandle handle ) { - delete static_cast<Bootstrap_Impl*>(handle); + if (handle == 0) + return; + Bootstrap_Impl * that = static_cast< Bootstrap_Impl * >( handle ); + + MutexGuard guard( Mutex::getGlobalMutex() ); + OSL_ASSERT( + s_bootstrap_map.find( that->_iniName )->second == that ); + --that->_nRefCount; + if (that->_nRefCount == 0) + { + ::std::size_t nLeaking = 8; // only hold up to 8 files statically +#if OSL_DEBUG_LEVEL == 1 // nonpro + nLeaking = 0; +#elif OSL_DEBUG_LEVEL > 1 // debug + nLeaking = 1; +#endif + if (s_bootstrap_map.size() > nLeaking) + { + ::std::size_t erased = s_bootstrap_map.erase( that->_iniName ); + OSL_ASSERT( erased == 1 ); + delete that; + } + } } sal_Bool SAL_CALL rtl_bootstrap_get_from_handle( - rtlBootstrapHandle handle, rtl_uString *pName, rtl_uString **ppValue, rtl_uString *pDefault ) + rtlBootstrapHandle handle, rtl_uString *pName, rtl_uString **ppValue, + rtl_uString *pDefault ) { - osl::MutexGuard guard(osl::Mutex::getGlobalMutex()); + MutexGuard guard( Mutex::getGlobalMutex() ); sal_Bool found = sal_False; if(ppValue && pName) @@ -625,14 +701,14 @@ void SAL_CALL rtl_bootstrap_get_iniName_from_handle( void SAL_CALL rtl_bootstrap_setIniFileName( rtl_uString *pName ) { - osl::MutexGuard guard( osl::Mutex::getGlobalMutex() ); + MutexGuard guard( Mutex::getGlobalMutex() ); OUString & file = getIniFileNameImpl(); file = pName; } static rtlBootstrapHandle get_static_bootstrap_handle() SAL_THROW( () ) { - osl::MutexGuard guard( osl::Mutex::getGlobalMutex() ); + MutexGuard guard( Mutex::getGlobalMutex() ); static Bootstrap_Impl * pBootstrap_Impl = 0; @@ -658,7 +734,7 @@ void SAL_CALL rtl_bootstrap_set( rtl_uString * pName, rtl_uString * pValue ) OUString const & name = *reinterpret_cast< OUString const * >( &pName ); OUString const & value = *reinterpret_cast< OUString const * >( &pValue ); - ::osl::MutexGuard guard( ::osl::Mutex::getGlobalMutex() ); + MutexGuard guard( Mutex::getGlobalMutex() ); NameValueList::iterator iPos( s_rtl_bootstrap_set_list.begin() ); NameValueList::iterator iEnd( s_rtl_bootstrap_set_list.end() ); |