| /******************************************************************************* |
| * Copyright (c) 2000, 2015 IBM Corporation and others. |
| * 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.debug.tests.performance; |
| |
| import org.eclipse.debug.core.DebugEvent; |
| import org.eclipse.debug.core.DebugException; |
| import org.eclipse.debug.core.DebugPlugin; |
| import org.eclipse.debug.core.IDebugEventSetListener; |
| import org.eclipse.debug.core.ILaunchConfiguration; |
| import org.eclipse.jdt.debug.core.IJavaLineBreakpoint; |
| import org.eclipse.jdt.debug.core.IJavaThread; |
| import org.eclipse.jdt.debug.tests.AbstractDebugPerformanceTest; |
| import org.eclipse.test.performance.Dimension; |
| |
| /** |
| * Tests performance of conditional breakpoints. |
| */ |
| public class PerfConditionalBreakpointsTests extends AbstractDebugPerformanceTest { |
| private String fTypeName = "PerfLoop"; |
| |
| private int fHitCount = 0; |
| |
| private IJavaLineBreakpoint fBP; |
| |
| private Exception fException; |
| |
| private boolean fConditionalBreakpointSet = false; |
| |
| private boolean fWarmUpComplete = false; |
| |
| private int fWarmUpRuns = 2; |
| |
| private int fMeasuredRuns = 10; |
| |
| private class BreakpointListener implements IDebugEventSetListener { |
| /** |
| * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[]) |
| */ |
| @Override |
| public void handleDebugEvents(DebugEvent[] events) { |
| for (int i = 0; i < events.length; i++) { |
| DebugEvent event = events[i]; |
| if (event.getKind() == DebugEvent.SUSPEND && event.getDetail() == DebugEvent.BREAKPOINT) { |
| IJavaThread source = (IJavaThread) event.getSource(); |
| breakpointHit(source); |
| } |
| } |
| } |
| } |
| |
| /** |
| * Constructor |
| * @param name |
| */ |
| public PerfConditionalBreakpointsTests(String name) { |
| super(name); |
| } |
| |
| /** |
| * Tests the performance of launching to conditional breakpoints |
| * @throws Exception |
| */ |
| public void testConditionalBreakpoints() throws Exception { |
| tagAsSummary("Conditional Breakpoint Test", Dimension.ELAPSED_PROCESS); |
| // just in case |
| removeAllBreakpoints(); |
| |
| fBP = createLineBreakpoint(22, fTypeName); |
| |
| BreakpointListener listener = new BreakpointListener(); |
| DebugPlugin.getDefault().addDebugEventListener(listener); |
| ILaunchConfiguration config = getLaunchConfiguration(fTypeName); |
| try { |
| launchAndTerminate(config, 5 * 60 * 1000, false); |
| |
| if (fException != null) { |
| throw fException; |
| } |
| |
| commitMeasurements(); |
| assertPerformance(); |
| |
| removeAllBreakpoints(); |
| } finally { |
| DebugPlugin.getDefault().removeDebugEventListener(listener); |
| } |
| } |
| |
| private synchronized void breakpointHit(IJavaThread thread) { |
| try { |
| if (!fConditionalBreakpointSet) { |
| fBP.delete(); |
| fBP = createConditionalLineBreakpoint(22, fTypeName, "i%100==0", true); |
| fConditionalBreakpointSet = true; |
| } else if (!fWarmUpComplete) { |
| fHitCount++; |
| if (fHitCount == fWarmUpRuns) { |
| fWarmUpComplete = true; |
| fHitCount = 0; |
| } |
| return; |
| } else { |
| if (fHitCount > 0) { |
| stopMeasuring(); |
| } |
| fHitCount++; |
| if (fHitCount <= fMeasuredRuns) { |
| System.gc(); |
| startMeasuring(); |
| } else { |
| fBP.delete(); |
| } |
| } |
| } catch (Exception e) { |
| fException = e; |
| removeAllBreakpoints(); |
| } finally { |
| try { |
| thread.resume(); |
| } catch (DebugException e) { |
| fException = e; |
| } |
| } |
| } |
| } |