Merge "Fix IllegalThreadStateException crash, add logging for NetworkedVirtualDisplay thread handler" into qt-dev
am: 0e95d87b2c
Change-Id: I484cef0a8c607dd84d167463bbed9684addcdfa6
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
index 871d93f..ba64ce5 100644
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
@@ -284,18 +284,9 @@
Log.i(TAG, "Casting stopped");
}
- private synchronized void restart() {
- // This method could be called from different threads when receiver has disconnected.
- if (mHandler.hasMessages(MSG_START)) return;
- mHandler.sendMessage(Message.obtain(mHandler, MSG_STOP));
- mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
- }
-
private class BroadcastThreadHandler extends Handler {
private static final int MAX_FAIL_COUNT = 10;
private int mFailConnectCounter;
- private SocketThread mSocketThread;
- private PipeThread mPipeThread;
BroadcastThreadHandler(Looper looper) {
super(looper);
@@ -306,6 +297,13 @@
switch (msg.what) {
case MSG_START:
Log.i(TAG, "Received start message");
+
+ // Make sure mActiveThread cannot start multiple times
+ if (mActiveThread != null) {
+ Log.w(TAG, "Trying to start a running thread. Race condition may exist");
+ break;
+ }
+
// Failure to connect to either pipe or network returns null
if (mActiveThread == null) {
mActiveThread = tryPipeConnect();
@@ -324,10 +322,16 @@
mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
break;
}
- mFailConnectCounter = 0;
- mCounter.clientsConnected++;
- mActiveThread.start();
- startCasting(this);
+
+ try {
+ mFailConnectCounter = 0;
+ mCounter.clientsConnected++;
+ mActiveThread.start();
+ startCasting(this);
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to start thread", e);
+ Log.e(TAG, "DebugCounter: " + mCounter);
+ }
break;
case MSG_STOP:
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
index 2c7f0d6..9def7ee 100644
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
@@ -16,11 +16,14 @@
package android.car.cluster.sample;
import android.os.Handler;
import android.os.Message;
+import android.util.Log;
/**
* This class serves as a template for sending to specific clients of the broadcaster.
*/
public abstract class SenderThread extends Thread {
+ private static final String TAG = "Cluster.SenderThread";
+
private Handler mHandler;
SenderThread(Handler handler) {
@@ -34,8 +37,10 @@
* Tells the broadcasting thread to stop and close everything in progress, and start over again.
* It will kill the current instance of this thread, and produce a new one.
*/
- void restart() {
+ synchronized void restart() {
if (mHandler.hasMessages(NetworkedVirtualDisplay.MSG_START)) return;
+ Log.i(TAG, "Sending STOP and START msgs to NetworkedVirtualDisplay");
+
mHandler.sendMessage(Message.obtain(mHandler, NetworkedVirtualDisplay.MSG_STOP));
mHandler.sendMessage(Message.obtain(mHandler, NetworkedVirtualDisplay.MSG_START));
}