From 5993e6365b81a4d756c54b6e6076fcaf3ab9c349 Mon Sep 17 00:00:00 2001 From: greatim Date: Mon, 9 Mar 2015 23:52:38 +0900 Subject: [PATCH] INTERNAL: stop forced when DA exit stop thread by force when DA exit change some caller code of AnalyzerManager.isExit() Change-Id: I1c49b5174f618ed2238bab2ef7ccb6bee3d45c26 Signed-off-by: greatim --- .../dynamicanalyzer/control/StartTraceManager.java | 4 +- .../dynamicanalyzer/control/StopTraceManager.java | 77 ++++++++++++++-------- .../dynamicanalyzer/handlers/ExitHandler.java | 5 +- .../swap/communicator/HeartBeatThread.java | 36 +++++----- 4 files changed, 77 insertions(+), 45 deletions(-) diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StartTraceManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StartTraceManager.java index 94606ad..03afaa7 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StartTraceManager.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StartTraceManager.java @@ -189,7 +189,7 @@ public class StartTraceManager implements Runnable { setStageComplete(STAGE.SEND_STARTMSG); // wait until process info message is arrived (for a few seconds) - while (!AnalyzerManager.isExit()) { + while (true) { if (AnalyzerManager.isRunning() && AnalyzerManager.isProcessInfoArrived()) { break; } @@ -344,7 +344,7 @@ public class StartTraceManager implements Runnable { } private void testCancel() throws InterruptedException { - if (startThread.isInterrupted()) { + if (startThread.isInterrupted() || AnalyzerManager.isExit()) { throw new InterruptedException(); } } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StopTraceManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StopTraceManager.java index df2358b..18c5fd8 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StopTraceManager.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StopTraceManager.java @@ -80,7 +80,7 @@ public class StopTraceManager implements Runnable { // stop resource monitor ResourceMonitor.stop(); setStageComplete(STAGE.STOP_RESOURCE_MONITOR); - + // send stop message if necessary if (!stopFromTarget) { DACommunicator.stopTrace(); @@ -104,42 +104,67 @@ public class StopTraceManager implements Runnable { UpdateViewTimer.stop(); setStageComplete(STAGE.STOP_UPDATE_TIMER); - // stop data channel - DataChannelThread.getInstance().stopNormal(); - setStageComplete(STAGE.STOP_DATATHREAD); - - // stop message parser - MessageParser.getInstance().stopNormal(); - setStageComplete(STAGE.STOP_MESSAGEPARSER); + // if error code equals with canceling then stop threads by force + if (error.equals(DAResult.ERR_BY_USER_CANCEL)) { + // stop data channel + DataChannelThread.getInstance().stopForced(); + setStageComplete(STAGE.STOP_DATATHREAD); - // stop log parser - LogParser.getInstance().stopNormal(); - setStageComplete(STAGE.STOP_LOGPARSER); + // stop message parser + MessageParser.getInstance().stopForced(); + setStageComplete(STAGE.STOP_MESSAGEPARSER); - // stop page data manager - DataManagerRegistry.stopThreadsNormal(); - setStageComplete(STAGE.STOP_PAGEMANAGER); + // stop log parser + LogParser.getInstance().stopForced(); + setStageComplete(STAGE.STOP_LOGPARSER); - // stop other db inserters - CallStackInserter.stopInserterThread(); + // stop page data manager + DataManagerRegistry.stopThreadsForced(); + setStageComplete(STAGE.STOP_PAGEMANAGER); - // save project and others - Project project = Global.getProject(); - if (project != null && project.isValid()) { - project.setTotalStopTime(Toolbar.INSTANCE.getTime()); - FunctionUsageProfiler.getInstance().saveProfilingData(); - FunctionUsageProfiler.getInstance().saveProfilingChildData(); - project.save(); + // stop other db inserters + CallStackInserter.stopInserterThread(); } else { - Logger.error("project is not valid to save"); + // stop data channel + DataChannelThread.getInstance().stopNormal(); + setStageComplete(STAGE.STOP_DATATHREAD); + + // stop message parser + MessageParser.getInstance().stopNormal(); + setStageComplete(STAGE.STOP_MESSAGEPARSER); + + // stop log parser + LogParser.getInstance().stopNormal(); + setStageComplete(STAGE.STOP_LOGPARSER); + + // stop page data manager + DataManagerRegistry.stopThreadsNormal(); + setStageComplete(STAGE.STOP_PAGEMANAGER); + + // stop other db inserters + CallStackInserter.stopInserterThread(); + + // save project and others + Project project = Global.getProject(); + if (project != null && project.isValid()) { + project.setTotalStopTime(Toolbar.INSTANCE.getTime()); + FunctionUsageProfiler.getInstance().saveProfilingData(); + FunctionUsageProfiler.getInstance().saveProfilingChildData(); + project.save(); + } else { + Logger.error("project is not valid to save"); + } + setStageComplete(STAGE.SAVE_PROJECT); } - setStageComplete(STAGE.SAVE_PROJECT); // change summary UI // change to summary page UIAction.applyStopTraceUI(); AnalyzerUtil.changePage(SummaryPage.pageID); setStageComplete(STAGE.SUMMARIZE_UI); + + // confirm that all stage run + setStageComplete(STAGE.FINAL); } catch (InterruptedException e) { // canceled stop tracing // never happened @@ -151,7 +176,7 @@ public class StopTraceManager implements Runnable { // close progress dialog if not error case if (progressDlg != null) { - if (error.isSuccess()) { + if (error.isSuccess() || error.equals(DAResult.ERR_BY_USER_CANCEL)) { Display.getDefault().syncExec(new Runnable() { @Override public void run() { diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/handlers/ExitHandler.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/handlers/ExitHandler.java index d4b9dd2..321f227 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/handlers/ExitHandler.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/handlers/ExitHandler.java @@ -43,9 +43,10 @@ public class ExitHandler extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { - CommandAction.stopTrace(DAResult.SUCCESS, false); - AnalyzerManager.setExit(true); + + CommandAction.stopTrace(DAResult.ERR_BY_USER_CANCEL, false); + SideWorker.stop(); IDECommunicator.stopIDEcommunicatorThread(); CommunicatorUtils.execCommand(AnalyzerShellCommands.DACOMMAND_KILL_MANAGER); diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/communicator/HeartBeatThread.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/communicator/HeartBeatThread.java index 8966eab..2aa3071 100755 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/communicator/HeartBeatThread.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/communicator/HeartBeatThread.java @@ -41,29 +41,35 @@ public class HeartBeatThread implements Runnable { public void run() { List devices = null; - while (!AnalyzerManager.isExit()) { - // devices.clear(); - devices = DACommunicator.getDevices(); - for (DeviceInfo device : devices) { - // Logger.debug("Heart Beat!!"); - DAResult result = DACommunicator.sendKeepAliveMessage(device); - if (!result.isSuccess()) { - Logger.debug(result.toString()); - } - if (AnalyzerManager.isExit()) { - break; + try { + while (true) { + // devices.clear(); + devices = DACommunicator.getDevices(); + for (DeviceInfo device : devices) { + // Logger.debug("Heart Beat!!"); + DAResult result = DACommunicator.sendKeepAliveMessage(device); + if (!result.isSuccess()) { + Logger.debug(result.toString()); + } + + testExit(); } - } - try { Thread.sleep(interval); - } catch (InterruptedException e) { - Logger.exception(e); + testExit(); } + } catch (InterruptedException e) { + Logger.exception(e); } } public static void setInterval(int miliSec) { interval = miliSec; } + + private static void testExit() throws InterruptedException { + if (AnalyzerManager.isExit()) { + throw new InterruptedException(); + } + } } -- 2.7.4