fixed interupt handling
This commit is contained in:
parent
2b39acf352
commit
3a8855a672
|
@ -27,7 +27,9 @@ public class TagWriter {
|
||||||
try {
|
try {
|
||||||
AbstractStanza output = writeQueue.take();
|
AbstractStanza output = writeQueue.take();
|
||||||
outputStream.write(output.toString());
|
outputStream.write(output.toString());
|
||||||
|
if (writeQueue.size() == 0) {
|
||||||
outputStream.flush();
|
outputStream.flush();
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,8 @@ import java.util.Hashtable;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
|
@ -145,6 +147,8 @@ public class XmppConnection implements Runnable {
|
||||||
private SaslMechanism saslMechanism;
|
private SaslMechanism saslMechanism;
|
||||||
private URL redirectionUrl = null;
|
private URL redirectionUrl = null;
|
||||||
private String verifiedHostname = null;
|
private String verifiedHostname = null;
|
||||||
|
private Thread mThread;
|
||||||
|
private CountDownLatch mStreamCountDownLatch;
|
||||||
|
|
||||||
private class MyKeyManager implements X509KeyManager {
|
private class MyKeyManager implements X509KeyManager {
|
||||||
@Override
|
@Override
|
||||||
|
@ -502,7 +506,8 @@ public class XmppConnection implements Runnable {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
if (Thread.currentThread().isInterrupted()) {
|
this.mThread = Thread.currentThread();
|
||||||
|
if (this.mThread.isInterrupted()) {
|
||||||
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": aborting connect because thread was interrupted");
|
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": aborting connect because thread was interrupted");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -512,6 +517,8 @@ public class XmppConnection implements Runnable {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processStream() throws XmlPullParserException, IOException, NoSuchAlgorithmException {
|
private void processStream() throws XmlPullParserException, IOException, NoSuchAlgorithmException {
|
||||||
|
final CountDownLatch streamCountDownLatch = new CountDownLatch(1);
|
||||||
|
this.mStreamCountDownLatch = streamCountDownLatch;
|
||||||
Tag nextTag = tagReader.readTag();
|
Tag nextTag = tagReader.readTag();
|
||||||
while (nextTag != null && !nextTag.isEnd("stream")) {
|
while (nextTag != null && !nextTag.isEnd("stream")) {
|
||||||
if (nextTag.isStart("error")) {
|
if (nextTag.isStart("error")) {
|
||||||
|
@ -681,6 +688,9 @@ public class XmppConnection implements Runnable {
|
||||||
}
|
}
|
||||||
nextTag = tagReader.readTag();
|
nextTag = tagReader.readTag();
|
||||||
}
|
}
|
||||||
|
if (nextTag != null && nextTag.isEnd("stream")) {
|
||||||
|
streamCountDownLatch.countDown();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void acknowledgeStanzaUpTo(int serverCount) {
|
private void acknowledgeStanzaUpTo(int serverCount) {
|
||||||
|
@ -1460,7 +1470,9 @@ public class XmppConnection implements Runnable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void interrupt() {
|
public void interrupt() {
|
||||||
Thread.currentThread().interrupt();
|
if (this.mThread != null) {
|
||||||
|
this.mThread.interrupt();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void disconnect(final boolean force) {
|
public void disconnect(final boolean force) {
|
||||||
|
@ -1469,28 +1481,30 @@ public class XmppConnection implements Runnable {
|
||||||
if (force) {
|
if (force) {
|
||||||
forceCloseSocket();
|
forceCloseSocket();
|
||||||
} else {
|
} else {
|
||||||
if (tagWriter.isActive()) {
|
final TagWriter currentTagWriter = this.tagWriter;
|
||||||
tagWriter.finish();
|
if (currentTagWriter.isActive()) {
|
||||||
final Socket currentSocket = socket;
|
currentTagWriter.finish();
|
||||||
|
final Socket currentSocket = this.socket;
|
||||||
|
final CountDownLatch streamCountDownLatch = this.mStreamCountDownLatch;
|
||||||
try {
|
try {
|
||||||
for (int i = 0; i <= 10 && !tagWriter.finished() && !currentSocket.isClosed(); ++i) {
|
for (int i = 0; i <= 10 && !currentTagWriter.finished() && !currentSocket.isClosed(); ++i) {
|
||||||
uninterruptedSleep(100);
|
Thread.sleep(100);
|
||||||
}
|
}
|
||||||
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": closing stream");
|
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": closing stream");
|
||||||
tagWriter.writeTag(Tag.end("stream:stream"));
|
currentTagWriter.writeTag(Tag.end("stream:stream"));
|
||||||
for (int i = 0; i <= 20 && !currentSocket.isClosed(); ++i) {
|
if (streamCountDownLatch != null) {
|
||||||
uninterruptedSleep(100);
|
if (streamCountDownLatch.await(1, TimeUnit.SECONDS)) {
|
||||||
}
|
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": remote ended stream");
|
||||||
if (currentSocket.isClosed()) {
|
|
||||||
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": remote closed socket");
|
|
||||||
} else {
|
} else {
|
||||||
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": remote has not closed socket. force closing");
|
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": remote has not closed socket. force closing");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": interrupted while gracefully closing stream");
|
||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": io exception during disconnect (" + e.getMessage() + ")");
|
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": io exception during disconnect (" + e.getMessage() + ")");
|
||||||
} finally {
|
} finally {
|
||||||
FileBackend.close(currentSocket);
|
FileBackend.close(currentSocket);
|
||||||
forceCloseSocket();
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
forceCloseSocket();
|
forceCloseSocket();
|
||||||
|
|
Loading…
Reference in New Issue