fix unique_lock starvation and extension loading

This commit is contained in:
Akash Mozumdar 2019-02-13 18:23:42 -05:00
parent 4eefafeae9
commit 855f8ebfe5

View File

@ -19,8 +19,18 @@ namespace
wchar_t*(*callback)(wchar_t*, const InfoForExtension*); wchar_t*(*callback)(wchar_t*, const InfoForExtension*);
}; };
class : std::shared_mutex
{
public:
void lock() { ++queuedWrites; shared_mutex::lock(); }
void unlock() { --queuedWrites; shared_mutex::unlock(); }
void lock_shared() { while (queuedWrites) Sleep(100); shared_mutex::lock_shared(); }
void unlock_shared() { shared_mutex::unlock_shared(); }
private:
std::atomic<int> queuedWrites = 0;
} extenMutex;
std::vector<Extension> extensions; std::vector<Extension> extensions;
std::shared_mutex extenMutex;
void Load(QString extenName) void Load(QString extenName)
{ {
@ -44,7 +54,7 @@ namespace
{ {
std::scoped_lock writeLock(extenMutex); std::scoped_lock writeLock(extenMutex);
std::vector<Extension> extensions; std::vector<Extension> extensions;
for (auto extenName : extenNames) for (auto extenName : extenNames)
extensions.push_back(*std::find_if(::extensions.begin(), ::extensions.end(), [&](auto extension) { return extension.name == S(extenName); })); extensions.push_back(*std::find_if(::extensions.begin(), ::extensions.end(), [&](auto extension) { return extension.name == S(extenName); }));
::extensions = extensions; ::extensions = extensions;
} }
@ -105,7 +115,7 @@ void ExtenWindow::Sync()
void ExtenWindow::Add(QFileInfo extenFile) void ExtenWindow::Add(QFileInfo extenFile)
{ {
if (extenFile.suffix() != "dll") return; if (extenFile.suffix() != "dll") return;
QFile::copy(extenFile.fileName(), extenFile.absoluteFilePath()); QFile::copy(extenFile.absoluteFilePath(), extenFile.fileName());
Load(extenFile.completeBaseName()); Load(extenFile.completeBaseName());
Sync(); Sync();
} }