diff options
author | Dianne Hackborn <hackbod@google.com> | 2011-11-08 10:59:28 -0800 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2011-11-08 10:59:28 -0800 |
commit | dd13793a257f4d7265bba33937bb442722d5d36b (patch) | |
tree | f12ca50d4ecc7a09ab0bc137b60a9b8c4e09728d /tests/FrameworkPerf | |
parent | 84b02130a9b3327343425cd4edfc1b85f1e9b23d (diff) | |
download | frameworks_base-dd13793a257f4d7265bba33937bb442722d5d36b.zip frameworks_base-dd13793a257f4d7265bba33937bb442722d5d36b.tar.gz frameworks_base-dd13793a257f4d7265bba33937bb442722d5d36b.tar.bz2 |
Cleanup remote execution of perf tests.
Change-Id: I0d00537194f3a70969220db16f57bda6f25e454b
Diffstat (limited to 'tests/FrameworkPerf')
-rw-r--r-- | tests/FrameworkPerf/src/com/android/frameworkperf/FrameworkPerfActivity.java | 89 | ||||
-rw-r--r-- | tests/FrameworkPerf/src/com/android/frameworkperf/TestService.java | 23 |
2 files changed, 92 insertions, 20 deletions
diff --git a/tests/FrameworkPerf/src/com/android/frameworkperf/FrameworkPerfActivity.java b/tests/FrameworkPerf/src/com/android/frameworkperf/FrameworkPerfActivity.java index 22eb579..175f227 100644 --- a/tests/FrameworkPerf/src/com/android/frameworkperf/FrameworkPerfActivity.java +++ b/tests/FrameworkPerf/src/com/android/frameworkperf/FrameworkPerfActivity.java @@ -20,6 +20,7 @@ import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; +import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -45,6 +46,7 @@ import java.util.ArrayList; public class FrameworkPerfActivity extends Activity implements AdapterView.OnItemSelectedListener { static final String TAG = "Perf"; + static final boolean DEBUG = false; Spinner mFgSpinner; Spinner mBgSpinner; @@ -67,22 +69,47 @@ public class FrameworkPerfActivity extends Activity TestService.Op mBgTest; int mCurOpIndex = 0; TestConnection mCurConnection; + boolean mConnectionBound; final ArrayList<RunResult> mResults = new ArrayList<RunResult>(); - class TestConnection implements ServiceConnection { + class TestConnection implements ServiceConnection, IBinder.DeathRecipient { Messenger mService; + boolean mLinked; @Override public void onServiceConnected(ComponentName name, IBinder service) { - mService = new Messenger(service); - dispatchCurOp(this); + try { + if (!(service instanceof Binder)) { + // If remote, we'll be killing ye. + service.linkToDeath(this, 0); + mLinked = true; + } + mService = new Messenger(service); + dispatchCurOp(this); + } catch (RemoteException e) { + // Whoops, service has disappeared... try starting again. + Log.w(TAG, "Test service died, starting again"); + startCurOp(); + } } @Override public void onServiceDisconnected(ComponentName name) { } + + @Override public void binderDied() { + cleanup(); + connectionDied(this); + } + + void cleanup() { + if (mLinked) { + mLinked = false; + mService.getBinder().unlinkToDeath(this, 0); + } + } } - static final int MSG_CONTINUE = 1000; + static final int MSG_DO_NEXT_TEST = 1000; final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { @@ -93,11 +120,7 @@ public class FrameworkPerfActivity extends Activity RunResult res = (RunResult)bundle.getParcelable("res"); completeCurOp(res); } break; - case TestService.RES_TERMINATED: { - // Give a little time for things to settle down. - sendMessageDelayed(obtainMessage(MSG_CONTINUE), 500); - } break; - case MSG_CONTINUE: { + case MSG_DO_NEXT_TEST: { startCurOp(); } break; } @@ -235,7 +258,7 @@ public class FrameworkPerfActivity extends Activity try { conn.mService.send(msg); } catch (RemoteException e) { - Log.i(TAG, "Failure communicating with service", e); + Log.w(TAG, "Failure communicating with service", e); } } @@ -273,29 +296,55 @@ public class FrameworkPerfActivity extends Activity } void disconnect() { - if (mCurConnection != null) { - unbindService(mCurConnection); - if (mCurConnection.mService != null) { + final TestConnection conn = mCurConnection; + if (conn != null) { + if (DEBUG) { + RuntimeException here = new RuntimeException("here"); + here.fillInStackTrace(); + Log.i(TAG, "Unbinding " + conn, here); + } + if (mConnectionBound) { + unbindService(conn); + mConnectionBound = false; + } + if (conn.mLinked) { Message msg = Message.obtain(null, TestService.CMD_TERMINATE); - msg.replyTo = mMessenger; try { - mCurConnection.mService.send(msg); + conn.mService.send(msg); + return; } catch (RemoteException e) { - Log.i(TAG, "Failure communicating with service", e); + Log.w(TAG, "Test service aleady died when terminating"); } } + conn.cleanup(); + } + connectionDied(conn); + } + + void connectionDied(TestConnection conn) { + if (mCurConnection == conn) { + // Now that we know the test process has died, we can commence + // the next test. Just give a little delay to allow the activity + // manager to know it has died as well (not a disaster if it hasn't + // yet, though). + if (mConnectionBound) { + unbindService(conn); + } mCurConnection = null; + mHandler.sendMessageDelayed(Message.obtain(null, MSG_DO_NEXT_TEST), 100); } } void startCurOp() { + if (DEBUG) Log.i(TAG, "startCurOp: mCurConnection=" + mCurConnection); if (mCurConnection != null) { disconnect(); + return; } if (mStarted) { mHandler.removeMessages(TestService.RES_TEST_FINISHED); mHandler.removeMessages(TestService.RES_TERMINATED); - mHandler.removeMessages(MSG_CONTINUE); + mHandler.removeMessages(MSG_DO_NEXT_TEST); mCurConnection = new TestConnection(); Intent intent; if (mLocalCheckBox.isChecked()) { @@ -303,7 +352,13 @@ public class FrameworkPerfActivity extends Activity } else { intent = new Intent(this, TestService.class); } + if (DEBUG) { + RuntimeException here = new RuntimeException("here"); + here.fillInStackTrace(); + Log.i(TAG, "Binding " + mCurConnection, here); + } bindService(intent, mCurConnection, BIND_AUTO_CREATE|BIND_IMPORTANT); + mConnectionBound = true; } } diff --git a/tests/FrameworkPerf/src/com/android/frameworkperf/TestService.java b/tests/FrameworkPerf/src/com/android/frameworkperf/TestService.java index ce27b65..3d939bd 100644 --- a/tests/FrameworkPerf/src/com/android/frameworkperf/TestService.java +++ b/tests/FrameworkPerf/src/com/android/frameworkperf/TestService.java @@ -138,7 +138,10 @@ public class TestService extends Service { static final int CMD_START_TEST = 1; static final int CMD_TERMINATE = 2; - + + static final int MSG_REALLY_START = 1000; + static final int MSG_REALLY_TERMINATE = 1001; + static final int RES_TEST_FINISHED = 1; static final int RES_TERMINATED = 2; @@ -146,6 +149,13 @@ public class TestService extends Service { @Override public void handleMessage(Message msg) { switch (msg.what) { case CMD_START_TEST: { + // Give a little time for things to settle down. + Message newMsg = Message.obtain(null, MSG_REALLY_START); + newMsg.obj = msg.obj; + newMsg.replyTo = msg.replyTo; + sendMessageDelayed(newMsg, 500); + } break; + case MSG_REALLY_START: { Bundle bundle = (Bundle)msg.obj; bundle.setClassLoader(getClassLoader()); final TestArgs args = (TestArgs)bundle.getParcelable("args"); @@ -166,6 +176,13 @@ public class TestService extends Service { }); } break; case CMD_TERMINATE: { + // Give a little time for things to settle down. + Message newMsg = Message.obtain(null, MSG_REALLY_TERMINATE); + newMsg.obj = msg.obj; + newMsg.replyTo = msg.replyTo; + sendMessageDelayed(newMsg, 50); + } break; + case MSG_REALLY_TERMINATE: { if (msg.replyTo != null) { Message reply = Message.obtain(null, RES_TERMINATED); try { @@ -174,7 +191,7 @@ public class TestService extends Service { } } terminate(); - } + } break; } } }; @@ -187,7 +204,7 @@ public class TestService extends Service { } void terminate() { - Process.killProcess(Process.myPid()); + Runtime.getRuntime().exit(0); } enum BackgroundMode { |