am f5f7d389: am fae5cb2b: optimize Surface.readFromParcel()
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 838ef22..06fa84b 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+#define LOG_TAG "Surface"
+
 #include <stdio.h>
 
 #include "android_util_Binder.h"
@@ -226,8 +228,9 @@
         doThrow(env, "java/lang/NullPointerException", NULL);
         return;
     }
-    sp<Surface> rhs = new Surface(*parcel);
-    setSurface(env, clazz, rhs);
+
+    sp<Surface> sur(Surface::readFromParcel(*parcel, 0));
+    setSurface(env, clazz, sur);
 }
 
 static jint Surface_getIdentity(JNIEnv* env, jobject clazz)
@@ -586,7 +589,7 @@
      * a Surface and is necessary for returning the Surface reference to
      * the caller. At this point, we should only have a SurfaceControl.
      */
-    
+
     const sp<SurfaceControl>& surface = getSurfaceControl(env, clazz);
     const sp<SurfaceControl>& rhs = getSurfaceControl(env, other);
     if (!SurfaceControl::isSameSurface(surface, rhs)) {
@@ -605,13 +608,9 @@
         return;
     }
 
-    const sp<Surface>& control(getSurface(env, clazz));
-    sp<Surface> rhs = new Surface(*parcel);
-    if (!Surface::isSameSurface(control, rhs)) {
-        // we reassign the surface only if it's a different one
-        // otherwise we would loose our client-side state.
-        setSurface(env, clazz, rhs);
-    }
+    const sp<Surface>& curr(getSurface(env, clazz));
+    sp<Surface> sur(Surface::readFromParcel(*parcel, curr));
+    setSurface(env, clazz, sur);
 }
 
 static void Surface_writeToParcel(
diff --git a/include/surfaceflinger/Surface.h b/include/surfaceflinger/Surface.h
index 67dc693..ac01ce5 100644
--- a/include/surfaceflinger/Surface.h
+++ b/include/surfaceflinger/Surface.h
@@ -145,15 +145,13 @@
         uint32_t    reserved[2];
     };
 
-    Surface(const Parcel& data);
+    static sp<Surface> readFromParcel(
+            const Parcel& data, const sp<Surface>& other);
 
     static bool isValid(const sp<Surface>& surface) {
         return (surface != 0) && surface->isValid();
     }
 
-    static bool isSameSurface(
-            const sp<Surface>& lhs, const sp<Surface>& rhs);
-
     bool        isValid();
     SurfaceID   ID() const          { return mToken; }
     uint32_t    getFlags() const    { return mFlags; }
@@ -191,6 +189,7 @@
     Surface(const Surface& rhs);
 
     Surface(const sp<SurfaceControl>& control);
+    Surface(const Parcel& data, const sp<IBinder>& ref);
     ~Surface();
 
 
diff --git a/libs/surfaceflinger_client/Surface.cpp b/libs/surfaceflinger_client/Surface.cpp
index 01420fe..6fe4c4a 100644
--- a/libs/surfaceflinger_client/Surface.cpp
+++ b/libs/surfaceflinger_client/Surface.cpp
@@ -334,13 +334,13 @@
     init();
 }
 
-Surface::Surface(const Parcel& parcel)
+Surface::Surface(const Parcel& parcel, const sp<IBinder>& ref)
     : mBufferMapper(GraphicBufferMapper::get()),
       mClient(SurfaceClient::getInstance()),
       mSharedBufferClient(NULL),
       mInitCheck(NO_INIT)
 {
-    mSurface    = interface_cast<ISurface>(parcel.readStrongBinder());
+    mSurface    = interface_cast<ISurface>(ref);
     mIdentity   = parcel.readInt32();
     mWidth      = parcel.readInt32();
     mHeight     = parcel.readInt32();
@@ -349,6 +349,17 @@
     init();
 }
 
+sp<Surface> Surface::readFromParcel(
+        const Parcel& data, const sp<Surface>& other)
+{
+    sp<Surface> result(other);
+    sp<IBinder> binder(data.readStrongBinder());
+    if (other==0 || binder != other->mSurface->asBinder()) {
+        result = new Surface(data, binder);
+    }
+    return result;
+}
+
 void Surface::init()
 {
     android_native_window_t::setSwapInterval  = setSwapInterval;
@@ -443,12 +454,6 @@
     return NO_ERROR;
 }
 
-bool Surface::isSameSurface(const sp<Surface>& lhs, const sp<Surface>& rhs) {
-    if (lhs == 0 || rhs == 0)
-        return false;
-    return lhs->mSurface->asBinder() == rhs->mSurface->asBinder();
-}
-
 sp<ISurface> Surface::getISurface() const {
     return mSurface;
 }