blob: 32595038b91f5c5581f0ca842b0582a5edbd951e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 É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.analysis.os.linux.core.execution.graph;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.analysis.graph.core.base.IGraphWorker;
import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelAnalysisModule;
import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelThreadInformationProvider;
import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread;
import org.eclipse.tracecompass.analysis.os.linux.core.model.OsStrings;
import org.eclipse.tracecompass.analysis.os.linux.core.model.ProcessStatus;
import org.eclipse.tracecompass.common.core.NonNullUtils;
import org.eclipse.tracecompass.internal.analysis.os.linux.core.execution.graph.Messages;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
/**
* This class represents the worker unit from the execution graph
*
* TODO: See if this class could be integrated inside HostThread instead.
*
* @author Geneviève Bastien
* @since 2.4
*/
public class OsWorker implements IGraphWorker {
private final HostThread fHostTid;
private final long fStart;
private String fThreadName;
private ProcessStatus fStatus = ProcessStatus.UNKNOWN;
private ProcessStatus fOldStatus = ProcessStatus.UNKNOWN;
/**
* Constructor
*
* @param ht
* The host thread represented by this worker
* @param name
* The name of this thread
* @param ts
* The timestamp
*/
public OsWorker(HostThread ht, String name, long ts) {
fHostTid = ht;
fThreadName = name;
fStart = ts;
}
@Override
public String getHostId() {
return fHostTid.getHost();
}
@Override
public @NonNull Map<@NonNull String, @NonNull String> getWorkerInformation() {
int tid = fHostTid.getTid();
if (tid == -1) {
return Collections.emptyMap();
}
return Collections.singletonMap(OsStrings.tid(), String.valueOf(tid));
}
@Override
public @NonNull Map<@NonNull String, @NonNull Object> getWorkerAspects() {
int tid = fHostTid.getTid();
if (tid == -1) {
return Collections.emptyMap();
}
return Collections.singletonMap(OsStrings.tid(), tid);
}
@SuppressWarnings("null")
@Override
public @NonNull Map<@NonNull String, @NonNull String> getWorkerInformation(long t) {
int tid = fHostTid.getTid();
if (tid == -1) {
return Collections.emptyMap();
}
Map<String, String> workerInfo = new HashMap<>();
workerInfo.put("tid", String.valueOf(tid)); //$NON-NLS-1$
Optional<@Nullable KernelAnalysisModule> kam = TmfTraceManager.getInstance().getActiveTraceSet()
.stream()
.filter(trace -> trace.getHostId().equals(getHostId()))
.map(trace -> TmfTraceUtils.getAnalysisModuleOfClass(trace, KernelAnalysisModule.class, KernelAnalysisModule.ID))
.filter(Objects::nonNull)
.findFirst();
if (!kam.isPresent()) {
return Collections.emptyMap();
}
int priority = KernelThreadInformationProvider.getThreadPriority(kam.get(), tid, t);
if (priority != -1) {
return Collections.singletonMap(NonNullUtils.nullToEmptyString(Messages.OsWorker_threadPriority), Integer.toString(priority));
}
return Collections.emptyMap();
}
/**
* Set the name of this worker
*
* @param name
* The name of this worker
*/
public void setName(String name) {
fThreadName = name;
}
/**
* Get the name of this worker
*
* @return The name of the worker
*/
public String getName() {
return fThreadName;
}
/**
* Set the status, saving the old value that can still be accessed using
* {@link OsWorker#getOldStatus()}
*
* @param status
* The new status of this
*/
public void setStatus(ProcessStatus status) {
fOldStatus = fStatus;
fStatus = status;
}
/**
* Get the status of this thread
*
* @return The thread status
*/
public ProcessStatus getStatus() {
return fStatus;
}
/**
* Return the previous status this worker was in
*
* @return The previous status of this worker
*/
public ProcessStatus getOldStatus() {
return fOldStatus;
}
/**
* Get the host thread associated with this worker
*
* @return The {@link HostThread} associated with this worker
*/
public HostThread getHostThread() {
return fHostTid;
}
/**
* Get the start time of this worker
*
* @return The start time in nanoseconds
*/
public long getStart() {
return fStart;
}
@Override
public boolean equals(@Nullable Object obj) {
if (obj instanceof OsWorker) {
return getHostThread().equals(((OsWorker) obj).getHostThread());
}
return false;
}
@Override
public int hashCode() {
return fHostTid.hashCode();
}
@Override
public String toString() {
return '[' + fThreadName + ',' + fHostTid.getTid() + ']';
}
}