blob: c7c6d7d7e65e4f33b0198655d2400f2f06af1316 [file] [log] [blame]
/**********************************************************************
* 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.internal.analysis.profiling.core.callstack.provider;
import java.util.List;
import java.util.Objects;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
/**
* {@link TimeGraphEntryModel} for the Call Stack
*
* @author Loic Prieur-Drevon
*/
public class CallStackEntryModel extends TimeGraphEntryModel {
/**
* Stack level associated to a Trace
*/
public static final int TRACE = -2;
/**
* Stack level associated to a Process
*/
public static final int PROCESS = -1;
/**
* Stack level associated to a Thread
*/
public static final int THREAD = 0;
private final int fStackLevel;
private final int fPid;
/**
* Constructor
*
* @param id
* unique ID for this {@link CallStackEntryModel}
* @param parentId
* parent's ID to build the tree
* @param labels
* entry's labels
* @param startTime
* entry's start time
* @param endTime
* entry's end time
* @param stackLevel
* function's stack level or {@link #TRACE} if the entry is a trace,
* {@link #PROCESS} if the entry is a Process, or {@link #THREAD} if
* the entry is a Thread
* @param pid
* entry's PID or TID if is a thread
*/
public CallStackEntryModel(long id, long parentId, @NonNull List<@NonNull String> labels, long startTime, long endTime, int stackLevel, int pid) {
super(id, parentId, labels, startTime, endTime);
fStackLevel = stackLevel;
fPid = pid;
}
/**
* Getter for the stack level
*
* @return the stack level if the the entry is a function, else {@value #TRACE}
* if the entry is a trace, {@value #PROCESS} if the entry is a Process,
* or {@value #THREAD} if the entry is a Thread
*/
public int getStackLevel() {
return fStackLevel;
}
/**
* Get the PID or TID if this is a thread.
*
* @return the PID or TID
*/
public int getPid() {
return fPid;
}
@Override
public boolean equals(@Nullable Object obj) {
if (!super.equals(obj)) {
// nullness, class, name, ids
return false;
}
if (!(obj instanceof CallStackEntryModel)) {
return false;
}
CallStackEntryModel other = (CallStackEntryModel) obj;
return fStackLevel == other.fStackLevel && fPid == other.fPid;
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), fStackLevel, fPid);
}
@Override
public String toString() {
return super.toString() + ' ' + getType();
}
private String getType() {
switch (fStackLevel) {
case TRACE:
return "TRACE"; //$NON-NLS-1$
case PROCESS:
return "PROCESS"; //$NON-NLS-1$
case THREAD:
return "THREAD"; //$NON-NLS-1$
default:
return "FUNCTION"; //$NON-NLS-1$
}
}
}