Bug 1325227 - Part 5: Hold the read lock while the TextureClient is locked. r=nical
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user