OSDN Git Service

Attempt to reduce problems from issue #3183612
authorDianne Hackborn <hackbod@google.com>
Wed, 9 Feb 2011 22:19:23 +0000 (14:19 -0800)
committerDianne Hackborn <hackbod@google.com>
Wed, 9 Feb 2011 22:19:23 +0000 (14:19 -0800)
java.lang.SecurityException: Neither user 1209 nor current...
...process has android.permission.WAKE_LOCK.

It looks like, somehow, the calling uid/pid of the SyncHandler
thread is getting corrupted.  This change has Looper check for
these values changing from their original defaults and, if there
is a problem, resetting them and logging a WTF.  Hopefully this
will avoid crashing the process, while also giving us more
helpful error reports about what is going on.

Change-Id: Iff06d575951fb8c06e2a3c31141f2907a715eb81

core/java/android/os/Looper.java

index d360140..994c242 100644 (file)
@@ -17,6 +17,7 @@
 package android.os;
 
 import android.util.Config;
+import android.util.Log;
 import android.util.Printer;
 
 /**
@@ -106,6 +107,12 @@ public class Looper {
     public static final void loop() {
         Looper me = myLooper();
         MessageQueue queue = me.mQueue;
+        
+        // Make sure the identity of this thread is that of the local process,
+        // and keep track of what that identity token actually is.
+        Binder.clearCallingIdentity();
+        final long ident = Binder.clearCallingIdentity();
+        
         while (true) {
             Message msg = queue.next(); // might block
             //if (!me.mRun) {
@@ -124,6 +131,17 @@ public class Looper {
                 if (me.mLogging!= null) me.mLogging.println(
                         "<<<<< Finished to    " + msg.target + " "
                         + msg.callback);
+                
+                // Make sure that during the course of dispatching the
+                // identity of the thread wasn't corrupted.
+                final long newIdent = Binder.clearCallingIdentity();
+                if (ident != newIdent) {
+                    Log.wtf("Looper", "Thread identity changed from 0x"
+                            + Long.toHexString(ident) + " to 0x"
+                            + Long.toHexString(newIdent) + " while dispatching to "
+                            + msg.target + " " + msg.callback + " what=" + msg.what);
+                }
+                
                 msg.recycle();
             }
         }