Skip to content

Commit 7011908

Browse files
committed
Ensure all threads to be closed
Fixes possible OOM error
1 parent db01360 commit 7011908

File tree

3 files changed

+44
-22
lines changed

3 files changed

+44
-22
lines changed

play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.microg.gms.gcm.mcs.LoginRequest;
3131
import org.microg.gms.gcm.mcs.LoginResponse;
3232

33+
import java.io.Closeable;
3334
import java.io.IOException;
3435
import java.io.InputStream;
3536

@@ -44,7 +45,7 @@
4445
import static org.microg.gms.gcm.McsConstants.MSG_INPUT_ERROR;
4546
import static org.microg.gms.gcm.McsConstants.MSG_TEARDOWN;
4647

47-
public class McsInputStream extends Thread {
48+
public class McsInputStream extends Thread implements Closeable {
4849
private static final String TAG = "GmsGcmMcsInput";
4950

5051
private final InputStream is;
@@ -56,6 +57,8 @@ public class McsInputStream extends Thread {
5657
private int streamId = 0;
5758
private long lastMsgTime = 0;
5859

60+
private boolean closed = false;
61+
5962
public McsInputStream(InputStream is, Handler mainHandler) {
6063
this(is, mainHandler, false);
6164
}
@@ -70,7 +73,7 @@ public McsInputStream(InputStream is, Handler mainHandler, boolean initialized)
7073
@Override
7174
public void run() {
7275
try {
73-
while (!Thread.currentThread().isInterrupted()) {
76+
while (!Thread.currentThread().isInterrupted() && !closed) {
7477
android.os.Message msg = read();
7578
if (msg != null) {
7679
mainHandler.dispatchMessage(msg);
@@ -88,8 +91,12 @@ public void run() {
8891
}
8992
}
9093

94+
@Override
9195
public void close() {
92-
interrupt();
96+
if (!closed) {
97+
closed = true;
98+
interrupt();
99+
}
93100
}
94101

95102
public int getStreamId() {

play-services-core/src/main/java/org/microg/gms/gcm/McsOutputStream.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,18 @@
2222

2323
import com.squareup.wire.Message;
2424

25-
import org.microg.gms.gcm.mcs.DataMessageStanza;
26-
import org.microg.gms.gcm.mcs.HeartbeatAck;
27-
import org.microg.gms.gcm.mcs.HeartbeatPing;
28-
import org.microg.gms.gcm.mcs.LoginRequest;
29-
25+
import java.io.Closeable;
3026
import java.io.IOException;
3127
import java.io.OutputStream;
3228

33-
import static org.microg.gms.gcm.McsConstants.MCS_DATA_MESSAGE_STANZA_TAG;
34-
import static org.microg.gms.gcm.McsConstants.MCS_HEARTBEAT_ACK_TAG;
35-
import static org.microg.gms.gcm.McsConstants.MCS_HEARTBEAT_PING_TAG;
36-
import static org.microg.gms.gcm.McsConstants.MCS_LOGIN_REQUEST_TAG;
3729
import static org.microg.gms.gcm.McsConstants.MCS_VERSION_CODE;
3830
import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT;
3931
import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT_DONE;
4032
import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT_ERROR;
4133
import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT_READY;
4234
import static org.microg.gms.gcm.McsConstants.MSG_TEARDOWN;
4335

44-
public class McsOutputStream extends Thread implements Handler.Callback {
36+
public class McsOutputStream extends Thread implements Handler.Callback, Closeable {
4537
private static final String TAG = "GmsGcmMcsOutput";
4638

4739
private final OutputStream os;
@@ -52,6 +44,8 @@ public class McsOutputStream extends Thread implements Handler.Callback {
5244
private Handler mainHandler;
5345
private Handler myHandler;
5446

47+
private boolean closed = false;
48+
5549
public McsOutputStream(OutputStream os, Handler mainHandler) {
5650
this(os, mainHandler, false);
5751
}
@@ -101,6 +95,15 @@ public boolean handleMessage(android.os.Message msg) {
10195
return false;
10296
}
10397

98+
@Override
99+
public void close() {
100+
if (!closed) {
101+
closed = true;
102+
myHandler.getLooper().quit();
103+
interrupt();
104+
}
105+
}
106+
104107
private synchronized void writeInternal(Message message, int tag) throws IOException {
105108
if (!initialized) {
106109
Log.d(TAG, "Write MCS version code: " + version);

play-services-core/src/main/java/org/microg/gms/gcm/McsService.java

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.microg.gms.gcm.mcs.LoginResponse;
4646
import org.microg.gms.gcm.mcs.Setting;
4747

48+
import java.io.Closeable;
4849
import java.net.Socket;
4950
import java.util.Collections;
5051
import java.util.List;
@@ -56,8 +57,6 @@
5657
import static org.microg.gms.gcm.GcmConstants.ACTION_C2DM_RECEIVE;
5758
import static org.microg.gms.gcm.GcmConstants.EXTRA_COLLAPSE_KEY;
5859
import static org.microg.gms.gcm.GcmConstants.EXTRA_FROM;
59-
import static org.microg.gms.gcm.GcmConstants.EXTRA_MESSAGE_TYPE;
60-
import static org.microg.gms.gcm.GcmConstants.MESSAGE_TYPE_GCM;
6160
import static org.microg.gms.gcm.McsConstants.ACTION_CONNECT;
6261
import static org.microg.gms.gcm.McsConstants.ACTION_HEARTBEAT;
6362
import static org.microg.gms.gcm.McsConstants.ACTION_RECONNECT;
@@ -110,6 +109,11 @@ public class McsService extends Service implements Handler.Callback {
110109
private Intent connectIntent;
111110

112111
private class HandlerThread extends Thread {
112+
113+
public HandlerThread() {
114+
setName("McsHandler");
115+
}
116+
113117
@Override
114118
public void run() {
115119
Looper.prepare();
@@ -155,8 +159,8 @@ public synchronized static boolean isConnected() {
155159
return false;
156160
}
157161
// consider connection to be dead if we did not receive an ack within twice the heartbeat interval
158-
if (SystemClock.elapsedRealtime() - lastHeartbeatAckElapsedRealtime < 2 * GcmPrefs.get(null).getHeartbeatMs()) {
159-
logd("No heartbeat for " + 2 * GcmPrefs.get(null).getHeartbeatMs() / 1000 + " seconds, connection seems to be dead.");
162+
if (SystemClock.elapsedRealtime() - lastHeartbeatAckElapsedRealtime > 2 * GcmPrefs.get(null).getHeartbeatMs()) {
163+
logd("No heartbeat for " + (SystemClock.elapsedRealtime() - lastHeartbeatAckElapsedRealtime) / 1000 + " seconds, connection assumed to be dead after " + 2 * GcmPrefs.get(null).getHeartbeatMs() / 1000 + " seconds");
160164
return false;
161165
}
162166
return true;
@@ -222,6 +226,8 @@ public int onStartCommand(Intent intent, int flags, int startId) {
222226

223227
private synchronized void connect() {
224228
try {
229+
tryClose(inputStream);
230+
tryClose(outputStream);
225231
logd("Starting MCS connection...");
226232
Socket socket = new Socket(SERVICE_HOST, SERVICE_PORT);
227233
logd("Connected to " + SERVICE_HOST + ":" + SERVICE_PORT);
@@ -434,12 +440,18 @@ private void handleInput(int type, Message message) {
434440
}
435441
}
436442

437-
private void handleTeardown(android.os.Message msg) {
438-
sendOutputStream(MSG_TEARDOWN, msg.arg1, msg.obj);
439-
if (inputStream != null) {
440-
inputStream.close();
441-
inputStream = null;
443+
private void tryClose(Closeable closeable) {
444+
if (closeable != null) {
445+
try {
446+
closeable.close();
447+
} catch (Exception ignored) {
448+
}
442449
}
450+
}
451+
452+
private void handleTeardown(android.os.Message msg) {
453+
tryClose(inputStream);
454+
tryClose(outputStream);
443455
try {
444456
sslSocket.close();
445457
} catch (Exception ignored) {

0 commit comments

Comments
 (0)