RenderScript cts: Fix issues related to concurrency.

Use a volatile qualifier for msgHandled in RSBase, since the flag
is accessed by multiple threads at the same time.

Ensure that checkForErrors() is called after waitForMessage() to
avoid a race condition.

Change-Id: I6d3811f16003d891d79ad5efe9d6f34a50132576
(cherry picked from commit a73d4999fcb8433d6c8cdff0f2e22a5e2b538294)
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
index b90633e..38831f4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
@@ -475,8 +475,8 @@
         s.invoke_verify_foo();
         s.invoke_foreach_test();
         mRS.finish();
-        checkForErrors();
         waitForMessage();
+        checkForErrors();
     }
 
     public void testNoRoot() {
@@ -494,7 +494,7 @@
         s.invoke_verify_foo();
         s.invoke_noroot_test();
         mRS.finish();
-        checkForErrors();
         waitForMessage();
+        checkForErrors();
     }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java b/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
index 64368b6..90d4fe9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
@@ -475,8 +475,8 @@
         s.invoke_verify_foo();
         s.invoke_foreach_test();
         mRS.finish();
-        checkForErrors();
         waitForMessage();
+        checkForErrors();
     }
 
     public void testNoRoot() {
@@ -494,7 +494,7 @@
         s.invoke_verify_foo();
         s.invoke_noroot_test();
         mRS.finish();
-        checkForErrors();
         waitForMessage();
+        checkForErrors();
     }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java b/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
index 0175c38..2ca4f13 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
@@ -34,7 +34,9 @@
     Resources mRes;
 
     private int result;
-    private boolean msgHandled;
+    // msgHandled is used to synchronize between waitForMessage() and the
+    // RSMessageHandler thread.
+    private volatile boolean msgHandled;
 
     protected static final int RS_MSG_TEST_PASSED = 100;
     protected static final int RS_MSG_TEST_FAILED = 101;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
index bc69b0e..a468b9f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
@@ -92,8 +92,8 @@
     public void testNearest() {
         mScript.invoke_test_RGBA(mAlloc_RGBA_1D, mAlloc_RGBA_2D);
         mRS.finish();
-        checkForErrors();
         waitForMessage();
+        checkForErrors();
     }
 }