attempt to fix bug 5313580

the working theory here is that a Surface object has become non-promotable
because it lost its last reference; later Surface::readFromParcel is called
the previous surface is found in the cache, but can't be promoted. this causes
a new Surface object to be created which will promptly try to connect to the
CPU_API -- this in turn will fail because the previous (now dead) surface is
still connected.

To fix this, we make sure to disconnect from the SurfaceTexture when
Surface[TextureClient] is destroyed.

Change-Id: I422234868a05d7b7d283e9d5a85f7ab79e65d8a9
This commit is contained in:
Mathias Agopian 2011-11-17 18:46:09 -08:00
parent d858f05940
commit a36bcd53ac
2 changed files with 7 additions and 0 deletions

View File

@ -40,6 +40,7 @@ public:
protected:
SurfaceTextureClient();
virtual ~SurfaceTextureClient();
void setISurfaceTexture(const sp<ISurfaceTexture>& surfaceTexture);
private:

View File

@ -36,6 +36,12 @@ SurfaceTextureClient::SurfaceTextureClient() {
SurfaceTextureClient::init();
}
SurfaceTextureClient::~SurfaceTextureClient() {
if (mConnectedToCpu) {
SurfaceTextureClient::disconnect(NATIVE_WINDOW_API_CPU);
}
}
void SurfaceTextureClient::init() {
// Initialize the ANativeWindow function pointers.
ANativeWindow::setSwapInterval = hook_setSwapInterval;