Bug 1325227 - Part 5: Hold the read lock while the TextureClient is locked. r=nical

This commit is contained in:
Matt Woodrow
2017-02-04 23:19:22 +13:00
parent d18378def9
commit 7b0c65b3d8
2 changed files with 37 additions and 1 deletions

View File

@@ -482,6 +482,35 @@ TextureClient::IsReadLocked() const
return mReadLock->AsNonBlockingLock()->GetReadCount() > 1;
}
bool
TextureClient::TryReadLock()
{
if (!mReadLock || mIsReadLocked) {
return true;
}
if (mReadLock->AsNonBlockingLock()) {
if (IsReadLocked()) {
return false;
}
}
mReadLock->ReadLock();
mIsReadLocked = true;
return true;
}
void
TextureClient::ReadUnlock()
{
if (!mIsReadLocked) {
return;
}
MOZ_ASSERT(mReadLock);
mReadLock->ReadUnlock();
mIsReadLocked = false;
}
bool
TextureClient::Lock(OpenMode aMode)
{
@@ -494,7 +523,7 @@ TextureClient::Lock(OpenMode aMode)
return mOpenMode == aMode;
}
if (aMode & OpenMode::OPEN_WRITE && IsReadLocked()) {
if (aMode & OpenMode::OPEN_WRITE && !TryReadLock()) {
NS_WARNING("Attempt to Lock a texture that is being read by the compositor!");
return false;
}
@@ -524,6 +553,7 @@ TextureClient::Lock(OpenMode aMode)
if (!mIsLocked) {
UnlockActor();
ReadUnlock();
}
return mIsLocked;
@@ -569,6 +599,7 @@ TextureClient::Unlock()
mOpenMode = OpenMode::OPEN_NONE;
UnlockActor();
ReadUnlock();
}
void
@@ -1281,6 +1312,7 @@ TextureClient::TextureClient(TextureData* aData, TextureFlags aFlags, LayersIPCC
, mExpectedDtRefs(0)
#endif
, mIsLocked(false)
, mIsReadLocked(false)
, mUpdated(false)
, mAddedToCompositableClient(false)
, mWorkaroundAnnoyingSharedSurfaceLifetimeIssues(false)