public class Schlucht {
	private int someoneIsPassing = 0;
	private int maxPassing = 5;
	private Condition eastWestAllowed = new Condition();
	private Condition westEastAllowed = new Condition();
	private Mutex mutex = new Mutex();

	public void eastWest() {
		mutex.lock();
		while(someoneIsPassing < 0 || (someoneIsPassing > 0 && westEastAllowed.waiter() > 0) || Math.abs(someoneIsPassing) >= maxPassing) {
			eastWest.wait(mutex);
		}
		someoneIsPassing++;
		mutex.unlock();

		pass();

		mutex.lock();
		someoneIsPassing--;

		if(eastWestAllowed.waiters() > 0) {
			if(someoneIsPassing == 0) {
				for(int i = 0; i < maxPassing; i++) {
					westEastAllowed.signal();
				}
			}
		}
		else {
			for(int i = Math.abs(someoneIsPassing); i < maxPassing; i++) {
				eastWestAllowed.signal();
			}
		}
		mutex.unlock();
	}

	public void westEast() {
		mutex.lock();
		while(someoneIsPassing > 0 || (someoneIsPassing > 0 && eastWestAllowed.waiter() > 0) || Math.abs(someoneIsPassing) >= maxPassing) {
			westEast.wait(mutex);
		}
		someoneIsPassing--;
		mutex.unlock();

		pass();

		mutex.lock();
		someoneIsPassing++;

		if(westEastAllowed.waiters() > 0) {
			if(someoneIsPassing == 0) {
				for(int i = 0; i < maxPassing; i++) {
					eastWestAllowed.signal();
				}
			}
		}
		else {
			for(int i = Math.abs(someoneIsPassing); i < maxPassing; i++) {
				westEastAllowed.signal();
			}
		}
		mutex.unlock();
	}

	public void pass() {
		System.out.println("I pass the canyon");
	}
}
