fix: Occasional crash when multiple threads are reading data from a file provider
This commit is contained in:
parent
880568cc60
commit
1f8645fd43
@ -385,7 +385,7 @@ namespace hex {
|
||||
|
||||
namespace impl {
|
||||
|
||||
using Callback = std::function<bool(std::filesystem::path)>;
|
||||
using Callback = std::function<bool(std::fs::path)>;
|
||||
struct Entry {
|
||||
std::vector<std::string> extensions;
|
||||
Callback callback;
|
||||
|
@ -175,7 +175,7 @@ namespace hex {
|
||||
|
||||
void setBorderlessWindowMode(bool enabled);
|
||||
|
||||
void setCustomFontPath(const std::filesystem::path &path);
|
||||
void setCustomFontPath(const std::fs::path &path);
|
||||
void setFontSize(float size);
|
||||
|
||||
void setGPUVendor(const std::string &vendor);
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
#include <wolv/io/file.hpp>
|
||||
|
||||
#include <mutex>
|
||||
#include <string_view>
|
||||
|
||||
|
||||
namespace hex::plugin::builtin {
|
||||
|
||||
class FileProvider : public hex::prv::Provider {
|
||||
@ -59,13 +59,15 @@ namespace hex::plugin::builtin {
|
||||
|
||||
protected:
|
||||
std::fs::path m_path;
|
||||
|
||||
wolv::io::File m_sizeFile;
|
||||
std::map<std::thread::id, wolv::io::File> m_files;
|
||||
size_t m_fileSize = 0;
|
||||
|
||||
std::optional<struct stat> m_fileStats;
|
||||
|
||||
bool m_readable = false, m_writable = false;
|
||||
bool m_openReadOnly = true;
|
||||
|
||||
std::mutex m_fileAccessMutex, m_writeMutex;
|
||||
};
|
||||
|
||||
}
|
@ -71,6 +71,7 @@ namespace hex::plugin::builtin {
|
||||
if ((offset + size) > this->getActualSize() || buffer == nullptr || size == 0)
|
||||
return;
|
||||
|
||||
std::scoped_lock lock(this->m_writeMutex);
|
||||
wolv::io::File writeFile(this->m_path, wolv::io::File::Mode::Write);
|
||||
if (!writeFile.isValid())
|
||||
return;
|
||||
@ -140,7 +141,7 @@ namespace hex::plugin::builtin {
|
||||
}
|
||||
|
||||
size_t FileProvider::getActualSize() const {
|
||||
return this->m_fileSize;
|
||||
return this->m_sizeFile.getSize();
|
||||
}
|
||||
|
||||
std::string FileProvider::getName() const {
|
||||
@ -203,7 +204,7 @@ namespace hex::plugin::builtin {
|
||||
}
|
||||
|
||||
this->m_fileStats = file.getFileInfo();
|
||||
this->m_fileSize = file.getSize();
|
||||
this->m_sizeFile = wolv::io::File(this->m_path, wolv::io::File::Mode::Read);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -213,6 +214,8 @@ namespace hex::plugin::builtin {
|
||||
}
|
||||
|
||||
wolv::io::File& FileProvider::getFile() {
|
||||
std::scoped_lock lock(this->m_fileAccessMutex);
|
||||
|
||||
if (this->m_files.size() > 5)
|
||||
this->m_files.clear();
|
||||
|
||||
@ -229,7 +232,7 @@ namespace hex::plugin::builtin {
|
||||
std::fs::path path = std::u8string(pathString.begin(), pathString.end());
|
||||
|
||||
if (auto projectPath = ProjectFile::getPath(); !projectPath.empty())
|
||||
this->setPath(std::filesystem::weakly_canonical(projectPath.parent_path() / path));
|
||||
this->setPath(std::fs::weakly_canonical(projectPath.parent_path() / path));
|
||||
else
|
||||
this->setPath(path);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user