Files
i2p.i2p/apps/ministreaming/java/src/net/i2p/client/streaming/I2PServerSocketImpl.java

75 lines
1.5 KiB
Java
Raw Normal View History

2004-04-08 04:41:54 +00:00
package net.i2p.client.streaming;
import java.net.ConnectException;
2004-04-08 04:41:54 +00:00
import net.i2p.I2PException;
import net.i2p.util.Log;
/**
* Initial stub implementation for the server socket
*
*/
class I2PServerSocketImpl implements I2PServerSocket {
private final static Log _log = new Log(I2PServerSocketImpl.class);
private I2PSocketManager mgr;
2004-04-10 11:50:11 +00:00
private I2PSocket cached = null; // buffer one socket here
private boolean closing = false; // Are we being closed?
private Object acceptLock = new Object();
2004-04-08 04:41:54 +00:00
public I2PServerSocketImpl(I2PSocketManager mgr) {
2004-04-10 11:50:11 +00:00
this.mgr = mgr;
2004-04-08 04:41:54 +00:00
}
2004-04-10 11:50:11 +00:00
public synchronized I2PSocket accept() throws I2PException, ConnectException {
I2PSocket ret;
synchronized (acceptLock) {
while ((cached == null) && !closing) {
myWait();
}
if (closing) {
throw new ConnectException("I2PServerSocket closed");
}
ret = cached;
cached = null;
acceptLock.notifyAll();
}
2004-04-10 11:50:11 +00:00
_log.debug("TIMING: handed out accept result " + ret.hashCode());
return ret;
2004-04-08 04:41:54 +00:00
}
2004-04-10 11:50:11 +00:00
public boolean getNewSocket(I2PSocket s) {
synchronized (acceptLock) {
while (cached != null) {
myWait();
}
cached = s;
acceptLock.notifyAll();
}
2004-04-10 11:50:11 +00:00
return true;
2004-04-08 04:41:54 +00:00
}
2004-04-10 11:50:11 +00:00
2004-04-08 04:41:54 +00:00
public void close() throws I2PException {
synchronized (acceptLock) {
closing = true;
acceptLock.notifyAll();
}
2004-04-08 04:41:54 +00:00
}
2004-04-10 11:50:11 +00:00
public I2PSocketManager getManager() {
return mgr;
}
private void myWait() {
try {
acceptLock.wait();
} catch (InterruptedException ex) {}
}
}