blob: ee6171a117670ede02b3033559f861eeda26ad3c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Keba AG
*
* 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
*
* Contributors:
* Christian Mansky - Initial implementation
*******************************************************************************/
package org.eclipse.tracecompass.analysis.os.linux.core.event.aspect;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelAnalysisModule;
import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelTidAspect;
import org.eclipse.tracecompass.common.core.NonNullUtils;
import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.Attributes;
import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException;
import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException;
import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
import org.eclipse.tracecompass.tmf.core.event.aspect.TmfCpuAspect;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
/**
* This aspect finds the priority of the thread running from this event using
* the {@link KernelAnalysisModule}.
*
* @author Christian Mansky
* @since 2.0
*/
public final class ThreadPriorityAspect implements ITmfEventAspect<Integer> {
/** The singleton instance */
public static final ThreadPriorityAspect INSTANCE = new ThreadPriorityAspect();
private ThreadPriorityAspect() {
}
@Override
public final String getName() {
return NonNullUtils.nullToEmptyString(Messages.AspectName_Prio);
}
@Override
public final String getHelpText() {
return NonNullUtils.nullToEmptyString(Messages.AspectHelpText_Prio);
}
@Override
public @Nullable Integer resolve(ITmfEvent event) {
final @NonNull ITmfTrace trace = event.getTrace();
KernelAnalysisModule kernelAnalysis = TmfTraceUtils.getAnalysisModuleOfClass(trace, KernelAnalysisModule.class, KernelAnalysisModule.ID);
if (kernelAnalysis == null) {
return null;
}
ITmfStateSystem ss = kernelAnalysis.getStateSystem();
if (ss == null) {
return null;
}
Integer tid = KernelTidAspect.INSTANCE.resolve(event);
if (tid == null) {
return null;
}
final long ts = event.getTimestamp().getValue();
Integer execPrio = null;
try {
Integer cpu = 0;
if (tid == 0) {
/* Find the CPU this event is run on */
cpu = TmfTraceUtils.resolveIntEventAspectOfClassForEvent(trace, TmfCpuAspect.class, event);
}
int execPrioQuark = ss.getQuarkAbsolute(Attributes.THREADS, Attributes.buildThreadAttributeName(tid, cpu), Attributes.PRIO);
ITmfStateInterval interval = ss.querySingleState(ts, execPrioQuark);
ITmfStateValue prioValue = interval.getStateValue();
/* We know the prio must be an Integer */
execPrio = prioValue.unboxInt();
} catch (AttributeNotFoundException | StateSystemDisposedException | TimeRangeException e) {
}
return execPrio;
}
}