/*******************************************************************************
* 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 v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.handlers;
import static org.eclipse.tracecompass.common.core.NonNullUtils.nullToEmptyString;
import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread;
import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider;
import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider.ProcessStatus;
import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.EventField;
import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngSystemModel;
import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngWorker;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
/**
* Handles the LTTng statedump events necessary for the initialization of the
* system model
*
* @author Francis Giraldeau
*/
public class TraceEventHandlerStatedump extends BaseHandler {
/**
* Constructor
*
* @param provider
* The parent graph provider
*/
public TraceEventHandlerStatedump(LttngKernelExecGraphProvider provider) {
super(provider);
}
@Override
public void handleEvent(ITmfEvent event) {
IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
LttngSystemModel system = getProvider().getSystem();
String eventName = event.getName();
if (!eventName.equals(eventLayout.eventStatedumpProcessState())) {
return;
}
Integer tid = EventField.getInt(event, eventLayout.fieldTid());
String name = EventField.getOrDefault(event, eventLayout.fieldName(), nullToEmptyString(Messages.TraceEventHandlerSched_UnknownThreadName));
Integer status = EventField.getInt(event, eventLayout.fieldStatus());
String host = event.getTrace().getHostId();
long ts = event.getTimestamp().getValue();
HostThread ht = new HostThread(host, tid);
LttngWorker task = system.findWorker(ht);
if (task == null) {
task = new LttngWorker(ht, name, ts);
system.addWorker(task);
} else {
task.setName(name);
}
task.setStatus(ProcessStatus.getStatus(status));
}
}