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