diff options
| author | Jamie Gennis <jgennis@google.com> | 2010-07-16 15:14:44 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-07-16 15:14:44 -0700 |
| commit | c8c79a654d4ae8e3a883854e19cc2df757f72d82 (patch) | |
| tree | c5efa0a0080a5b9860ac2cec6581593cad4ae2fe /libs/surfaceflinger_client/Surface.cpp | |
| parent | 00ba884436dc8b222ad850c73c936d87bf4e84de (diff) | |
| parent | 5ee65f0d441ca558bc95b60c1468f2aadfeeddbd (diff) | |
| download | frameworks_base-c8c79a654d4ae8e3a883854e19cc2df757f72d82.zip frameworks_base-c8c79a654d4ae8e3a883854e19cc2df757f72d82.tar.gz frameworks_base-c8c79a654d4ae8e3a883854e19cc2df757f72d82.tar.bz2 | |
Merge "Re-use existing Surface objects when reading them from parcels." into gingerbread
Diffstat (limited to 'libs/surfaceflinger_client/Surface.cpp')
| -rw-r--r-- | libs/surfaceflinger_client/Surface.cpp | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/libs/surfaceflinger_client/Surface.cpp b/libs/surfaceflinger_client/Surface.cpp index dc6332c..1de3a4f 100644 --- a/libs/surfaceflinger_client/Surface.cpp +++ b/libs/surfaceflinger_client/Surface.cpp @@ -374,15 +374,36 @@ status_t Surface::writeToParcel( } -sp<Surface> Surface::readFromParcel( - const Parcel& data, const sp<Surface>& other) -{ - sp<Surface> result(other); + +Mutex Surface::sCachedSurfacesLock; +DefaultKeyedVector<wp<IBinder>, wp<Surface> > Surface::sCachedSurfaces(wp<Surface>(0)); + +sp<Surface> Surface::readFromParcel(const Parcel& data) { + Mutex::Autolock _l(sCachedSurfacesLock); sp<IBinder> binder(data.readStrongBinder()); - if (other==0 || binder != other->mSurface->asBinder()) { - result = new Surface(data, binder); + sp<Surface> surface = sCachedSurfaces.valueFor(binder).promote(); + if (surface == 0) { + surface = new Surface(data, binder); + sCachedSurfaces.add(binder, surface); + } else { + LOGW("Reusing surface!"); + } + if (surface->mSurface == 0) { + surface = 0; + } + cleanCachedSurfaces(); + return surface; +} + +// Remove the stale entries from the surface cache. This should only be called +// with sCachedSurfacesLock held. +void Surface::cleanCachedSurfaces() { + for (int i = sCachedSurfaces.size()-1; i >= 0; --i) { + wp<Surface> s(sCachedSurfaces.valueAt(i)); + if (s == 0 || s.promote() == 0) { + sCachedSurfaces.removeItemsAt(i); + } } - return result; } void Surface::init() |
