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