From b164a3666ca1f6b07e617e26c2b8d8dca17e6e55 Mon Sep 17 00:00:00 2001 From: zhenchao Date: Fri, 4 Mar 2016 16:31:14 +0800 Subject: Bluetooth-OPP: Use a volatile variable to denote interrupt status Sometimes, isInterrupted() can not return true and no interruptedException throw after uiUpdateThread.interrupt(), which cause the dead loop in ContentResolverUpdateThread. So a volatie variable is used instead of isInterrupted() to denote interrupt status. CRs-Fixed: 979690 Change-Id: I45ec1c20b5a381ba75aca589c28a0ddd94573d0c --- .../bluetooth/opp/BluetoothOppObexClientSession.java | 18 +++++++++++++++++- .../bluetooth/opp/BluetoothOppObexServerSession.java | 13 +++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) (limited to 'src/com') diff --git a/src/com/android/bluetooth/opp/BluetoothOppObexClientSession.java b/src/com/android/bluetooth/opp/BluetoothOppObexClientSession.java index e2ecfc5b8..63de591b5 100644 --- a/src/com/android/bluetooth/opp/BluetoothOppObexClientSession.java +++ b/src/com/android/bluetooth/opp/BluetoothOppObexClientSession.java @@ -128,11 +128,13 @@ public class BluetoothOppObexClientSession implements BluetoothOppObexSession { private static final int sSleepTime = 1000; private Uri contentUri; private Context mContext1; + private volatile boolean interrupted = false; public ContentResolverUpdateThread(Context context, Uri cntUri) { super("BtOpp ContentResolverUpdateThread"); mContext1 = context; contentUri = cntUri; + interrupted = false; } @@ -143,19 +145,33 @@ public class BluetoothOppObexClientSession implements BluetoothOppObexSession { ContentValues updateValues; if (V) Log.v(TAG, "Is ContentResolverUpdateThread Interrupted :" + isInterrupted()); /* Check if the Operation is interrupted before entering into loop */ - while (!isInterrupted()) { + while (!interrupted) { updateValues = new ContentValues(); updateValues.put(BluetoothShare.CURRENT_BYTES, position); mContext1.getContentResolver().update(contentUri, updateValues, null, null); + + /* Check if the Operation is interrupted before entering sleep */ + if (interrupted) { + if (V) Log.v(TAG, "ContentResolverUpdateThread was interrupted before sleep !, exiting"); + return; + } + try { Thread.sleep(sSleepTime); } catch (InterruptedException e1) { if (V) Log.v(TAG, "ContentResolverUpdateThread was interrupted (1), exiting"); + interrupted = true; return; } } } + + @Override + public void interrupt() { + interrupted = true; + super.interrupt(); + } } private class ClientThread extends Thread { diff --git a/src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java b/src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java index 2113fe4d5..07e0c7689 100644 --- a/src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java +++ b/src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java @@ -173,11 +173,13 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen private static final int sSleepTime = 1000; private Uri contentUri; private Context mContext1; + private volatile boolean interrupted = false; public ContentResolverUpdateThread(Context context, Uri cntUri) { super("BtOpp Server ContentResolverUpdateThread"); mContext1 = context; contentUri = cntUri; + interrupted = false; } @Override @@ -188,14 +190,14 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen if (V) Log.v(TAG, "Is ContentResolverUpdateThread Interrupted :" + isInterrupted()); /* Check if the Operation is interrupted before entering into loop */ - while ( !isInterrupted() ) { + while (!interrupted) { updateValues = new ContentValues(); updateValues.put(BluetoothShare.CURRENT_BYTES, position); mContext1.getContentResolver().update(contentUri, updateValues, null, null); /* Check if the Operation is interrupted before entering sleep */ - if (isInterrupted()) { + if (interrupted) { if (V) Log.v(TAG, "ContentResolverUpdateThread was interrupted before sleep !,"+ " exiting"); return ; @@ -205,10 +207,17 @@ public class BluetoothOppObexServerSession extends ServerRequestHandler implemen } catch (InterruptedException e1) { if (V) Log.v(TAG, "Server ContentResolverUpdateThread was interrupted (1),"+ " exiting"); + interrupted = true; return ; } } } + + @Override + public void interrupt() { + interrupted = true; + super.interrupt(); + } } /* * Called when a ABORT request is received. -- cgit v1.2.3