Guard against data race with MemoryProgramCache.

Uses the display global mutex.

Caught with angle_end2end_tests MultithreadingTest and TSAN.

Bug: b/168744561
Change-Id: I5a60346cb5f95ff506dc166604eeae501863a774
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2415182
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Courtney Goeltzenleuchter <courtneygo@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
This commit is contained in:
Jamie Madill 2020-09-17 12:03:12 -04:00 коммит произвёл Commit Bot
Родитель 5f8af83fe9
Коммит 4043b9d103
4 изменённых файлов: 11 добавлений и 0 удалений

Просмотреть файл

@ -8475,6 +8475,11 @@ void Context::onGPUSwitch()
initRendererString();
}
std::mutex &Context::getProgramCacheMutex() const
{
return mDisplay->getProgramCacheMutex();
}
// ErrorSet implementation.
ErrorSet::ErrorSet(Context *context) : mContext(context) {}

Просмотреть файл

@ -10,6 +10,7 @@
#ifndef LIBANGLE_CONTEXT_H_
#define LIBANGLE_CONTEXT_H_
#include <mutex>
#include <set>
#include <string>
@ -506,6 +507,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
angle::Result prepareForDispatch();
MemoryProgramCache *getMemoryProgramCache() const { return mMemoryProgramCache; }
std::mutex &getProgramCacheMutex() const;
bool hasBeenCurrent() const { return mHasBeenCurrent; }
egl::Display *getDisplay() const { return mDisplay; }

Просмотреть файл

@ -256,6 +256,7 @@ class Display final : public LabeledObject,
egl::Error handleGPUSwitch();
std::mutex &getDisplayGlobalMutex() { return mDisplayGlobalMutex; }
std::mutex &getProgramCacheMutex() { return mProgramCacheMutex; }
private:
Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice);
@ -327,6 +328,7 @@ class Display final : public LabeledObject,
std::vector<angle::ScratchBuffer> mZeroFilledBuffers;
std::mutex mDisplayGlobalMutex;
std::mutex mProgramCacheMutex;
};
} // namespace egl

Просмотреть файл

@ -1437,6 +1437,7 @@ angle::Result Program::linkImpl(const Context *context)
// TODO: http://anglebug.com/4530: Enable program caching for separable programs
if (cache && !isSeparable())
{
std::lock_guard<std::mutex> cacheLock(context->getProgramCacheMutex());
angle::Result cacheResult = cache->getProgram(context, this, &programHash);
ANGLE_TRY(cacheResult);
@ -1658,6 +1659,7 @@ void Program::resolveLinkImpl(const Context *context)
postResolveLink(context);
// Save to the program cache.
std::lock_guard<std::mutex> cacheLock(context->getProgramCacheMutex());
MemoryProgramCache *cache = context->getMemoryProgramCache();
// TODO: http://anglebug.com/4530: Enable program caching for separable programs
if (cache && !isSeparable() &&