Skip to content

Commit b5e4785

Browse files
committed
WIP: Retrieve critical path context from OsCriticalPathDataProvider
This also sends the TmfThreadSelectedSignal to configure the critical path execution. Notes: API is not final. The data provider should be configured differently Signed-off-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
1 parent bc54840 commit b5e4785

File tree

4 files changed

+114
-0
lines changed

4 files changed

+114
-0
lines changed

analysis/org.eclipse.tracecompass.analysis.graph.core/src/org/eclipse/tracecompass/internal/analysis/graph/core/dataprovider/OSCriticalPathDataProviderFactory.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,30 @@
1111

1212
package org.eclipse.tracecompass.internal.analysis.graph.core.dataprovider;
1313

14+
import java.util.Collection;
15+
import java.util.Collections;
1416
import java.util.HashMap;
1517
import java.util.Map;
18+
import java.util.Objects;
1619

1720
import org.eclipse.jdt.annotation.NonNull;
1821
import org.eclipse.jdt.annotation.Nullable;
1922
import org.eclipse.tracecompass.analysis.graph.core.criticalpath.AbstractCriticalPathModule;
2023
import org.eclipse.tracecompass.analysis.graph.core.criticalpath.OSCriticalPathModule;
2124
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
25+
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor;
26+
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor.ProviderType;
2227
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderFactory;
28+
import org.eclipse.tracecompass.tmf.core.model.DataProviderDescriptor;
2329
import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel;
2430
import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataProvider;
2531
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
2632
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
2733
import org.eclipse.tracecompass.tmf.core.signal.TmfStartAnalysisSignal;
2834
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
2935
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
36+
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
37+
import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment;
3038

