1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-25 04:02:42 +01:00

fs: implement fs::get_temp_dir() (Win32)

Trying to workaround issues with sparse files (#10231)
This commit is contained in:
Nekotekina 2021-05-05 10:42:12 +03:00
parent 546b52200b
commit e24ada37bf
3 changed files with 31 additions and 2 deletions

View File

@ -1729,6 +1729,32 @@ const std::string& fs::get_cache_dir()
return s_dir; return s_dir;
} }
const std::string& fs::get_temp_dir()
{
static const std::string s_dir = []
{
std::string dir;
#ifdef _WIN32
wchar_t buf[MAX_PATH + 2]{};
if (GetTempPathW(MAX_PATH + 1, buf) - 1 > MAX_PATH)
{
MessageBoxA(nullptr, fmt::format("GetTempPath() failed: error %u.", GetLastError()).c_str(), "fs::get_temp_dir()", MB_ICONERROR);
return dir; // empty
}
to_utf8(dir, buf);
#else
// TODO
dir = get_cache_dir();
#endif
return dir;
}();
return s_dir;
}
bool fs::remove_all(const std::string& path, bool remove_root) bool fs::remove_all(const std::string& path, bool remove_root)
{ {
if (const auto root_dir = dir(path)) if (const auto root_dir = dir(path))

View File

@ -636,6 +636,9 @@ namespace fs
// Get common cache directory // Get common cache directory
const std::string& get_cache_dir(); const std::string& get_cache_dir();
// Temporary directory
const std::string& get_temp_dir();
// Unique pending file creation destined to be renamed to the destination file // Unique pending file creation destined to be renamed to the destination file
struct pending_file struct pending_file
{ {

View File

@ -1128,7 +1128,7 @@ namespace vm
if (flags & page_size_4k || flags & preallocated) if (flags & page_size_4k || flags & preallocated)
{ {
// Special path for whole-allocated areas allowing 4k granularity // Special path for whole-allocated areas allowing 4k granularity
m_common = std::make_shared<utils::shm>(size, fs::get_cache_dir() + std::to_string(utils::get_unique_tsc())); m_common = std::make_shared<utils::shm>(size);
m_common->map_critical(vm::base(addr), utils::protection::no); m_common->map_critical(vm::base(addr), utils::protection::no);
m_common->map_critical(vm::get_super_ptr(addr)); m_common->map_critical(vm::get_super_ptr(addr));
} }
@ -1632,7 +1632,7 @@ namespace vm
inline namespace ps3_ inline namespace ps3_
{ {
static utils::shm s_hook{0x800000000, fs::get_cache_dir() + "hook.dat"}; static utils::shm s_hook{0x800000000, fmt::format("%s/rpcs3_vm_hook_%s", fs::get_temp_dir(), fmt::base57(utils::get_unique_tsc()))};
void init() void init()
{ {