/*
DroidFish - An Android chess program.
Copyright (C) 2012-2013,2016 Peter Ă–sterlund, peterosterlund2@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.petero.droidfish.engine;
import java.util.LinkedList;
import java.util.Locale;
/** Implements line-based text communication between threads. */
public class LocalPipe {
private LinkedList<String> lines = new LinkedList<String>();
private boolean closed = false;
/** Write a line to the pipe. */
public final synchronized void printLine(String format) {
String s = String.format(Locale.US, format, new Object[]{});
addLine(s);
}
/** Write a line to the pipe. */
public final synchronized void printLine(String format, Object ... args) {
String s = String.format(Locale.US, format, args);
addLine(s);
}
public final synchronized void addLine(String line) {
while (lines.size() > 10000) {
try {
wait(10);
} catch (InterruptedException e) {
}
}
lines.add(line);
notify();
}
/** Read a line from the pipe. Returns null on failure. */
public final synchronized String readLine() {
return readLine(-1);
}
/** Read a line from the pipe. Returns null on failure. Returns empty string on timeout. */
public final synchronized String readLine(int timeoutMillis) {
if (closed)
return null;
try {
if (lines.isEmpty()) {
if (timeoutMillis > 0)
wait(timeoutMillis);
else
wait();
}
if (lines.isEmpty())
return closed ? null : "";
String ret = lines.get(0);
lines.remove(0);
return ret;
} catch (InterruptedException e) {
return null;
}
}
/** Close pipe. Makes readLine() return null. */
public final synchronized void close() {
closed = true;
notify();
}
/** Return true if writer side has closed the pipe. */
public final synchronized boolean isClosed() {
return closed;
}
}