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));
     }