From: Patrick Tasse Date: Fri, 25 May 2012 15:40:49 +0000 (-0400) Subject: Bug 378402: Implementation of ControlFlow view and Resources view for X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=72b5abb1bc47097fd47adb858bf3e62a77163c67;p=deliverable%2Ftracecompass.git Bug 378402: Implementation of ControlFlow view and Resources view for LTTng 2.0. --- diff --git a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowPresentationProvider.java b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowPresentationProvider.java new file mode 100644 index 0000000000..c161eecb92 --- /dev/null +++ b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowPresentationProvider.java @@ -0,0 +1,122 @@ +/******************************************************************************* + * Copyright (c) 2012 Ericsson + * + * 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 + * + * Contributors: + * Patrick Tasse - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.controlflow; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Messages; +import org.eclipse.linuxtools.lttng2.kernel.core.trace.Attributes; +import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException; +import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException; +import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval; +import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier; +import org.eclipse.linuxtools.tmf.core.statevalue.ITmfStateValue; +import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.StateItem; +import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider; +import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent; +import org.eclipse.swt.graphics.RGB; + +public class ControlFlowPresentationProvider extends TimeGraphPresentationProvider { + + private enum State { + UNKNOWN (new RGB(100, 100, 100)), + WAIT (new RGB(200, 200, 0)), + USERMODE (new RGB(0, 200, 0)), + SYSCALL (new RGB(0, 0, 200)), + INTERRUPTED (new RGB(200, 100, 100)); + + public final RGB rgb; + + private State (RGB rgb) { + this.rgb = rgb; + } + } + + @Override + public String getStateTypeName() { + return Messages.ControlFlowView_stateTypeName; + } + + @Override + public StateItem[] getStateTable() { + StateItem[] stateTable = new StateItem[State.values().length]; + for (int i = 0; i < stateTable.length; i++) { + State state = State.values()[i]; + stateTable[i] = new StateItem(state.rgb, state.toString()); + } + return stateTable; + } + + @Override + public int getStateTableIndex(ITimeEvent event) { + if (event instanceof ControlFlowEvent) { + int status = ((ControlFlowEvent) event).getStatus(); + if (status == Attributes.STATUS_WAIT) { + return State.WAIT.ordinal(); + } else if (status == Attributes.STATUS_RUN_USERMODE) { + return State.USERMODE.ordinal(); + } else if (status == Attributes.STATUS_RUN_SYSCALL) { + return State.SYSCALL.ordinal(); + } else if (status == Attributes.STATUS_INTERRUPTED) { + return State.INTERRUPTED.ordinal(); + } + } + return State.UNKNOWN.ordinal(); + } + + @Override + public String getEventName(ITimeEvent event) { + if (event instanceof ControlFlowEvent) { + int status = ((ControlFlowEvent) event).getStatus(); + if (status == Attributes.STATUS_WAIT) { + return State.WAIT.toString(); + } else if (status == Attributes.STATUS_RUN_USERMODE) { + return State.USERMODE.toString(); + } else if (status == Attributes.STATUS_RUN_SYSCALL) { + return State.SYSCALL.toString(); + } else if (status == Attributes.STATUS_INTERRUPTED) { + return State.INTERRUPTED.toString(); + } + } + return State.UNKNOWN.toString(); + } + + @Override + public Map getEventHoverToolTipInfo(ITimeEvent event) { + Map retMap = new HashMap(); + if (event instanceof ControlFlowEvent) { + int status = ((ControlFlowEvent) event).getStatus(); + if (status == Attributes.STATUS_RUN_SYSCALL) { + ControlFlowEntry entry = (ControlFlowEntry) event.getEntry(); + IStateSystemQuerier ssq = entry.getTrace().getStateSystem(); + try { + int syscallQuark = ssq.getQuarkRelative(entry.getThreadQuark(), Attributes.SYSTEM_CALL); + ITmfStateInterval value = ssq.querySingleState(event.getTime(), syscallQuark); + if (!value.getStateValue().isNull()) { + ITmfStateValue state = value.getStateValue(); + retMap.put(Messages.ControlFlowView_attributeSyscallName, state.toString()); + } + + } catch (AttributeNotFoundException e) { + e.printStackTrace(); + } catch (TimeRangeException e) { + e.printStackTrace(); + } + } + } + + return retMap; + } + +} diff --git a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowView.java b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowView.java index 6ab36ebc3d..9b6e9fa93b 100644 --- a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowView.java +++ b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowView.java @@ -14,9 +14,7 @@ package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.controlflow; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; @@ -43,16 +41,13 @@ import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal; import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler; import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal; import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier; -import org.eclipse.linuxtools.tmf.core.statevalue.ITmfStateValue; import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace; import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment; import org.eclipse.linuxtools.tmf.ui.views.TmfView; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphRangeListener; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphSelectionListener; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphTimeListener; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.StateItem; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphCombo; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphSelectionEvent; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphTimeEvent; @@ -64,7 +59,6 @@ import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.Resolution; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.TreeColumn; @@ -286,90 +280,7 @@ public class ControlFlowView extends TmfView { fTimeGraphCombo.setTreeLabelProvider(new TreeLabelProvider()); - fTimeGraphCombo.setTimeGraphProvider(new TimeGraphPresentationProvider() { - private static final String UNKNOWN = "UNKNOWN"; //$NON-NLS-1$ - private static final String WAIT = "WAIT"; //$NON-NLS-1$ - private static final String USERMODE = "USERMODE"; //$NON-NLS-1$ - private static final String SYSCALL = "SYSCALL"; //$NON-NLS-1$ - private static final String INTERRUPTED = "INTERRUPTED"; //$NON-NLS-1$ - - @Override - public String getStateTypeName() { - return Messages.ControlFlowView_stateTypeName; - } - - @Override - public StateItem[] getStateTable() { - return new StateItem[] { - new StateItem(new RGB(100, 100, 100), UNKNOWN), - new StateItem(new RGB(200, 200, 0), WAIT), - new StateItem(new RGB(0, 200, 0), USERMODE), - new StateItem(new RGB(0, 0, 200), SYSCALL), - new StateItem(new RGB(200, 100, 100), INTERRUPTED) - }; - } - - @Override - public int getStateTableIndex(ITimeEvent event) { - if (event instanceof ControlFlowEvent) { - int status = ((ControlFlowEvent) event).getStatus(); - if (status == Attributes.STATUS_WAIT) { - return 1; - } else if (status == Attributes.STATUS_RUN_USERMODE) { - return 2; - } else if (status == Attributes.STATUS_RUN_SYSCALL) { - return 3; - } else if (status == Attributes.STATUS_INTERRUPTED) { - return 4; - } - } - return 0; - } - - @Override - public String getEventName(ITimeEvent event) { - if (event instanceof ControlFlowEvent) { - int status = ((ControlFlowEvent) event).getStatus(); - if (status == Attributes.STATUS_WAIT) { - return WAIT; - } else if (status == Attributes.STATUS_RUN_USERMODE) { - return USERMODE; - } else if (status == Attributes.STATUS_RUN_SYSCALL) { - return SYSCALL; - } else if (status == Attributes.STATUS_INTERRUPTED) { - return INTERRUPTED; - } - } - return UNKNOWN; - } - - @Override - public Map getEventHoverToolTipInfo(ITimeEvent event) { - Map retMap = new HashMap(); - if (event instanceof ControlFlowEvent) { - int status = ((ControlFlowEvent) event).getStatus(); - if (status == Attributes.STATUS_RUN_SYSCALL) { - ControlFlowEntry entry = (ControlFlowEntry) event.getEntry(); - IStateSystemQuerier ssq = entry.getTrace().getStateSystem(); - try { - int syscallQuark = ssq.getQuarkRelative(entry.getThreadQuark(), Attributes.SYSTEM_CALL); - ITmfStateInterval value = ssq.querySingleState(event.getTime(), syscallQuark); - if (!value.getStateValue().isNull()) { - ITmfStateValue state = value.getStateValue(); - retMap.put(Messages.ControlFlowView_attributeSyscallName, state.toString()); - } - - } catch (AttributeNotFoundException e) { - e.printStackTrace(); - } catch (TimeRangeException e) { - e.printStackTrace(); - } - } - } - - return retMap; - } - }); + fTimeGraphCombo.setTimeGraphProvider(new ControlFlowPresentationProvider()); fTimeGraphCombo.setTreeColumns(COLUMN_NAMES); diff --git a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesPresentationProvider.java b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesPresentationProvider.java new file mode 100644 index 0000000000..2e7d07829f --- /dev/null +++ b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesPresentationProvider.java @@ -0,0 +1,117 @@ +package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Messages; +import org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources.ResourcesEntry.Type; +import org.eclipse.linuxtools.lttng2.kernel.core.trace.Attributes; +import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.StateItem; +import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider; +import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent; +import org.eclipse.swt.graphics.RGB; + +public class ResourcesPresentationProvider extends TimeGraphPresentationProvider { + + private enum State { + UNKNOWN (new RGB(100, 100, 100)), + IDLE (new RGB(200, 200, 200)), + BUSY (new RGB(0, 200, 0)), + INTERRUPTED (new RGB(200, 100, 100)), + RAISED (new RGB(200, 200, 0)), + ACTIVE (new RGB(200, 150, 100)); + + public final RGB rgb; + + private State (RGB rgb) { + this.rgb = rgb; + } + } + + @Override + public String getStateTypeName() { + return Messages.ResourcesView_stateTypeName; + } + + @Override + public StateItem[] getStateTable() { + StateItem[] stateTable = new StateItem[State.values().length]; + for (int i = 0; i < stateTable.length; i++) { + State state = State.values()[i]; + stateTable[i] = new StateItem(state.rgb, state.toString()); + } + return stateTable; + } + + @Override + public int getStateTableIndex(ITimeEvent event) { + if (event instanceof ResourcesEvent) { + ResourcesEvent resourcesEvent = (ResourcesEvent) event; + if (resourcesEvent.getType() == Type.CPU) { + int status = resourcesEvent.getValue(); + if (status == Attributes.CPU_STATUS_IDLE) { + return State.IDLE.ordinal(); + } else if (status == Attributes.CPU_STATUS_BUSY) { + return State.BUSY.ordinal(); + } else if (status == Attributes.CPU_STATUS_INTERRUPTED) { + return State.INTERRUPTED.ordinal(); + } + } else if (resourcesEvent.getType() == Type.IRQ || resourcesEvent.getType() == Type.SOFT_IRQ) { + int cpu = resourcesEvent.getValue(); + if (cpu == Attributes.SOFT_IRQ_RAISED) { + return State.RAISED.ordinal(); + } + return State.ACTIVE.ordinal(); + } else { + return -1; // NULL + } + } + return State.UNKNOWN.ordinal(); + } + + @Override + public String getEventName(ITimeEvent event) { + if (event instanceof ResourcesEvent) { + ResourcesEvent resourcesEvent = (ResourcesEvent) event; + if (resourcesEvent.getType() == Type.CPU) { + int status = resourcesEvent.getValue(); + if (status == Attributes.CPU_STATUS_IDLE) { + return State.IDLE.toString(); + } else if (status == Attributes.CPU_STATUS_BUSY) { + return State.BUSY.toString(); + } else if (status == Attributes.CPU_STATUS_INTERRUPTED) { + return State.INTERRUPTED.toString(); + } + } else if (resourcesEvent.getType() == Type.IRQ || resourcesEvent.getType() == Type.SOFT_IRQ) { + int cpu = resourcesEvent.getValue(); + if (cpu == Attributes.SOFT_IRQ_RAISED) { + return State.RAISED.toString(); + } + return State.ACTIVE.toString(); + } else { + return null; + } + } + return State.UNKNOWN.toString(); + } + + @Override + public Map getEventHoverToolTipInfo(ITimeEvent event) { + + Map retMap = new HashMap(); + if (event instanceof ResourcesEvent) { + + ResourcesEvent resourcesEvent = (ResourcesEvent) event; + + if (resourcesEvent.getType().equals(Type.IRQ) || resourcesEvent.getType().equals(Type.SOFT_IRQ)) { + int cpu = resourcesEvent.getValue(); + if (cpu >= 0) { + retMap.put(Messages.ResourcesView_attributeCpuName, String.valueOf(cpu)); + } + } + } + + return retMap; + } + +} diff --git a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesView.java b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesView.java index d16826f65a..ca0cf604d1 100644 --- a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesView.java +++ b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesView.java @@ -14,10 +14,8 @@ package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; @@ -47,8 +45,6 @@ import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment; import org.eclipse.linuxtools.tmf.ui.views.TmfView; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphRangeListener; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphTimeListener; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.StateItem; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphTimeEvent; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphViewer; @@ -56,7 +52,6 @@ import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry; import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent; import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IActionBars; @@ -243,98 +238,7 @@ public class ResourcesView extends TmfView { public void createPartControl(Composite parent) { fTimeGraphViewer = new TimeGraphViewer(parent, SWT.NONE); - fTimeGraphViewer.setTimeGraphProvider(new TimeGraphPresentationProvider() { - private static final String UNKNOWN = "UNKNOWN"; //$NON-NLS-1$ - private static final String IDLE = "IDLE"; //$NON-NLS-1$ - private static final String BUSY = "BUSY"; //$NON-NLS-1$ - private static final String INTERRUPTED = "INTERRUPTED"; //$NON-NLS-1$ - private static final String RAISED = "RAISED"; //$NON-NLS-1$ - private static final String ACTIVE = "ACTIVE"; //$NON-NLS-1$ - - @Override - public String getStateTypeName() { - return Messages.ResourcesView_stateTypeName; - } - - @Override - public String getEventName(ITimeEvent event) { - if (event instanceof ResourcesEvent) { - ResourcesEvent resourcesEvent = (ResourcesEvent) event; - if (resourcesEvent.getType() == Type.CPU) { - int currentThread = resourcesEvent.getValue(); - if (currentThread == 0) { - return IDLE; - } else { - return BUSY; - } - } else if (resourcesEvent.getType() == Type.IRQ || resourcesEvent.getType() == Type.SOFT_IRQ) { - int cpu = resourcesEvent.getValue(); - if (cpu == Attributes.SOFT_IRQ_RAISED) { - return RAISED; - } - return ACTIVE; - } else { - return null; - } - } - return UNKNOWN; - } - - @Override - public Map getEventHoverToolTipInfo(ITimeEvent event) { - - Map retMap = new HashMap(); - if (event instanceof ResourcesEvent) { - - ResourcesEvent resourcesEvent = (ResourcesEvent) event; - - if (resourcesEvent.getType().equals(Type.IRQ) || resourcesEvent.getType().equals(Type.SOFT_IRQ)) { - int cpu = resourcesEvent.getValue(); - if (cpu >= 0) { - retMap.put(Messages.ResourcesView_attributeCpuName, String.valueOf(cpu)); - } - } - } - - return retMap; - } - - @Override - public StateItem[] getStateTable() { - return new StateItem[] { - new StateItem(new RGB(100, 100, 100), UNKNOWN), - new StateItem(new RGB(200, 200, 200), IDLE), - new StateItem(new RGB(0, 200, 0), BUSY), - new StateItem(new RGB(200, 100, 100), INTERRUPTED), - new StateItem(new RGB(200, 200, 0), RAISED), - new StateItem(new RGB(200, 150, 100), ACTIVE) - }; - } - - @Override - public int getStateTableIndex(ITimeEvent event) { - if (event instanceof ResourcesEvent) { - ResourcesEvent resourcesEvent = (ResourcesEvent) event; - if (resourcesEvent.getType() == Type.CPU) { - int currentThread = resourcesEvent.getValue(); - if (currentThread == 0) { - return 1; // IDLE - } else { - return 2; // BUSY - } - } else if (resourcesEvent.getType() == Type.IRQ || resourcesEvent.getType() == Type.SOFT_IRQ) { - int cpu = resourcesEvent.getValue(); - if (cpu == Attributes.SOFT_IRQ_RAISED) { - return 4; // RAISED - } - return 5; // ACTIVE - } else { - return -1; // NULL - } - } - return 0; // UNKNOWN - } - }); + fTimeGraphViewer.setTimeGraphProvider(new ResourcesPresentationProvider()); fTimeGraphViewer.setTimeCalendarFormat(true); @@ -511,23 +415,27 @@ public class ResourcesView extends TmfView { int quark = entry.getQuark(); try { if (entry.getType().equals(Type.CPU)) { - int currentThreadQuark = ssq.getQuarkRelative(quark, Attributes.CURRENT_THREAD); - List currentThreadIntervals = ssq.queryHistoryRange(currentThreadQuark, startTime, endTime - 1, resolution); - eventList = new ArrayList(currentThreadIntervals.size()); + int statusQuark = ssq.getQuarkRelative(quark, Attributes.STATUS); + List statusIntervals = ssq.queryHistoryRange(statusQuark, startTime, endTime - 1, resolution); + eventList = new ArrayList(statusIntervals.size()); long lastEndTime = -1; - for (ITmfStateInterval currentThreadInterval : currentThreadIntervals) { + for (ITmfStateInterval statusInterval : statusIntervals) { if (monitor.isCanceled()) { return null; } - if (!currentThreadInterval.getStateValue().isNull()) { - int currentThread = currentThreadInterval.getStateValue().unboxInt(); - long time = currentThreadInterval.getStartTime(); - long duration = currentThreadInterval.getEndTime() - time + 1; + int status = statusInterval.getStateValue().unboxInt(); + long time = statusInterval.getStartTime(); + long duration = statusInterval.getEndTime() - time + 1; + if (!statusInterval.getStateValue().isNull()) { if (lastEndTime != time && lastEndTime != -1) { eventList.add(new TimeEvent(entry, lastEndTime, time - lastEndTime)); } - eventList.add(new ResourcesEvent(entry, time, duration, currentThread)); + eventList.add(new ResourcesEvent(entry, time, duration, status)); lastEndTime = time + duration; + } else { + if (includeNull) { + eventList.add(new ResourcesEvent(entry, time, duration)); + } } } } else if (entry.getType().equals(Type.IRQ)) {