Home | History | Annotate | Download | only in art
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package art;
     18 
     19 public class Test1933 {
     20   public static void run() throws Exception {
     21     System.out.println("No contention");
     22     testNoContention(new Monitors.NamedLock("test testNoContention"));
     23 
     24     System.out.println("Normal contended monitor");
     25     testNormalContendedMonitor(new Monitors.NamedLock("test testNormalContendedMonitor"));
     26 
     27     System.out.println("Waiting on a monitor");
     28     testNormalWaitMonitor(new Monitors.NamedLock("test testNormalWaitMonitor"));
     29   }
     30 
     31   public static void testNormalWaitMonitor(final Monitors.NamedLock lk) throws Exception {
     32     final Monitors.LockController controller1 = new Monitors.LockController(lk);
     33      controller1.DoLock();
     34      controller1.waitForLockToBeHeld();
     35      controller1.DoWait();
     36      controller1.waitForNotifySleep();
     37      // Spurious wakeups can hurt us here. Just retry until we get the result we expect. The test
     38      // will timeout eventually.
     39      Object mon = controller1.getWorkerContendedMonitor();
     40      for (; mon == null; mon = controller1.getWorkerContendedMonitor()) { Thread.yield(); }
     41      System.out.println("c1 is contending for monitor: " + mon);
     42      synchronized (lk) {
     43        lk.DoNotifyAll();
     44      }
     45      controller1.DoUnlock();
     46   }
     47 
     48   public static void testNormalContendedMonitor(final Monitors.NamedLock lk) throws Exception {
     49      final Monitors.LockController controller1 = new Monitors.LockController(lk);
     50      final Monitors.LockController controller2 = new Monitors.LockController(lk);
     51      controller1.DoLock();
     52      controller1.waitForLockToBeHeld();
     53      controller2.DoLock();
     54      controller2.waitForContendedSleep();
     55      System.out.println("c2 is contending for monitor: " + controller2.getWorkerContendedMonitor());
     56      controller1.DoUnlock();
     57      controller2.waitForLockToBeHeld();
     58      controller2.DoUnlock();
     59   }
     60 
     61   public static void testNoContention(final Monitors.NamedLock lk) throws Exception {
     62     synchronized (lk) {
     63       System.out.println("current thread is contending for monitor: " +
     64           Monitors.getCurrentContendedMonitor(null));
     65     }
     66   }
     67 }
     68