@@ -102,7 +102,7 @@ public class StateSystemDataProvider extends AbstractTmfTraceDataProvider implem
102102 private final Map <Long , ITmfStateSystem > fIdToSs = new HashMap <>();
103103 private final Map <Long , ModuleEntryModel > fIdToModuleEntryModel = new HashMap <>();
104104
105- private final Map <ITmfAnalysisModuleWithStateSystems , Boolean > fModulesToStatus = new HashMap <>();
105+ private final Map <ITmfAnalysisModuleWithStateSystems , Boolean > fModulesToStatus = new ConcurrentHashMap <>();
106106
107107 /*
108108 * Entry Builder is a table to stash the entries so it won't duplicate the
@@ -148,16 +148,16 @@ public class StateSystemDataProvider extends AbstractTmfTraceDataProvider implem
148148 }
149149
150150 private static final Comparator <ITimeGraphEntryModel > NAME_COMPARATOR = (a , b ) -> {
151- if (a instanceof TraceEntryModel && b instanceof TraceEntryModel ) {
152- ITmfTrace ta = ((TraceEntryModel ) a ).getTrace ();
153- ITmfTrace tb = ((TraceEntryModel ) b ).getTrace ();
154- // Puts the experiment entries at the top of the list
155- if (ta instanceof TmfExperiment && !(tb instanceof TmfExperiment )) {
156- return -1 ;
157- } else if (!(ta instanceof TmfExperiment ) && (tb instanceof TmfExperiment )) {
158- return 1 ;
159- }
151+ if (a instanceof TraceEntryModel && b instanceof TraceEntryModel ) {
152+ ITmfTrace ta = ((TraceEntryModel ) a ).getTrace ();
153+ ITmfTrace tb = ((TraceEntryModel ) b ).getTrace ();
154+ // Puts the experiment entries at the top of the list
155+ if (ta instanceof TmfExperiment && !(tb instanceof TmfExperiment )) {
156+ return -1 ;
157+ } else if (!(ta instanceof TmfExperiment ) && (tb instanceof TmfExperiment )) {
158+ return 1 ;
160159 }
160+ }
161161
162162 try {
163163 return Long .compare (Long .parseLong (a .getName ()), Long .parseLong (b .getName ()));
@@ -176,8 +176,34 @@ public class StateSystemDataProvider extends AbstractTmfTraceDataProvider implem
176176 */
177177 public StateSystemDataProvider (ITmfTrace trace ) {
178178 super (trace );
179+ updateRegisteredAnalysisModules (trace );
180+ }
181+
182+ private void updateRegisteredAnalysisModules (ITmfTrace trace ) {
183+ Set <ITmfAnalysisModuleWithStateSystems > traceAnalyses = new HashSet <>(fModulesToStatus .keySet ());
179184 for (ITmfAnalysisModuleWithStateSystems module : Objects .requireNonNull (Iterables .filter (trace .getAnalysisModules (), ITmfAnalysisModuleWithStateSystems .class ))) {
180- fModulesToStatus .put (module , false );
185+ traceAnalyses .remove (module );
186+ fModulesToStatus .putIfAbsent (module , false );
187+ }
188+
189+ // Remove any deleted state system modules
190+ synchronized (fEntryBuilder ) {
191+ for (ITmfAnalysisModuleWithStateSystems module : traceAnalyses ) {
192+ // Remove module
193+ fModulesToStatus .remove (module );
194+ // Remove corresponding entries
195+ String traceName = Objects .requireNonNull (trace .getName ());
196+ EntryModelBuilder entry = fEntryBuilder .get (-1L , traceName );
197+ if (entry != null ) {
198+ long parentId = entry .getId ();
199+ entry = fEntryBuilder .get (parentId , module .getName ());
200+ if (entry != null ) {
201+ // Delete module entry and its children
202+ removeEntryAndChildren (entry .getId ());
203+ fEntryBuilder .remove (parentId , module .getName ());
204+ }
205+ }
206+ }
181207 }
182208 }
183209
@@ -506,6 +532,7 @@ public int getQuark() {
506532
507533 @ Override
508534 public @ NonNull TmfModelResponse <TmfTreeModel <TimeGraphEntryModel >> fetchTree (Map <String , Object > fetchParameters , @ Nullable IProgressMonitor monitor ) {
535+
509536 // need to create the tree
510537 boolean fetchTreeIsComplete ;
511538 synchronized (fEntryBuilder ) {
@@ -529,6 +556,8 @@ public int getQuark() {
529556 private boolean addTrace (@ Nullable IProgressMonitor monitor ) {
530557 boolean fetchTreeIsComplete = true ;
531558 ITmfTrace trace = getTrace ();
559+ // Add newly created analysis and remove deleted analysis
560+ updateRegisteredAnalysisModules (trace );
532561
533562 // look if the trace entry already exist
534563 String traceName = Objects .requireNonNull (trace .getName ());
@@ -621,7 +650,7 @@ private boolean addModule(@Nullable IProgressMonitor monitor, ITmfAnalysisModule
621650 */
622651 EntryModelBuilder ssEntry = fEntryBuilder .get (moduleId , ss .getSSID ());
623652 if (ssEntry != null ) {
624- deleteElementFromBuildEntryList (ssEntry .getId ());
653+ removeEntryAndChildren (ssEntry .getId ());
625654 }
626655 }
627656 }
@@ -715,11 +744,13 @@ private List<TimeGraphEntryModel> buildEntryList(@Nullable IProgressMonitor moni
715744 return entryList ;
716745 }
717746
718- private void deleteElementFromBuildEntryList (Long rowID ) {
719- for (EntryModelBuilder entry : fEntryBuilder .row (rowID ).values ()) {
720- deleteElementFromBuildEntryList (entry .getId ());
747+ private void removeEntryAndChildren (Long entryID ) {
748+ for (EntryModelBuilder entry : fEntryBuilder .row (entryID ).values ()) {
749+ removeEntryAndChildren (entry .getId ());
721750 }
722- fEntryBuilder .row (rowID ).clear ();
751+ fEntryBuilder .row (entryID ).clear ();
752+ fIDToSSQuark .remove (entryID );
753+ fIdToSs .remove (entryID );
723754 }
724755
725756 private void waitForInitialization (ITmfTrace trace , ITmfAnalysisModuleWithStateSystems module ) {
@@ -794,21 +825,20 @@ private void waitForInitialization(ITmfTrace trace, ITmfAnalysisModuleWithStateS
794825 private @ Nullable ITimeGraphRowModel getModuleRowModel (long id ) {
795826 ModuleEntryModel module = fIdToModuleEntryModel .get (id );
796827 if (module != null ) {
797- TimeGraphRowModel moduleRow = new TimeGraphRowModel (module .getId (), new ArrayList <>());
798- List <ITimeGraphState > states = moduleRow .getStates ();
828+ List <ITimeGraphState > states = new ArrayList <>();
799829 states .add (new TimeGraphState (module .getStartTime (), module .getEndTime () - module .getStartTime (), Integer .MAX_VALUE , null , new OutputElementStyle (TRANSPARENT )));
800- return moduleRow ;
830+ return new TimeGraphRowModel (module .getId (), states );
831+
801832 }
802833 return null ;
803834 }
804835
805836 private @ Nullable ITimeGraphRowModel getStateSystemRowModel (long id ) {
806837 ITmfStateSystem ss = fIdToSs .get (id );
807838 if (ss != null ) {
808- TimeGraphRowModel ssRow = new TimeGraphRowModel (id , new ArrayList <>());
809- List <ITimeGraphState > states = ssRow .getStates ();
839+ List <ITimeGraphState > states = new ArrayList <>();
810840 states .add (new TimeGraphState (ss .getStartTime (), ss .getCurrentEndTime () - ss .getStartTime (), Integer .MAX_VALUE , null , new OutputElementStyle (TRANSPARENT )));
811- return ssRow ;
841+ return new TimeGraphRowModel ( id , states ) ;
812842 }
813843 return null ;
814844 }
0 commit comments