| /******************************************************************************* |
| * Copyright (c) 2017 Ericsson |
| * |
| * 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.incubator.internal.uftrace.core.analysis; |
| |
| import org.eclipse.jdt.annotation.NonNull; |
| import org.eclipse.jdt.annotation.Nullable; |
| import org.eclipse.tracecompass.analysis.os.linux.core.event.aspect.LinuxTidAspect; |
| import org.eclipse.tracecompass.incubator.callstack.core.instrumented.statesystem.CallStackStateProvider; |
| import org.eclipse.tracecompass.incubator.internal.uftrace.core.trace.DatEvent; |
| import org.eclipse.tracecompass.incubator.internal.uftrace.core.trace.UfEventType; |
| import org.eclipse.tracecompass.incubator.internal.uftrace.core.trace.Uftrace.ExecAspect; |
| import org.eclipse.tracecompass.incubator.internal.uftrace.core.trace.Uftrace.PidAspect; |
| import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; |
| import org.eclipse.tracecompass.tmf.core.event.ITmfEventField; |
| import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect; |
| import org.eclipse.tracecompass.tmf.core.event.aspect.MultiAspect; |
| import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; |
| import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; |
| |
| /** |
| * UFTrace callstack provider |
| * |
| * @author Matthew Khouzam |
| */ |
| public class UfCallstackProvider extends CallStackStateProvider { |
| |
| |
| private final ITmfEventAspect<String> fExecAspect; |
| private final ITmfEventAspect<Integer> fTidAspect; |
| private final ITmfEventAspect<Integer> fPidAspect; |
| |
| /** |
| * Constructor |
| * |
| * @param trace |
| * the trace |
| */ |
| public UfCallstackProvider(@NonNull ITmfTrace trace) { |
| super(trace); |
| fExecAspect = (ITmfEventAspect<String>) MultiAspect.<String>create(TmfTraceUtils.getEventAspects(trace, ExecAspect.class), ExecAspect.class); |
| fTidAspect = (ITmfEventAspect<Integer>) MultiAspect.<Integer>create(TmfTraceUtils.getEventAspects(trace, LinuxTidAspect.class), LinuxTidAspect.class); |
| fPidAspect = (ITmfEventAspect<Integer>) MultiAspect.<Integer>create(TmfTraceUtils.getEventAspects(trace, PidAspect.class), PidAspect.class); |
| } |
| |
| @Override |
| public int getVersion() { |
| return 2; |
| } |
| |
| @Override |
| public @NonNull CallStackStateProvider getNewInstance() { |
| return new UfCallstackProvider(getTrace()); |
| } |
| |
| @Override |
| protected boolean considerEvent(@NonNull ITmfEvent event) { |
| return true; |
| } |
| |
| @Override |
| protected @Nullable Object functionEntry(@NonNull ITmfEvent event) { |
| ITmfEventField content = event.getContent(); |
| Object payload = content.getValue(); |
| if (payload instanceof DatEvent) { |
| DatEvent ev = (DatEvent) payload; |
| if (event.getType().equals(UfEventType.ENTRY)) { |
| return ev.getAddress(); |
| } |
| } |
| return null; |
| } |
| |
| @Override |
| protected @Nullable Object functionExit(@NonNull ITmfEvent event) { |
| ITmfEventField content = event.getContent(); |
| Object payload = content.getValue(); |
| if (payload instanceof DatEvent) { |
| DatEvent ev = (DatEvent) payload; |
| if (event.getType().equals(UfEventType.EXIT)) { |
| return ev.getAddress(); |
| } |
| } |
| return null; |
| } |
| |
| @Override |
| protected @Nullable String getProcessName(@NonNull ITmfEvent event) { |
| return fExecAspect.resolve(event); |
| } |
| |
| @Override |
| protected int getProcessId(@NonNull ITmfEvent event) { |
| Integer resolve = fPidAspect.resolve(event); |
| return resolve == null ? -1 : resolve.intValue(); |
| } |
| |
| @Override |
| protected long getThreadId(@NonNull ITmfEvent event) { |
| Integer resolve = fTidAspect.resolve(event); |
| return resolve == null ? -1 : resolve.longValue(); |
| } |
| } |