SRADA-736: fix synchronization issues in StopTraceManager
authorVladislav Eliseev <v.eliseev@samsung.com>
Tue, 31 May 2016 13:58:05 +0000 (16:58 +0300)
committerMaria Guseva <m.guseva@samsung.com>
Fri, 1 Jul 2016 03:58:24 +0000 (06:58 +0300)
Now DAState will not be updated after stop trace request
until actual tracing process will not be completely finished.

Conflicts:
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StopTraceManager.java

Change-Id: I0b29fe7ed51781951edc0bd07ee71b8ffb79550e

org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StopTraceManager.java

index 5ec3912..7361875 100755 (executable)
@@ -59,12 +59,42 @@ public class StopTraceManager implements Runnable {
        private ProgressDialog progressDlg = null;
        private DAResult error;
        private boolean stopFromTarget = false;
-       private Boolean stopThreadCompleted = false;
+       private Thread stopThread = null;
        public StopTraceManager(DAResult err, boolean stopFromTarget) {
                this.error = err;
                this.stopFromTarget = stopFromTarget;           
        }
+
+       private static class ForcedStopThread extends Thread {
+               public void run() {
+                       // stop data channel
+                       DataChannelThread.getInstance().stopForced();           
+                       // stop message parser
+                       MessageParser.getInstance().stopForced();               
+                       // stop log parser
+                       LogParser.getInstance().stopForced();           
+                       // stop page data manager
+                       DataManagerRegistry.stopThreadsForced();                
+                       // stop other db inserters
+                       CallStackInserter.getInstance().stopForced();
+               }
+       }
        
+       private static class NormalStopThread extends Thread {
+               public void run() {
+                       // stop data channel
+                       DataChannelThread.getInstance().stopNormal();   
+                       // stop message parser
+                       MessageParser.getInstance().stopNormal();
+                       // stop log parser
+                       LogParser.getInstance().stopNormal();           
+                       // stop page data manager
+                       DataManagerRegistry.stopThreadsNormal();
+                       // stop other db inserters
+                       CallStackInserter.getInstance().stopNormal();
+               }
+       }
+
        @Override
        public void run() {
                // DAResult result = DAResult.SUCCESS;
@@ -100,52 +130,9 @@ public class StopTraceManager implements Runnable {
 
                        // if error code equals with canceling then stop threads by force
                        if (error.equals(DAResult.ErrorCode.ERR_BY_USER_CANCEL)) {
-                               Thread stopForcedThread = new Thread(new Runnable() {
-                                       public void run() {
-                                               synchronized(stopThreadCompleted){
-                                                       stopThreadCompleted=false;
-                                               }
-                                               // stop data channel
-                                               DataChannelThread.getInstance().stopForced();           
-                                               // stop message parser
-                                               MessageParser.getInstance().stopForced();               
-                                               // stop log parser
-                                               LogParser.getInstance().stopForced();           
-                                               // stop page data manager
-                                               DataManagerRegistry.stopThreadsForced();                
-                                               // stop other db inserters
-                                               CallStackInserter.getInstance().stopForced();
-                                               synchronized(stopThreadCompleted){
-                                                       stopThreadCompleted=true;
-                                               }
-                                       }
-                               });
-                               
-                               stopForcedThread.start();
-                               
+                               stopThread = new ForcedStopThread();
                        } else {
-                               Thread stopNormalThread = new Thread(new Runnable() {
-                                       public void run() {
-                                               synchronized(stopThreadCompleted){
-                                                       stopThreadCompleted=false;
-                                               }
-                                               // stop data channel
-                                               DataChannelThread.getInstance().stopNormal();   
-                                               // stop message parser
-                                               MessageParser.getInstance().stopNormal();
-                                               // stop log parser
-                                               LogParser.getInstance().stopNormal();           
-                                               // stop page data manager
-                                               DataManagerRegistry.stopThreadsNormal();
-                                               // stop other db inserters
-                                               CallStackInserter.getInstance().stopNormal();
-                                               synchronized(stopThreadCompleted){
-                                                       stopThreadCompleted=true;
-                                               }
-                                       }
-                               });
-                               
-                               stopNormalThread.start();
+                               stopThread = new NormalStopThread();
                                
                                Project project = Global.getProject();
                                if (project != null && project.isValid()) {
@@ -158,21 +145,23 @@ public class StopTraceManager implements Runnable {
                                
                        }
 
+                       stopThread.start();
+
                        // change summary UI
                        // change to summary page
                        UIActionHolder.getUIAction().applyStopTraceUI();
                        DLogDataManager.getInstance().stopDlog();
-                       Display.getDefault().syncExec(new Runnable() {
-                @Override
-                public void run() {
-                    BaseView baseView = (BaseView) WorkbenchUtil.getViewPart(BaseView.ID);                        
-                    baseView.getTopComposite().updateView();        
-                }
-            });
+                       if (Global.isGUIMode()) {
+                               Display.getDefault().syncExec(new Runnable() {
+                                       @Override
+                                       public void run() {
+                                               BaseView baseView = (BaseView) WorkbenchUtil.getViewPart(BaseView.ID);                        
+                                               baseView.getTopComposite().updateView();        
+                                       }
+                               });
+                       }
 
                } finally {
-                       // set DA state as result of start progress
-                       DAState.changeCurrentState(DAState.DONE);
 
                        // close progress dialog if not error case
                        if (progressDlg != null) {
@@ -189,16 +178,16 @@ public class StopTraceManager implements Runnable {
                                }
                        }
                        if (Global.isGUIMode()) {
-                               updateHeapDataManager();
-                               updateToolbar();
+                               startUpdateHeapDataManager();
                        }
+                       updateDAState();
                }
        }
 
        /**
         * Calculate allocation data in HeapDataManager.
         */
-       private void updateHeapDataManager() {
+       private void startUpdateHeapDataManager() {
                if(SettingDataManager.INSTANCE.getSelectedFeatureSet().contains(Feature.INTERNAL_PROBE_MEMORY)) {
                        Thread calculateAllocData = new Thread(new Runnable() {
                                public void run() {
@@ -220,46 +209,33 @@ public class StopTraceManager implements Runnable {
        }
 
        /**
-        * Enable ToolBar to wait while DataThreads clear completed.
+        * Wait while DataThreads clear completed then update DAState and ToolBar state.
         */
-       private void updateToolbar() {
-                       // Enable ToolBar wait DataThreads clear completed.
-                       Thread enableToolBar = new Thread(new Runnable() {
+       private void updateDAState() {
+               if (stopThread != null) {
+                       try {
+                               stopThread.join();
+                       } catch (InterruptedException e) {
+                               // TODO Auto-generated catch block
+                       }
+                       
+                       stopThread = null;
+               }
+                               
+               DAState.changeCurrentState(DAState.DONE);
+               if (Global.isGUIMode()) {
+                       // set shortcut and toolbar UI as DA state
+                       ShortCutManager.getInstance().setEnabled(true);
+                       Toolbar.INSTANCE.changeUIState(DAState.getCurrentState());
+                       Display.getDefault().syncExec(new Runnable() {
+                               @Override
                                public void run() {
-                                       boolean checkCompleted = false;
-                                       
-                                       synchronized(stopThreadCompleted){
-                                               checkCompleted = stopThreadCompleted;
-                                       }
-                                       
-                                       while(checkCompleted==false){
-                                               try {
-                                                       Thread.sleep(10);
-                                               } catch (InterruptedException e) {
-                                                       // TODO Auto-generated catch block
-                                                       break;
-                                               }
-                                               
-                                               synchronized(stopThreadCompleted){
-                                                       checkCompleted = stopThreadCompleted;
-                                               }
-                                       }
-                                       // set shortcut and toolbar UI as DA state
-                                       ShortCutManager.getInstance().setEnabled(true);
-                                       Toolbar.INSTANCE.changeUIState(DAState.getCurrentState());
-                                       Display.getDefault().syncExec(new Runnable() {
-                                               @Override
-                                               public void run() {
-                                                       MenuBar.getInstance().setMenuItemEnable(MenuBarLabels.FILE_SAVE, true);
-                                                       MenuBar.getInstance().setMenuItemEnable(MenuBarLabels.ANALYZE_SCREENSHOT, false);
-                                                       MenuBar.getInstance().setMenuItemEnable(MenuBarLabels.FILE_NEW, true);
-                                                       MenuBar.getInstance().setMenuItemEnable(MenuBarLabels.FILE_LOAD, true);
-                                               }
-                                       });
-                                       
-                                       
+                                       MenuBar.getInstance().setMenuItemEnable(MenuBarLabels.FILE_SAVE, true);
+                                       MenuBar.getInstance().setMenuItemEnable(MenuBarLabels.ANALYZE_SCREENSHOT, false);
+                                       MenuBar.getInstance().setMenuItemEnable(MenuBarLabels.FILE_NEW, true);
+                                       MenuBar.getInstance().setMenuItemEnable(MenuBarLabels.FILE_LOAD, true);
                                }
                        });
-                       enableToolBar.start();
+               }
        }
 }