19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.os.RuntimeInit; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Low-level class holding the list of messages to be dispatched by a 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Looper}. Messages are not added directly to a MessageQueue, 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but rather through {@link Handler} objects associated with the Looper. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>You can retrieve the MessageQueue for the current thread with 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Looper#myQueue() Looper.myQueue()}. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MessageQueue { 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message mMessages; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final ArrayList mIdleHandlers = new ArrayList(); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mQuiting = false; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mQuitAllowed = true; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Callback interface for discovering when a thread is going to block 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * waiting for more messages. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static interface IdleHandler { 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when the message queue has run out of messages and will now 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wait for more. Return true to keep your idle handler active, false 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to have it removed. This may be called if there are still messages 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pending in the queue, but they are all scheduled to be dispatched 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after the current time. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean queueIdle(); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a new {@link IdleHandler} to this message queue. This may be 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * removed automatically for you by returning false from 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link IdleHandler#queueIdle IdleHandler.queueIdle()} when it is 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invoked, or explicitly removing it with {@link #removeIdleHandler}. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This method is safe to call from any thread. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param handler The IdleHandler to be added. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void addIdleHandler(IdleHandler handler) { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (handler == null) { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("Can't add a null IdleHandler"); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIdleHandlers.add(handler); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove an {@link IdleHandler} from the queue that was previously added 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with {@link #addIdleHandler}. If the given object is not currently 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the idle list, nothing is done. 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param handler The IdleHandler to be removed. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void removeIdleHandler(IdleHandler handler) { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIdleHandlers.remove(handler); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MessageQueue() { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Message next() { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean tryIdle = true; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object[] idlers = null; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Try to retrieve the next message, returning if found. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project now = SystemClock.uptimeMillis(); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = pullNextLocked(now); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (msg != null) return msg; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tryIdle && mIdleHandlers.size() > 0) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project idlers = mIdleHandlers.toArray(); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // There was no message so we are going to wait... but first, 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if there are any idle handlers let them know. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean didIdle = false; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idlers != null) { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Object idler : idlers) { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean keep = false; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project didIdle = true; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keep = ((IdleHandler)idler).queueIdle(); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Throwable t) { 11860d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor Log.wtf("MessageQueue", "IdleHandler threw exception", t); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!keep) { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIdleHandlers.remove(idler); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // While calling an idle handler, a new message could have been 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // delivered... so go back and look again for a pending message. 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (didIdle) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tryIdle = false; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No messages, nobody to tell about it... time to wait! 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMessages != null) { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMessages.when-now > 0) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.flushPendingCommands(); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.wait(mMessages.when-now); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.flushPendingCommands(); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.wait(); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (InterruptedException e) { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Message pullNextLocked(long now) { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = mMessages; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (msg != null) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (now >= msg.when) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMessages = msg.next; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Config.LOGV) Log.v( 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "MessageQueue", "Returning message: " + msg); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return msg; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean enqueueMessage(Message msg, long when) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (msg.when != 0) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new AndroidRuntimeException(msg 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " This message is already in use."); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (msg.target == null && !mQuitAllowed) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Main thread not allowed to quit"); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mQuiting) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RuntimeException e = new RuntimeException( 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.target + " sending message to a Handler on a dead thread"); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("MessageQueue", e.getMessage(), e); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (msg.target == null) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQuiting = true; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.when = when; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.d("MessageQueue", "Enqueing: " + msg); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message p = mMessages; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null || when == 0 || when < p.when) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.next = p; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMessages = msg; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.notify(); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message prev = null; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p != null && p.when <= when) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prev = p; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = p.next; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.next = prev.next; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prev.next = msg; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.notify(); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean removeMessages(Handler h, int what, Object object, 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean doRemove) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message p = mMessages; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean found = false; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove all messages at front. 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p != null && p.target == h && p.what == what 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (object == null || p.obj == object)) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!doRemove) return true; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project found = true; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message n = p.next; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMessages = n; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.recycle(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = n; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove all messages after front. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p != null) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message n = p.next; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != null) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n.target == h && n.what == what 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (object == null || n.obj == object)) { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!doRemove) return true; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project found = true; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message nn = n.next; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n.recycle(); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.next = nn; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = n; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return found; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void removeMessages(Handler h, Runnable r, Object object) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r == null) { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message p = mMessages; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove all messages at front. 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p != null && p.target == h && p.callback == r 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (object == null || p.obj == object)) { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message n = p.next; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMessages = n; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.recycle(); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = n; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove all messages after front. 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p != null) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message n = p.next; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != null) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n.target == h && n.callback == r 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (object == null || n.obj == object)) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message nn = n.next; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n.recycle(); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.next = nn; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = n; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void removeCallbacksAndMessages(Handler h, Object object) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message p = mMessages; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove all messages at front. 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p != null && p.target == h 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (object == null || p.obj == object)) { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message n = p.next; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMessages = n; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.recycle(); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = n; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove all messages after front. 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p != null) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message n = p.next; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != null) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n.target == h && (object == null || n.obj == object)) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message nn = n.next; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n.recycle(); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.next = nn; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = n; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void dumpQueue_l() 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message p = mMessages; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(this + " queue is:"); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p != null) { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" " + p); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = p.next; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void poke() 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.notify(); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 328