Index: include/lldb/Target/Platform.h =================================================================== --- include/lldb/Target/Platform.h +++ include/lldb/Target/Platform.h @@ -1134,8 +1134,8 @@ const FileSpec& dst_file_spec); bool - GetFileFromLocalCache (const ModuleSpec& module_spec, - FileSpec &cached_file_spec); + GetModuleFromLocalCache (const ModuleSpec& module_spec, + lldb::ModuleSP &module_sp); FileSpec GetModuleCacheRoot (); Index: source/Target/Platform.cpp =================================================================== --- source/Target/Platform.cpp +++ source/Target/Platform.cpp @@ -1756,22 +1756,12 @@ Platform::GetCachedSharedModule (const ModuleSpec &module_spec, lldb::ModuleSP &module_sp) { - FileSpec cached_file_spec; - if (m_module_cache && GetFileFromLocalCache (module_spec, cached_file_spec)) - { - auto cached_module_spec (module_spec); - cached_module_spec.GetFileSpec () = cached_file_spec; - cached_module_spec.GetPlatformFileSpec () = module_spec.GetFileSpec (); - module_sp.reset (new Module (cached_module_spec)); - - return true; - } - return false; + return (m_module_cache && GetModuleFromLocalCache (module_spec, module_sp)); } bool -Platform::GetFileFromLocalCache (const ModuleSpec& module_spec, - FileSpec &cached_file_spec) +Platform::GetModuleFromLocalCache (const ModuleSpec& module_spec, + lldb::ModuleSP &module_sp) { Log *log = GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PLATFORM); @@ -1783,9 +1773,8 @@ // Check local cache for a module. auto error = m_module_cache->Get (GetModuleCacheRoot (), GetHostname (), - resolved_module_spec.GetUUID (), - resolved_module_spec.GetFileSpec (), - cached_file_spec); + resolved_module_spec, + module_sp); if (error.Success ()) return true; @@ -1825,8 +1814,7 @@ // Put downloaded file into local module cache. error = m_module_cache->Put (GetModuleCacheRoot (), GetHostname (), - resolved_module_spec.GetUUID (), - resolved_module_spec.GetFileSpec (), + resolved_module_spec, tmp_download_file_spec); if (error.Fail ()) { @@ -1839,9 +1827,8 @@ error = m_module_cache->Get (GetModuleCacheRoot (), GetHostname (), - resolved_module_spec.GetUUID (), - resolved_module_spec.GetFileSpec (), - cached_file_spec); + resolved_module_spec, + module_sp); return error.Success (); } Index: source/Utility/ModuleCache.h =================================================================== --- source/Utility/ModuleCache.h +++ source/Utility/ModuleCache.h @@ -17,9 +17,11 @@ #include "lldb/Host/FileSpec.h" #include +#include namespace lldb_private { +class Module; class UUID; //---------------------------------------------------------------------- @@ -45,16 +47,14 @@ Error Put (const FileSpec &root_dir_spec, const char *hostname, - const UUID &uuid, - const FileSpec &platform_module_spec, + const ModuleSpec &module_spec, const FileSpec &tmp_file); Error Get (const FileSpec &root_dir_spec, const char *hostname, - const UUID &uuid, - const FileSpec &platform_module_spec, - FileSpec &cached_module_spec); + const ModuleSpec &module_spec, + lldb::ModuleSP &cached_module_sp); private: static FileSpec @@ -65,6 +65,8 @@ static Error CreateHostSysRootModuleSymLink (const FileSpec &sysroot_module_path_spec, const FileSpec &module_file_path); + + std::unordered_map m_loaded_modules; }; } // namespace lldb_private Index: source/Utility/ModuleCache.cpp =================================================================== --- source/Utility/ModuleCache.cpp +++ source/Utility/ModuleCache.cpp @@ -10,6 +10,7 @@ #include "ModuleCache.h" #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Host/FileSystem.h" #include "llvm/Support/FileSystem.h" @@ -52,16 +53,15 @@ Error ModuleCache::Put (const FileSpec &root_dir_spec, const char *hostname, - const UUID &uuid, - const FileSpec &platform_module_spec, + const ModuleSpec &module_spec, const FileSpec &tmp_file) { - const auto module_spec_dir = GetModuleDirectory (root_dir_spec, uuid); + const auto module_spec_dir = GetModuleDirectory (root_dir_spec, module_spec.GetUUID ()); auto error = MakeDirectory (module_spec_dir); if (error.Fail ()) return error; - const auto module_file_path = JoinPath (module_spec_dir, platform_module_spec.GetFilename ().AsCString ()); + const auto module_file_path = JoinPath (module_spec_dir, module_spec.GetFileSpec ().GetFilename ().AsCString ()); const auto tmp_file_path = tmp_file.GetPath (); const auto err_code = llvm::sys::fs::copy_file (tmp_file_path.c_str (), module_file_path.GetPath ().c_str ()); @@ -74,36 +74,45 @@ } // Create sysroot link to a module. - const auto sysroot_module_path_spec = GetHostSysRootModulePath (root_dir_spec, hostname, platform_module_spec); + const auto sysroot_module_path_spec = GetHostSysRootModulePath (root_dir_spec, hostname, module_spec.GetFileSpec ()); return CreateHostSysRootModuleSymLink (sysroot_module_path_spec, module_file_path); } Error ModuleCache::Get (const FileSpec &root_dir_spec, const char *hostname, - const UUID &uuid, - const FileSpec &platform_module_spec, - FileSpec &cached_module_spec) + const ModuleSpec &module_spec, + ModuleSP &cached_module_sp) { - cached_module_spec.Clear (); + const auto find_it = m_loaded_modules.find (module_spec.GetUUID ().GetAsString()); + if (find_it != m_loaded_modules.end ()) + { + cached_module_sp = (*find_it).second.lock (); + if (cached_module_sp) + return Error (); + m_loaded_modules.erase (find_it); + } - const auto module_spec_dir = GetModuleDirectory (root_dir_spec, uuid); - const auto module_file_path = JoinPath (module_spec_dir, platform_module_spec.GetFilename ().AsCString ()); + const auto module_spec_dir = GetModuleDirectory (root_dir_spec, module_spec.GetUUID ()); + const auto module_file_path = JoinPath (module_spec_dir, module_spec.GetFileSpec ().GetFilename ().AsCString ()); - Error error; if (!module_file_path.Exists ()) - { - error.SetErrorStringWithFormat ("module %s not found", module_file_path.GetPath ().c_str ()); - return error; - } - cached_module_spec = module_file_path; + return Error ("module %s not found", module_file_path.GetPath ().c_str ()); // We may have already cached module but downloaded from an another host - in this case let's create a symlink to it. - const auto sysroot_module_path_spec = GetHostSysRootModulePath (root_dir_spec, hostname, platform_module_spec); + const auto sysroot_module_path_spec = GetHostSysRootModulePath (root_dir_spec, hostname, module_spec.GetFileSpec ()); if (!sysroot_module_path_spec.Exists ()) - CreateHostSysRootModuleSymLink (sysroot_module_path_spec, cached_module_spec); + CreateHostSysRootModuleSymLink (sysroot_module_path_spec, module_spec.GetFileSpec ()); + + auto cached_module_spec (module_spec); + cached_module_spec.GetUUID ().Clear (); // Clear UUID since it may contain md5 content hash instead of real UUID. + cached_module_spec.GetFileSpec () = module_file_path; + cached_module_spec.GetPlatformFileSpec () = module_spec.GetFileSpec (); + cached_module_sp.reset (new Module (cached_module_spec)); + + m_loaded_modules.insert (std::make_pair (module_spec.GetUUID ().GetAsString (), cached_module_sp)); - return error; + return Error (); } FileSpec