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}