From a91d8cdb19176ad356bce06ab2c0834f9ed5fe91 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Sun, 20 Jun 2021 20:19:28 +0200 Subject: [PATCH] WIP Change-Id: I4410d066b8a4d2fd2eb746a5dd8f4ee763a8aa3e --- sal/rtl/bootstrap.cxx | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/sal/rtl/bootstrap.cxx b/sal/rtl/bootstrap.cxx index 45c330a56edb..bb7fe573376d 100644 --- a/sal/rtl/bootstrap.cxx +++ b/sal/rtl/bootstrap.cxx @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -590,21 +591,35 @@ bootstrap_map_t bootstrap_map; rtlBootstrapHandle SAL_CALL rtl_bootstrap_args_open(rtl_uString * pIniName) { - OUString iniName( pIniName ); + static o3tl::lru_map fileUrlLookupCache(16); + + OUString originalIniName( pIniName ); + OUString iniName; + + osl::ResettableMutexGuard guard(osl::Mutex::getGlobalMutex()); + auto cacheIt = fileUrlLookupCache.find(originalIniName); + bool foundInCache = cacheIt != fileUrlLookupCache.end(); + if (foundInCache) + iniName = cacheIt->second; + guard.clear(); // normalize path - FileStatus status(osl_FileStatus_Mask_FileURL); - DirectoryItem dirItem; - if (DirectoryItem::get(iniName, dirItem) != DirectoryItem::E_None || - dirItem.getFileStatus(status) != DirectoryItem::E_None) + if (iniName.isEmpty()) { - return nullptr; + FileStatus status(osl_FileStatus_Mask_FileURL); + DirectoryItem dirItem; + if (DirectoryItem::get(iniName, dirItem) != DirectoryItem::E_None || + dirItem.getFileStatus(status) != DirectoryItem::E_None) + { + return nullptr; + } + iniName = status.getFileURL(); } - iniName = status.getFileURL(); - + guard.reset(); + if (!foundInCache) + fileUrlLookupCache.insert({originalIniName, iniName}); Bootstrap_Impl * that; - osl::ResettableMutexGuard guard(osl::Mutex::getGlobalMutex()); auto iFind(bootstrap_map.find(iniName)); if (iFind == bootstrap_map.end()) { -- 2.27.0