package nl.uu.cs.tbijlsma.concjmeta; import static nl.uu.cs.tbijlsma.concj.Globals.getLockMeta; import nl.uu.cs.tbijlsma.concj.ConcJExclude; import nl.uu.cs.tbijlsma.concj.Globals; import nl.uu.cs.tbijlsma.concj.lock.Lock; import nl.uu.cs.tbijlsma.concj.lock.LockMeta; import nl.uu.cs.tbijlsma.concj.thread.SwitchPointMode; import nl.uu.cs.tbijlsma.concj.thread.ThreadManager; /** * Re-implements Object.wait() in instrumentable code. */ @ConcJExclude public final class Wait { private Wait() { } public static void wait(Object obj) throws InterruptedException { wait(obj, 0); } public static void wait(Object obj, long millis, int nanos) throws InterruptedException { if (nanos >= 500000 || (nanos != 0 && millis == 0)) { millis++; } wait(obj, millis); } public static void wait(Object obj, long millis) throws InterruptedException { Thread thread = Thread.currentThread(); ThreadManager tman = Globals.getThreadManager(); LockMeta lm = getLockMeta(); Lock lock = lm.toLock(obj); synchronized (tman) { lm.onEnterWait(thread, lock); } try { SwitchPointMode waitMode = (millis > 0 ? SwitchPointMode.TIMED_WAIT : SwitchPointMode.WAIT); tman.switchPoint(lock, waitMode); } finally { synchronized (tman) { lm.onExitWait(thread, lock); } if (Thread.interrupted()) { throw new InterruptedException(); } } } }