From 2f046187ca3b49aded86833b0c8bbe25abe5da53 Mon Sep 17 00:00:00 2001 From: David Willis Date: Sun, 10 Feb 2013 01:20:11 +0000 Subject: [PATCH] OP-825 Fix null reference and race condition when shutting down service --- .../androidgcs/telemetry/OPTelemetryService.java | 8 +++++++- .../androidgcs/telemetry/TelemetryTask.java | 16 ++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/androidgcs/src/org/openpilot/androidgcs/telemetry/OPTelemetryService.java b/androidgcs/src/org/openpilot/androidgcs/telemetry/OPTelemetryService.java index 965a0aac4..7a2003588 100644 --- a/androidgcs/src/org/openpilot/androidgcs/telemetry/OPTelemetryService.java +++ b/androidgcs/src/org/openpilot/androidgcs/telemetry/OPTelemetryService.java @@ -241,7 +241,13 @@ public class OPTelemetryService extends Service { telemTask = null; try { - activeTelem.join(); + // Race condition - if we shut the service down before the telemetry task + // thread has started, this will hang so we need to check thread is runnable. + if(activeTelem.getState() == Thread.State.RUNNABLE){ + activeTelem.join(); + }else{ + Log.d(TAG, "onDestroy() shut down telemetry task before it has started"); + } } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/androidgcs/src/org/openpilot/androidgcs/telemetry/TelemetryTask.java b/androidgcs/src/org/openpilot/androidgcs/telemetry/TelemetryTask.java index ad23b2e00..dd1650487 100644 --- a/androidgcs/src/org/openpilot/androidgcs/telemetry/TelemetryTask.java +++ b/androidgcs/src/org/openpilot/androidgcs/telemetry/TelemetryTask.java @@ -142,12 +142,16 @@ public abstract class TelemetryTask implements Runnable { } // Stop the master telemetry thread - handler.post(new Runnable() { - @Override - public void run() { - Looper.myLooper().quit(); - } - }); + // Check handler is not null: if we attempt to disconnect before + // the connect process has completed, handler may be null. + if(handler != null){ + handler.post(new Runnable() { + @Override + public void run() { + Looper.myLooper().quit(); + } + }); + } if (inputProcessThread != null) { inputProcessThread.interrupt();