/******************************************************************************* * Copyright (C) 2014 Google Inc 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: * Steve Foreman (Google) - initial API and implementation * Marcus Eng (Google) *******************************************************************************/ package org.eclipse.ui.internal.monitoring; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.swt.widgets.Display; /** * Used by 'Delays' menu to trigger an intentional delay on the UI thread to * test the logging of UI freezes. */ public class DelayHandler extends AbstractHandler { private static final int NS_PER_MS = 1000 * 1000; private static final Display display = Display.getDefault(); @Override public Object execute(ExecutionEvent event) { String syncStr = event.getParameter("org.eclipse.ui.monitoring.manualtesting.commands.delay.sync"); final boolean sync = syncStr != null && !syncStr.isEmpty() && Boolean.parseBoolean(syncStr); String durationStr = event.getParameter("org.eclipse.ui.monitoring.manualtesting.commands.delay.duration"); if (durationStr == null) { throw new IllegalArgumentException( "org.eclipse.ui.monitoring.manualtesting.commands.delay.duration parameter not provided"); } final long durationNs = Long.parseLong(durationStr) * NS_PER_MS; Runnable doDelay = new Runnable() { @Override public void run() { double durationMs = (double) durationNs / (double) NS_PER_MS; System.out.printf("Starting delay for %.6fms%n", durationMs); long startTime = System.nanoTime(); monitoringTestSleep(durationNs); long actualDuration = System.nanoTime() - startTime; System.out.printf("Delay for %.6fms complete. Actual duration: %.6fms%n", durationMs, (double) actualDuration / (double) NS_PER_MS); } }; if (sync) { display.syncExec(doDelay); } else { display.asyncExec(doDelay); } return null; } private static void monitoringTestSleep(long nanoseconds) { long endTime = System.nanoTime() + nanoseconds; try { while (true) { long nsRemaining = endTime - System.nanoTime(); if (nsRemaining > NS_PER_MS) { Thread.sleep(nsRemaining / NS_PER_MS, (int) (nsRemaining % NS_PER_MS)); } else if (nsRemaining <= 0) { return; } // < 1ms remaining, just spin-wait } } catch (InterruptedException e) { // Wake up } } }