From 4f2bd079f4adb4349ffab67313d85392b87c759a Mon Sep 17 00:00:00 2001 From: Matthew Khouzam Date: Wed, 6 Apr 2016 18:14:00 -0400 Subject: [PATCH] os.linux: Do not rely on static initialisation order for layouts Expose DefaultLayout#getInstance() instead of DefaultLayout#INSTANCE This solves a weird problem where the layout could be null. To reproduce this problem, define and run the following test suite: @RunWith(Suite.class) @Suite.SuiteClasses({ VirtualMachineAnalysisTest.class, LttngKernelAnalysisTest.class, PartialStateSystemTest.class, StateSystemInMemoryTest.class, StateSystemFullHistoryTest.class }) public class TestSuite { } Change-Id: I772ee0944334283d4b36118001a858322921d98a Signed-off-by: Matthew Khouzam Reviewed-on: https://git.eclipse.org/r/69864 Reviewed-by: Alexandre Montplaisir Tested-by: Alexandre Montplaisir Reviewed-by: Hudson CI --- .../stubs/trace/KernelEventLayoutStub.java | 5 ++- .../linux/core/trace/DefaultEventLayout.java | 33 +++++++++++++------ .../trace/IKernelAnalysisEventLayout.java | 2 +- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core.tests/stubs/org/eclipse/tracecompass/analysis/os/linux/core/tests/stubs/trace/KernelEventLayoutStub.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core.tests/stubs/org/eclipse/tracecompass/analysis/os/linux/core/tests/stubs/trace/KernelEventLayoutStub.java index 4f9a854588..37574bd08e 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core.tests/stubs/org/eclipse/tracecompass/analysis/os/linux/core/tests/stubs/trace/KernelEventLayoutStub.java +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core.tests/stubs/org/eclipse/tracecompass/analysis/os/linux/core/tests/stubs/trace/KernelEventLayoutStub.java @@ -10,7 +10,6 @@ package org.eclipse.tracecompass.analysis.os.linux.core.tests.stubs.trace; import org.eclipse.tracecompass.analysis.os.linux.core.trace.DefaultEventLayout; -import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout; /** * Class to extend to be able to set the event names for the os unit tests. @@ -26,7 +25,7 @@ public class KernelEventLayoutStub extends DefaultEventLayout { super(); } - private static final IKernelAnalysisEventLayout INSTANCE = new KernelEventLayoutStub(); + private static final KernelEventLayoutStub INSTANCE = new KernelEventLayoutStub(); /** * Get an instance of this event layout @@ -36,7 +35,7 @@ public class KernelEventLayoutStub extends DefaultEventLayout { * * @return The instance */ - public static IKernelAnalysisEventLayout getInstance() { + public static synchronized KernelEventLayoutStub getInstance() { return INSTANCE; } diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/trace/DefaultEventLayout.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/trace/DefaultEventLayout.java index e34d32cff1..6d1d709c69 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/trace/DefaultEventLayout.java +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/trace/DefaultEventLayout.java @@ -15,6 +15,7 @@ package org.eclipse.tracecompass.analysis.os.linux.core.trace; import java.util.Collection; import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import com.google.common.collect.ImmutableList; @@ -30,6 +31,26 @@ import com.google.common.collect.ImmutableList; */ public class DefaultEventLayout implements IKernelAnalysisEventLayout { + private static @Nullable DefaultEventLayout INSTANCE; + + /** + * The instance of this event layout + * + * This object is completely immutable, so no need to create additional + * instances via the constructor. + * + * @return the instance + * @since 2.0 + */ + public static synchronized DefaultEventLayout getInstance() { + DefaultEventLayout inst = INSTANCE; + if (inst == null) { + inst = new DefaultEventLayout(); + INSTANCE = inst; + } + return inst; + } + /* Event names */ private static final String IRQ_HANDLER_ENTRY = "irq_handler_entry"; //$NON-NLS-1$ private static final String IRQ_HANDLER_EXIT = "irq_handler_exit"; //$NON-NLS-1$ @@ -47,8 +68,7 @@ public class DefaultEventLayout implements IKernelAnalysisEventLayout { private static final String SCHED_WAKING = "sched_waking"; //$NON-NLS-1$ private static final String SCHED_WAKEUP = "sched_wakeup"; //$NON-NLS-1$ private static final String SCHED_WAKEUP_NEW = "sched_wakeup_new"; //$NON-NLS-1$ - private static final Collection SCHED_WAKEUP_EVENTS = - ImmutableList.of(SCHED_WAKEUP, SCHED_WAKEUP_NEW); + private static final Collection SCHED_WAKEUP_EVENTS = ImmutableList.of(SCHED_WAKEUP, SCHED_WAKEUP_NEW); private static final String SCHED_PROCESS_FORK = "sched_process_fork"; //$NON-NLS-1$ private static final String SCHED_PROCESS_EXIT = "sched_process_exit"; //$NON-NLS-1$ @@ -96,14 +116,6 @@ public class DefaultEventLayout implements IKernelAnalysisEventLayout { protected DefaultEventLayout() { } - /** - * The instance of this event layout - * - * This object is completely immutable, so no need to create additional - * instances via the constructor. - */ - static final IKernelAnalysisEventLayout INSTANCE = new DefaultEventLayout(); - // ------------------------------------------------------------------------ // Event names // ------------------------------------------------------------------------ @@ -191,6 +203,7 @@ public class DefaultEventLayout implements IKernelAnalysisEventLayout { public String eventCompatSyscallExitPrefix() { return SYSCALL_EXIT_PREFIX; } + /** * @since 2.0 */ diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/trace/IKernelAnalysisEventLayout.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/trace/IKernelAnalysisEventLayout.java index 91feb0fd6c..6ff8fdc033 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/trace/IKernelAnalysisEventLayout.java +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/trace/IKernelAnalysisEventLayout.java @@ -34,7 +34,7 @@ public interface IKernelAnalysisEventLayout { * The standard layout, very useful for test vectors that are not kernel * based. */ - IKernelAnalysisEventLayout DEFAULT_LAYOUT = DefaultEventLayout.INSTANCE; + IKernelAnalysisEventLayout DEFAULT_LAYOUT = DefaultEventLayout.getInstance(); /** * Whenever a process appears for the first time in a trace, we assume it -- 2.34.1