From: Geneviève Bastien Date: Thu, 28 Apr 2016 13:38:30 +0000 (-0400) Subject: analysis.os: bug 488757: Let the KernelTidAspect block if not queryable X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=7858428e8f9736a7c77e96fc338af04589e41341;p=deliverable%2Ftracecompass.git analysis.os: bug 488757: Let the KernelTidAspect block if not queryable This aspect implements the blocking resolve method and, if the caller wishes, will block until the analysis is ready to be queried at the time of the event. A progress monitor is used to allow for cancelling the blocking call. This patch updates the system call latency analysis to block. Change-Id: Ie858bb4ed8984f6320af443030db4950ab5f7927 Signed-off-by: Geneviève Bastien Reviewed-on: https://git.eclipse.org/r/71604 Reviewed-by: Hudson CI Reviewed-by: Bernd Hufmann Tested-by: Bernd Hufmann --- diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/kernel/KernelTidAspect.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/kernel/KernelTidAspect.java index e2a2a6d9cd..a6dcbbd78b 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/kernel/KernelTidAspect.java +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/kernel/KernelTidAspect.java @@ -12,6 +12,9 @@ package org.eclipse.tracecompass.analysis.os.linux.core.kernel; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; +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.analysis.os.linux.core.tid.TidAnalysisModule; @@ -31,11 +34,23 @@ public final class KernelTidAspect extends LinuxTidAspect { /** The singleton instance */ public static final KernelTidAspect INSTANCE = new KernelTidAspect(); + private static final IProgressMonitor NULL_MONITOR = new NullProgressMonitor(); + private KernelTidAspect() { } @Override public @Nullable Integer resolve(ITmfEvent event) { + try { + return resolve(event, false, NULL_MONITOR); + } catch (InterruptedException e) { + /* Should not happen since there is nothing to interrupt */ + return null; + } + } + + @Override + public @Nullable Integer resolve(@NonNull ITmfEvent event, boolean block, final IProgressMonitor monitor) throws InterruptedException { /* Find the CPU this event is run on */ Integer cpu = TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event); @@ -49,7 +64,11 @@ public final class KernelTidAspect extends LinuxTidAspect { if (analysis == null) { return null; } - return analysis.getThreadOnCpuAtTime(cpu, event.getTimestamp().toNanos()); + long ts = event.getTimestamp().toNanos(); + while (block && !analysis.isQueryable(ts) && !monitor.isCanceled()) { + Thread.sleep(100); + } + return analysis.getThreadOnCpuAtTime(cpu, ts); } } diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/latency/SystemCallLatencyAnalysis.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/latency/SystemCallLatencyAnalysis.java index 912a6e4f65..e324337cf8 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/latency/SystemCallLatencyAnalysis.java +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/latency/SystemCallLatencyAnalysis.java @@ -21,6 +21,8 @@ import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelTidAspect; @@ -96,6 +98,7 @@ public class SystemCallLatencyAnalysis extends AbstractSegmentStoreAnalysisEvent private final Map fOngoingSystemCalls = new HashMap<>(); private @Nullable IKernelAnalysisEventLayout fLayout; + private final IProgressMonitor fMonitor = new NullProgressMonitor(); public SyscallLatencyAnalysisRequest(ISegmentStore syscalls) { super(syscalls); @@ -116,7 +119,12 @@ public class SystemCallLatencyAnalysis extends AbstractSegmentStoreAnalysisEvent eventName.startsWith(layout.eventCompatSyscallEntryPrefix())) { /* This is a system call entry event */ - Integer tid = KernelTidAspect.INSTANCE.resolve(event); + Integer tid; + try { + tid = KernelTidAspect.INSTANCE.resolve(event, true, fMonitor); + } catch (InterruptedException e) { + return; + } if (tid == null) { // no information on this event/trace ? return; @@ -137,7 +145,12 @@ public class SystemCallLatencyAnalysis extends AbstractSegmentStoreAnalysisEvent } else if (eventName.startsWith(layout.eventSyscallExitPrefix())) { /* This is a system call exit event */ - Integer tid = KernelTidAspect.INSTANCE.resolve(event); + Integer tid; + try { + tid = KernelTidAspect.INSTANCE.resolve(event, true, fMonitor); + } catch (InterruptedException e) { + return; + } if (tid == null) { return; } @@ -161,6 +174,13 @@ public class SystemCallLatencyAnalysis extends AbstractSegmentStoreAnalysisEvent @Override public void handleCompleted() { fOngoingSystemCalls.clear(); + super.handleCompleted(); + } + + @Override + public void handleCancel() { + fMonitor.setCanceled(true); + super.handleCancel(); } }