3139
/**
3240
* {@link IDataProviderFactory} for the {@link CriticalPathDataProvider}
@@ -37,6 +45,14 @@ public class OSCriticalPathDataProviderFactory implements IDataProviderFactory {
3745

3846
private final Map<ITmfTrace, OSCriticalPathModule> map = new HashMap<>();
3947

48+
49+
private static final IDataProviderDescriptor DESCRIPTOR = new DataProviderDescriptor.Builder()
50+
.setId(CriticalPathDataProvider.ID)
51+
.setName(Objects.requireNonNull("Critical Path"))
52+
.setDescription(Objects.requireNonNull("Critical Path"))
53+
.setProviderType(ProviderType.TIME_GRAPH)
54+
.build();
55+
4056
/**
4157
* Constructor, registers the module with the {@link TmfSignalManager}
4258
*/
@@ -46,6 +62,16 @@ public OSCriticalPathDataProviderFactory() {
4662

4763
@Override
4864
public @Nullable ITmfTreeDataProvider<? extends ITmfTreeDataModel> createProvider(@NonNull ITmfTrace trace) {
65+
ITmfTrace localTrace = trace;
66+
if (localTrace instanceof TmfExperiment) {
67+
for(ITmfTrace tr: TmfTraceManager.getTraceSet(trace)) {
68+
ITmfTreeDataProvider<? extends ITmfTreeDataModel> pr = createProvider(tr);
69+
if (pr != null) {
70+
return pr;
71+
}
72+
}
73+
}
74+
4975
OSCriticalPathModule module = map.remove(trace);
5076
if (module == null) {
5177
// the DataProviderManager does not negative cache
@@ -54,6 +80,11 @@ public OSCriticalPathDataProviderFactory() {
5480
return new OSCriticalPathDataProvider(trace, module);
5581
}
5682

83+
@Override
84+
public Collection<IDataProviderDescriptor> getDescriptors(@NonNull ITmfTrace trace) {
85+
return Collections.singletonList(DESCRIPTOR);
86+
}
87+
5788
/**
5889
* {@link TmfSignalHandler} for when {@link AbstractCriticalPathModule} is started, as
5990
* the analysis is not registered with the trace, we use this to know to

analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/threadstatus/ThreadStatusDataProvider.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@
3232
import org.eclipse.jdt.annotation.NonNull;
3333
import org.eclipse.jdt.annotation.Nullable;
3434
import org.eclipse.tracecompass.analysis.os.linux.core.event.aspect.LinuxTidAspect;
35+
import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread;
3536
import org.eclipse.tracecompass.analysis.os.linux.core.model.OsStrings;
3637
import org.eclipse.tracecompass.analysis.os.linux.core.model.ProcessStatus;
38+
import org.eclipse.tracecompass.analysis.os.linux.core.signals.TmfThreadSelectedSignal;
3739
import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelTrace;
3840
import org.eclipse.tracecompass.internal.analysis.os.linux.core.Activator;
3941
import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.Attributes;
@@ -78,6 +80,7 @@
7880
import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel;
7981
import org.eclipse.tracecompass.tmf.core.response.ITmfResponse;
8082
import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
83+
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
8184
import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule;
8285
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
8386
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
@@ -177,6 +180,7 @@ public class ThreadStatusDataProvider extends AbstractTmfTraceDataProvider imple
177180

178181
/** Cache for entry metadata */
179182
private final Map<Long, @NonNull Multimap<@NonNull String, @NonNull Object>> fEntryMetadata = new HashMap<>();
183+
private final Map<Long, @NonNull TimeGraphEntryModel> fEntryModel = new HashMap<>();
180184

181185
private IOutputAnnotationProvider fEventAnnotationProvider;
182186

@@ -274,6 +278,7 @@ public ThreadStatusDataProvider(@NonNull ITmfTrace trace, TmfStateSystemAnalysis
274278

275279
for (TimeGraphEntryModel model : list) {
276280
fEntryMetadata.put(model.getId(), model.getMetadata());
281+
fEntryModel.put(model.getId(), model);
277282
}
278283

279284
if (complete) {
@@ -825,4 +830,40 @@ public TmfModelResponse<OutputStyleModel> fetchStyle(Map<String, Object> fetchPa
825830
public @NonNull TmfModelResponse<@NonNull AnnotationModel> fetchAnnotations(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
826831
return fEventAnnotationProvider.fetchAnnotations(fetchParameters, monitor);
827832
}
833+
834+
@Override
835+
public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull Object>> fetchTreeContext(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
836+
// TODO Auto-generated method stub
837+
fModule.waitForInitialization();
838+
ITmfStateSystem ss = fModule.getStateSystem();
839+
if (ss == null) {
840+
return new TmfModelResponse<>(null, ITmfResponse.Status.FAILED, CommonStatusMessage.ANALYSIS_INITIALIZATION_FAILED);
841+
}
842+
843+
/*
844+
* As we are caching the intermediate result, we only want a single thread to
845+
* update them.
846+
*/
847+
synchronized (fBuildMap) {
848+
List<Long> selectedItems = DataProviderParameterUtils.extractSelectedItems(fetchParameters);
849+
if (selectedItems != null && selectedItems.size() > 0) {
850+
Long id = selectedItems.get(0);
851+
TimeGraphEntryModel model = fEntryModel.get(id);
852+
if (model instanceof ThreadEntryModel) {
853+
Map<String, Object> retMap = new HashMap<>();
854+
ThreadEntryModel mod = (ThreadEntryModel) model;
855+
retMap.put("name", mod.getName());
856+
retMap.put("tid", mod.getThreadId());
857+
retMap.put("hostId", getTrace().getHostId());
858+
859+
// Not restful ...
860+
HostThread hostThread = new HostThread(getTrace().getHostId(), mod.getThreadId());
861+
TmfThreadSelectedSignal signal = new TmfThreadSelectedSignal(this, hostThread);
862+
TmfSignalManager.dispatchSignal(signal);
863+
return new TmfModelResponse<>(retMap, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
864+
}
865+
}
866+
}
867+
return ITimeGraphDataProvider.super.fetchTreeContext(fetchParameters, monitor);
868+
}
828869
}

tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/tree/ITmfTreeDataProvider.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
import org.eclipse.core.runtime.IProgressMonitor;
1717
import org.eclipse.jdt.annotation.Nullable;
18+
import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage;
19+
import org.eclipse.tracecompass.tmf.core.response.ITmfResponse;
1820
import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
1921

2022
/**
@@ -43,6 +45,23 @@ public interface ITmfTreeDataProvider<T extends ITmfTreeDataModel> {
4345
*/
4446
TmfModelResponse<TmfTreeModel<T>> fetchTree(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor);
4547

48+
/**
49+
* This methods computes a tree model context. Then, it returns a
50+
* {@link TmfModelResponse} that contains the model. Tree model will be used
51+
* by tree viewer to show entries as a tree or flat hierarchy
52+
*
53+
* @param fetchParameters
54+
* A query filter that contains an array of time. Times are used
55+
* for requesting data.
56+
* @param monitor
57+
* A ProgressMonitor to cancel task
58+
* @return A {@link TmfModelResponse} instance
59+
* @since 9.3
60+
*/
61+
default TmfModelResponse<Map<String, Object>> fetchTreeContext(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
62+
return new TmfModelResponse<>(null, ITmfResponse.Status.CANCELLED, CommonStatusMessage.COMPLETED);
63+
}
64+
4665
/**
4766
* This method return the extension point ID of this provider
4867
*

tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/tree/TmfTreeCompositeDataProvider.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,5 +250,28 @@ public TmfModelResponse<AnnotationModel> fetchAnnotations(Map<String, Object> fe
250250
}
251251
return new TmfModelResponse<>(model, ITmfResponse.Status.RUNNING, CommonStatusMessage.RUNNING);
252252
}
253+
254+
@Override
255+
public TmfModelResponse<Map<String, Object>> fetchTreeContext(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
256+
boolean isComplete = true;
257+
Map<String, Object> model = new HashMap<>();
258+
for (P dataProvider : getProviders()) {
259+
TmfModelResponse<Map<String, Object>> response = dataProvider.fetchTreeContext(fetchParameters, monitor);
260+
isComplete &= response.getStatus() == ITmfResponse.Status.COMPLETED;
261+
if (monitor != null && monitor.isCanceled()) {
262+
return new TmfModelResponse<>(null, ITmfResponse.Status.CANCELLED, CommonStatusMessage.TASK_CANCELLED);
263+
}
264+
Map<String, Object> retModel = response.getModel();
265+
if (retModel != null && !retModel.isEmpty()) {
266+
model = retModel;
267+
// only one data provider should return the context
268+
break;
269+
}
270+
}
271+
if (isComplete) {
272+
return new TmfModelResponse<>(model, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
273+
}
274+
return new TmfModelResponse<>(model, ITmfResponse.Status.RUNNING, CommonStatusMessage.RUNNING);
275+
}
253276
}
254277

0 commit comments

Comments
 (0)