blob: f37b51f017c2031d31e4887b0753e1938a84bf37 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.internal.analysis.timing.core.event.matching;
import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.analysis.timing.core.segmentstore.AbstractSegmentStoreAnalysisEventBasedModule;
import org.eclipse.tracecompass.datastore.core.interval.IHTIntervalReader;
import org.eclipse.tracecompass.segmentstore.core.ISegment;
import org.eclipse.tracecompass.segmentstore.core.ISegmentStore;
import org.eclipse.tracecompass.segmentstore.core.SegmentStoreFactory.SegmentStoreType;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.event.matching.IEventMatchingKey;
import org.eclipse.tracecompass.tmf.core.event.matching.IMatchProcessingUnit;
import org.eclipse.tracecompass.tmf.core.event.matching.TmfEventDependency;
import org.eclipse.tracecompass.tmf.core.event.matching.TmfEventMatching;
import org.eclipse.tracecompass.tmf.core.segment.ISegmentAspect;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import com.google.common.collect.ImmutableList;
/**
* This class analyzes the latencies when an event matching dependency is found.
* It can be used to see how much latency there is in the trace before or after
* trace synchronization.
*
* @author Geneviève Bastien
*/
public class EventMatchingLatencyAnalysis extends AbstractSegmentStoreAnalysisEventBasedModule {
/**
* ID of this analysis
*/
public static final String ID = "org.eclipse.tracecompass.internal.analysis.timing.core.event.matching"; //$NON-NLS-1$
private static final Collection<ISegmentAspect> BASE_ASPECTS =
ImmutableList.of(EventMatchingTypeAspect.INSTANCE);
private static class EventMatchingLatencyProcessing implements IMatchProcessingUnit {
private final ISegmentStore<ISegment> fSegmentStore;
private int fCount = 0;
public EventMatchingLatencyProcessing(ISegmentStore<ISegment> segmentStore) {
fSegmentStore = segmentStore;
}
@Override
public void init(Collection<ITmfTrace> fTraces) {
// Nothing to do
}
@Override
public void addMatch(TmfEventDependency match) {
if (match.getSource().getTrace().getHostId().equals(match.getDestination().getTrace().getHostId())) {
return;
}
EventMatchingLatency segment = new EventMatchingLatency(null, match);
fSegmentStore.add(segment);
}
@Override
public void addMatch(@NonNull IEventMatchingKey eventKey, @NonNull TmfEventDependency match) {
if (match.getSource().getTrace().getHostId().equals(match.getDestination().getTrace().getHostId())) {
return;
}
fCount++;
EventMatchingLatency segment = new EventMatchingLatency(eventKey, match);
fSegmentStore.add(segment);
}
@Override
public void matchingEnded() {
// Nothing to do
}
@Override
public int countMatches() {
return fCount;
}
}
@Override
protected AbstractSegmentStoreAnalysisRequest createAnalysisRequest(ISegmentStore<ISegment> segmentStore, IProgressMonitor monitor) {
ITmfTrace trace = getTrace();
if (trace == null) {
throw new NullPointerException("The trace should not be null"); //$NON-NLS-1$
}
TmfEventMatching matching = new TmfEventMatching(Collections.singleton(trace), new EventMatchingLatencyProcessing(segmentStore));
matching.initMatching();
return new LatencyMatchingEventRequest(segmentStore, matching, monitor);
}
@Override
protected @NonNull IHTIntervalReader<@NonNull ISegment> getSegmentReader() {
return EventMatchingLatency.MATCHING_LATENCY_READ_FACTORY;
}
@Override
protected @NonNull SegmentStoreType getSegmentStoreType() {
return SegmentStoreType.OnDisk;
}
private class LatencyMatchingEventRequest extends AbstractSegmentStoreAnalysisRequest {
private final TmfEventMatching fMatching;
private final IProgressMonitor fMonitor;
public LatencyMatchingEventRequest(ISegmentStore<ISegment> segmentStore, TmfEventMatching matching, IProgressMonitor monitor) {
super(segmentStore);
fMatching = matching;
fMonitor = monitor;
}
@Override
public void handleData(final ITmfEvent event) {
super.handleData(event);
fMatching.matchEvent(event, event.getTrace(), fMonitor);
}
}
@Override
public Iterable<ISegmentAspect> getSegmentAspects() {
return BASE_ASPECTS;
}
private static final class EventMatchingTypeAspect implements ISegmentAspect {
public static final ISegmentAspect INSTANCE = new EventMatchingTypeAspect();
private EventMatchingTypeAspect() { }
@Override
public String getHelpText() {
return checkNotNull("The type of match that made this latency"); //$NON-NLS-1$
}
@Override
public String getName() {
return checkNotNull("Type"); //$NON-NLS-1$
}
@Override
public @Nullable Comparator<?> getComparator() {
return null;
}
@Override
public @Nullable String resolve(ISegment segment) {
if (segment instanceof EventMatchingLatency) {
return ((EventMatchingLatency) segment).getName();
}
return EMPTY_STRING;
}
}
}