Test failure root cause:
there is data race between shutDown() and run() of bitmap class:
1st thread sets mQuit field to true and yields to 2nd thread w/o
sending interrupt signal to 2nd thread; 2nd thread checks mQuit
field and exits w/o printing "intr" message.
In other execution scenario, 1st thread yield to 2nd thread only
after sending interrupt signal thus causing 2nd thread to execute
catch InterruptedException block and print "intr" message
(expected test case behavior).
Proposed solution: add proper synchronization between
Bitmap.shutDown() and run() by removing mQuit field and exiting
shutDown when "intr" message is printed.
Change-Id: I91946b7fb8bfb6ff2039c40384f8647ba4da98a4
Signed-off-by: randy.jeong <randy.jeong@samsung.com>
*/
class BitmapWatcher extends Thread {
ReferenceQueue<PhantomWrapper> mQueue;
- volatile boolean mQuit = false;
BitmapWatcher(ReferenceQueue<PhantomWrapper> queue) {
mQueue = queue;
}
public void run() {
- while (!mQuit) {
+ while (true) {
try {
PhantomWrapper ref = (PhantomWrapper) mQueue.remove();
//System.out.println("dequeued ref " + ref.mNativeData +
//ref.clear();
} catch (InterruptedException ie) {
System.out.println("intr");
+ break;
}
}
}
public void shutDown() {
- mQuit = true;
interrupt();
}
}