From 7651ce5e843a9f3b9fb69a52e7d8a607e6f5e8f7 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 21 May 2017 11:52:43 -0700 Subject: [PATCH] Prevent racing connection start and stop --- .../com/limelight/nvstream/NvConnection.java | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/moonlight-common/src/main/java/com/limelight/nvstream/NvConnection.java b/moonlight-common/src/main/java/com/limelight/nvstream/NvConnection.java index 5aa736b4..ac80d2c1 100644 --- a/moonlight-common/src/main/java/com/limelight/nvstream/NvConnection.java +++ b/moonlight-common/src/main/java/com/limelight/nvstream/NvConnection.java @@ -63,8 +63,12 @@ public class NvConnection { } public void stop() { - MoonBridge.stopConnection(); - MoonBridge.cleanupBridge(); + // Moonlight-core is not thread-safe with respect to connection start and stop, so + // we must not invoke that functionality in parallel. + synchronized (MoonBridge.class) { + MoonBridge.stopConnection(); + MoonBridge.cleanupBridge(); + } } private boolean startApp() throws XmlPullParserException, IOException @@ -210,6 +214,13 @@ public class NvConnection { private void establishConnection() { String appName = context.streamConfig.getApp().getAppName(); + try { + context.serverAddress = InetAddress.getByName(host); + } catch (UnknownHostException e) { + context.connListener.connectionTerminated(-1); + return; + } + context.connListener.stageStarting(appName); try { @@ -234,22 +245,19 @@ public class NvConnection { context.videoCapabilities); } - public void start(AudioRenderer audioRenderer, VideoDecoderRenderer videoDecoderRenderer, NvConnectionListener connectionListener) + public void start(final AudioRenderer audioRenderer, final VideoDecoderRenderer videoDecoderRenderer, final NvConnectionListener connectionListener) { - MoonBridge.setupBridge(videoDecoderRenderer, audioRenderer, connectionListener); - context.connListener = connectionListener; - context.videoCapabilities = videoDecoderRenderer.getCapabilities(); - new Thread(new Runnable() { public void run() { - try { - context.serverAddress = InetAddress.getByName(host); - } catch (UnknownHostException e) { - context.connListener.connectionTerminated(-1); - return; + // Moonlight-core is not thread-safe with respect to connection start and stop, so + // we must not invoke that functionality in parallel. + synchronized (MoonBridge.class) { + MoonBridge.setupBridge(videoDecoderRenderer, audioRenderer, connectionListener); + context.connListener = connectionListener; + context.videoCapabilities = videoDecoderRenderer.getCapabilities(); + + establishConnection(); } - - establishConnection(); } }).start(); }