19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 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 com.android.internal.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
2489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport java.util.ArrayList;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Private and debugging Binder APIs.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see IBinder
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class BinderInternal {
3289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    static WeakReference<GcWatcher> sGcWatcher
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new WeakReference<GcWatcher>(new GcWatcher());
3489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    static ArrayList<Runnable> sGcWatchers = new ArrayList<>();
3589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    static Runnable[] sTmpWatchers = new Runnable[1];
3689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    static long sLastGcTime;
3789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final class GcWatcher {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected void finalize() throws Throwable {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handleGc();
4289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            sLastGcTime = SystemClock.uptimeMillis();
4389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            synchronized (sGcWatchers) {
4489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                sTmpWatchers = sGcWatchers.toArray(sTmpWatchers);
4589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
4689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            for (int i=0; i<sTmpWatchers.length; i++) {
4789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (sTmpWatchers[i] != null) {
4889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    sTmpWatchers[i].run();
4989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                }
5089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
5189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            sGcWatcher = new WeakReference<GcWatcher>(new GcWatcher());
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
5589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    public static void addGcWatcher(Runnable watcher) {
5689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        synchronized (sGcWatchers) {
5789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            sGcWatchers.add(watcher);
5889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
5989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    }
6089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add the calling thread to the IPC thread pool.  This function does
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not return until the current process is exiting.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void joinThreadPool();
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the system time (as reported by {@link SystemClock#uptimeMillis
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SystemClock.uptimeMillis()}) that the last garbage collection occurred
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in this process.  This is not for general application use, and the
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * meaning of "when a garbage collection occurred" will change as the
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * garbage collector evolves.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the time as per {@link SystemClock#uptimeMillis
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SystemClock.uptimeMillis()} of the last garbage collection.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static long getLastGcTime() {
7889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        return sLastGcTime;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the global "context object" of the system.  This is usually
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an implementation of IServiceManager, which you can use to find
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * other services.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native IBinder getContextObject();
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
88887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn    /**
89887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn     * Special for system process to not allow incoming calls to run at
90887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn     * background scheduling priority.
91887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn     * @hide
92887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn     */
93887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn    public static final native void disableBackgroundScheduling(boolean disable);
94887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static native final void handleGc();
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void forceGc(String reason) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EventLog.writeEvent(2741, reason);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().gc();
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void forceBinderGc() {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        forceGc("Binder");
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
106