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