1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// Copyright 2007 The Android Open Source Project 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Exercise Object.wait(), comparing results against wall clock time. 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Main { 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* delays, in milliseconds */ 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final static long[] DELAYS = { 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 200, 500, 1000, 2000, 3500, 8000 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }; 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static void main(String[] args) { 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean timing = (args.length >= 1) && args[0].equals("--timing"); 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project doit(timing); 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static void doit(boolean timing) { 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object sleepy = new Object(); 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long start, end; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized (sleepy) { 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sleepy.wait(-500); 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("HEY: didn't throw on negative arg"); 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IllegalArgumentException iae) { 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Caught expected exception on neg arg"); 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (InterruptedException ie) { 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ie.printStackTrace(); 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for(long delay : DELAYS) { 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Waiting for " + delay + "ms..."); 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project start = System.currentTimeMillis(); 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sleepy.wait(delay); 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (InterruptedException ie) { 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ie.printStackTrace(); 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project end = System.currentTimeMillis(); 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long elapsed = end - start; 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean showTime = timing; 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (! timing) { 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long epsilon = delay / 10; 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (epsilon > 50) { 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project epsilon = 50; 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long min = delay - epsilon; 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long max = delay + epsilon; 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (elapsed < min) { 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println(" Elapsed time was too short"); 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showTime = true; 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (elapsed > max) { 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println(" Elapsed time was too long: " 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + "elapsed=" + elapsed + " max=" + max); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showTime = true; 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (showTime) { 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println(" Wall clock elapsed " 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + elapsed + "ms"); 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 73