155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz/* 255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * Copyright (C) 2017 The Android Open Source Project 355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * 455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * Licensed under the Apache License, Version 2.0 (the "License"); 555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * you may not use this file except in compliance with the License. 655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * You may obtain a copy of the License at 755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * 855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * http://www.apache.org/licenses/LICENSE-2.0 955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * 1055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * Unless required by applicable law or agreed to in writing, software 1155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * distributed under the License is distributed on an "AS IS" BASIS, 1255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * See the License for the specific language governing permissions and 1455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * limitations under the License. 1555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz */ 1655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 1755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzpackage com.android.frameworks.coretests.binderproxycountingtestservice; 1855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 1955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.app.Service; 2055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.Intent; 2155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.os.Debug; 2255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.os.Handler; 2355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.os.HandlerThread; 2455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.os.IBinder; 2555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.util.Log; 2655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 2755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport com.android.frameworks.coretests.aidl.IBpcCallbackObserver; 2855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport com.android.frameworks.coretests.aidl.IBpcTestServiceCmdService; 2955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport com.android.internal.os.BinderInternal; 3055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 3155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzpublic class BpcTestServiceCmdService extends Service { 3255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz private static final String TAG = BpcTestServiceCmdService.class.getSimpleName(); 3355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 3455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz //ServiceThread mHandlerThread; 3555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz Handler mHandler; 3655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz HandlerThread mHandlerThread; 3755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 3855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz private IBpcTestServiceCmdService.Stub mBinder = new IBpcTestServiceCmdService.Stub() { 3955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz IBpcCallbackObserver mCallbackObserver; 4055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 4155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 4255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void forceGc() { 4355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz int gcCount = Integer.parseInt(Debug.getRuntimeStat("art.gc.gc-count")); 4455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz int i = 20; 4555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz while (gcCount == Integer.parseInt(Debug.getRuntimeStat("art.gc.gc-count")) && i > 0) { 4655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz System.gc(); 4755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz System.runFinalization(); 4855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz i--; 4955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 5055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 5155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 5255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 5355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public int getBinderProxyCount(int uid) { 5455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz return BinderInternal.nGetBinderProxyCount(uid); 5555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 5655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 5755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 5855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void setBinderProxyWatermarks(int high, int low) { 5955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz BinderInternal.nSetBinderProxyCountWatermarks(high, low); 6055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 6155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 6255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 6355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void enableBinderProxyLimit(boolean enable) { 6455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz BinderInternal.nSetBinderProxyCountEnabled(enable); 6555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 6655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 6755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 6855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void setBinderProxyCountCallback(IBpcCallbackObserver observer) { 6955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz if (observer != null) { 7055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz BinderInternal.setBinderProxyCountCallback( 7155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz new BinderInternal.BinderProxyLimitListener() { 7255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 7355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void onLimitReached(int uid) { 7455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz try { 7555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz synchronized (observer) { 7655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz observer.onCallback(uid); 7755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 7855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } catch (Exception e) { 7955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz Log.e(TAG, e.toString()); 8055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 8155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 8255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz }, mHandler); 8355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } else { 8455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz BinderInternal.clearBinderProxyCountCallback(); 8555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 8655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 8755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz }; 8855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 8955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 9055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public IBinder onBind(Intent intent) { 9155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz return mBinder; 9255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 9355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 9455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 9555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void onCreate() 9655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz { 9755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz mHandlerThread = new HandlerThread("BinderProxyCountingServiceThread"); 9855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz mHandlerThread.start(); 9955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz mHandler = new Handler(mHandlerThread.getLooper()); 10055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 10155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz}