diff options
author | Bart Sears <bsears@google.com> | 2011-04-19 21:43:45 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-04-19 21:43:45 -0700 |
commit | 0357bffe4faf3b906879e8f180ddcc46d97687fc (patch) | |
tree | 2882de81c70be65f7abb62ea2db03e148e47398b /WebCore | |
parent | 8804f0848d7d3165c86cbb529e3b51cffdb4b56b (diff) | |
parent | 2a5297c67f4a20b7f54db311376fc641a8dfc030 (diff) | |
download | external_webkit-0357bffe4faf3b906879e8f180ddcc46d97687fc.zip external_webkit-0357bffe4faf3b906879e8f180ddcc46d97687fc.tar.gz external_webkit-0357bffe4faf3b906879e8f180ddcc46d97687fc.tar.bz2 |
Merge "DO NOT MERGE" into honeycomb-mr1
Diffstat (limited to 'WebCore')
3 files changed, 13 insertions, 6 deletions
diff --git a/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp index dc0962c..964422a 100644 --- a/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp +++ b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp @@ -137,6 +137,7 @@ void BackedDoubleBufferedTexture::setNotBusy() m_delayedRelease = false; m_delayedReleaseOwner = 0; } + m_busyCond.signal(); } bool BackedDoubleBufferedTexture::busy() @@ -189,7 +190,7 @@ void BackedDoubleBufferedTexture::producerUpdate(TextureInfo* textureInfo) producerReleaseAndSwap(); } -bool BackedDoubleBufferedTexture::acquire(TextureOwner* owner) +bool BackedDoubleBufferedTexture::acquire(TextureOwner* owner, bool force) { if (m_owner == owner) { if (m_delayedRelease) { @@ -199,7 +200,7 @@ bool BackedDoubleBufferedTexture::acquire(TextureOwner* owner) return true; } - return setOwner(owner); + return setOwner(owner, force); } bool BackedDoubleBufferedTexture::tryAcquire(TextureOwner* owner, TiledPage* currentPage, TiledPage* nextPage) @@ -216,13 +217,16 @@ bool BackedDoubleBufferedTexture::tryAcquire(TextureOwner* owner, TiledPage* cur return false; } -bool BackedDoubleBufferedTexture::setOwner(TextureOwner* owner) +bool BackedDoubleBufferedTexture::setOwner(TextureOwner* owner, bool force) { // if the writable texture is busy (i.e. currently being written to) then we // can't change the owner out from underneath that texture m_busyLock.lock(); + while (m_busy && force) + m_busyCond.wait(m_busyLock); bool busy = m_busy; m_busyLock.unlock(); + if (!busy) { // if we are not busy we can try to remove the texture from the layer; // LayerAndroid::removeTexture() is protected by the same lock as diff --git a/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.h b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.h index 8bfae59..7c2ea90 100644 --- a/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.h +++ b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.h @@ -88,12 +88,12 @@ public: // allows consumer thread to assign ownership of the texture to the tile. It // returns false if ownership cannot be transferred because the tile is busy - bool acquire(TextureOwner* owner); + bool acquire(TextureOwner* owner, bool force = false); bool release(TextureOwner* owner); bool tryAcquire(TextureOwner* owner, TiledPage* currentPage, TiledPage* nextPage); // set the texture owner if not busy. Return false if busy, true otherwise. - bool setOwner(TextureOwner* owner); + bool setOwner(TextureOwner* owner, bool force = false); // private member accessor functions TextureOwner* owner() { return m_owner; } // only used by the consumer thread @@ -136,6 +136,9 @@ private: // We mutex protect the reads/writes of m_busy to ensure that we are reading // the most up-to-date value even across processors in an SMP system. android::Mutex m_busyLock; + // We use this condition variable to signal that the texture + // is not busy anymore + android::Condition m_busyCond; }; } // namespace WebCore diff --git a/WebCore/platform/graphics/android/TilesManager.cpp b/WebCore/platform/graphics/android/TilesManager.cpp index afc53eb..5a9a164 100644 --- a/WebCore/platform/graphics/android/TilesManager.cpp +++ b/WebCore/platform/graphics/android/TilesManager.cpp @@ -249,7 +249,7 @@ LayerTexture* TilesManager::getExistingTextureForLayer(LayerAndroid* layer, layer->uniqueId(), layer); } - if (best && best->acquire(layer)) + if (best && best->acquire(layer, any)) return best; return 0; } |