package org.python.pydev.core.concurrency; import org.python.pydev.shared_core.callbacks.ICallback0; public class ConditionEvent { private final Object lock = new Object(); private boolean set = false; private final ICallback0<Boolean> markSetIfConditionReturnedTrue; private final long timeout; /** * * @param timeout only used if markSetIfConditionReturnedTrue != null */ public ConditionEvent(ICallback0<Boolean> markSetIfConditionReturnedTrue, long timeout) { this.markSetIfConditionReturnedTrue = markSetIfConditionReturnedTrue; this.timeout = timeout; } public void set() { synchronized (lock) { set = true; lock.notifyAll(); } } public void unset() { synchronized (lock) { set = false; } } public void waitForSet() { if (markSetIfConditionReturnedTrue != null) { synchronized (lock) { while (!set) { try { lock.wait(timeout); } catch (InterruptedException e) { //ok } if (this.markSetIfConditionReturnedTrue.call()) { set = true; } } } } else { synchronized (lock) { while (!set) { try { lock.wait(); //no timeout } catch (InterruptedException e) { //ok } } } } } }