You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ad...@apache.org on 2004/04/25 00:34:02 UTC
cvs commit: incubator-geronimo/modules/network/src/java/org/apache/geronimo/network/protocol/control State.java ControlClientProtocol.java ControlServerProtocol.java
adc 2004/04/24 15:34:02
Modified: modules/network/src/java/org/apache/geronimo/network/protocol/control
ControlClientProtocol.java
ControlServerProtocol.java
Added: modules/network/src/java/org/apache/geronimo/network/protocol/control
State.java
Log:
Removed most locks. Removed reliance on startup dependency.
Revision Changes Path
1.7 +69 -73 incubator-geronimo/modules/network/src/java/org/apache/geronimo/network/protocol/control/ControlClientProtocol.java
Index: ControlClientProtocol.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/network/src/java/org/apache/geronimo/network/protocol/control/ControlClientProtocol.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ControlClientProtocol.java 24 Apr 2004 06:29:01 -0000 1.6
+++ ControlClientProtocol.java 24 Apr 2004 22:34:01 -0000 1.7
@@ -17,15 +17,14 @@
package org.apache.geronimo.network.protocol.control;
+import EDU.oswego.cs.dl.util.concurrent.Latch;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.apache.geronimo.network.protocol.DownPacket;
-import org.apache.geronimo.network.protocol.Protocol;
import org.apache.geronimo.network.protocol.ProtocolException;
import org.apache.geronimo.network.protocol.UpPacket;
-import EDU.oswego.cs.dl.util.concurrent.Latch;
-
/**
* @version $Revision$ $Date$
@@ -35,25 +34,9 @@
final static private Log log = LogFactory.getLog(ControlClientProtocol.class);
private ControlClientListener listener;
- private ClassLoader classLoader;
- private Latch sendLatch = new Latch(); //todo: replace with something that uses no locks
- private Latch shutdownLatch = new Latch();
private long timeout;
- private final int STARTED = 0;
- private final int STOPPED = 1;
- private int state = STOPPED;
-
- /**
- * @see org.apache.geronimo.network.protocol.AbstractProtocol#cloneProtocol()
- */
- public Protocol cloneProtocol() throws CloneNotSupportedException {
- ControlClientProtocol p = (ControlClientProtocol)super.cloneProtocol();
- p.sendLatch = new Latch();
- p.shutdownLatch = new Latch();
- return p;
- }
-
+
public ControlClientListener getListener() {
return listener;
}
@@ -62,14 +45,6 @@
this.listener = listener;
}
- public ClassLoader getClassLoader() {
- return classLoader;
- }
-
- public void setClassLoader(ClassLoader classLoader) {
- this.classLoader = classLoader;
- }
-
public long getTimeout() {
return timeout;
}
@@ -80,20 +55,14 @@
public void setup() throws ProtocolException {
log.trace("Starting");
+
getDownProtocol().sendDown(new BootRequestDownPacket()); //todo: this is probably dangerous, put in thread pool
- state = STARTED;
}
public void drain() throws ProtocolException {
log.trace("Stopping");
- if (state == STARTED) {
+ if (state == RUN) {
getDownProtocol().sendDown(new ShutdownRequestDownPacket());
- try {
- shutdownLatch.acquire();
- } catch (InterruptedException e) {
- throw new ProtocolException(e);
- }
- state = STOPPED;
}
}
@@ -101,51 +70,78 @@
}
public void sendUp(UpPacket packet) throws ProtocolException {
- UpPacket p = ControlPacketReader.getInstance().read(packet.getBuffer());
- if (p instanceof PassthroughUpPacket) {
- log.trace("PASSTHROUGH");
- getUpProtocol().sendUp(packet);
- } else if (p instanceof BootResponseUpPacket) {
+ state.sendUp(packet);
+ }
+
+ public void sendDown(DownPacket packet) throws ProtocolException {
+ state.sendDown(packet);
+ }
+
+ private final State START = new State(this) {
+ Latch startupLatch = new Latch();
+
+ public void sendUp(UpPacket packet) throws ProtocolException {
+ UpPacket p = ControlPacketReader.getInstance().read(packet.getBuffer());
+ if (p instanceof BootResponseUpPacket) {
+ try {
+ log.trace("BOOT RESPONSE");
+ listener.serveUp(((BootResponseUpPacket) p).getMenu());
+ getDownProtocol().sendDown(new BootSuccessDownPacket());
+ log.trace("RELEASING " + startupLatch);
+ state = RUN;
+ startupLatch.release();
+ log.trace("RELEASED " + startupLatch);
+ } catch (ControlException e) {
+ throw new ProtocolException(e);
+ }
+ } else if (p instanceof NoBootUpPacket) {
+ log.trace("NO BOOT");
+ listener.shutdown();
+ }
+ }
+
+ public void sendDown(DownPacket packet) throws ProtocolException {
try {
- log.trace("BOOT RESPONSE");
- listener.serveUp(((BootResponseUpPacket) p).getMenu());
- getDownProtocol().sendDown(new BootSuccessDownPacket());
- log.trace("RELEASING " + sendLatch);
- sendLatch.release();
- log.trace("RELEASED " + sendLatch);
- } catch (ControlException e) {
+ log.trace("AQUIRING " + startupLatch);
+ if (!startupLatch.attempt(timeout)) throw new ProtocolException("Send timeout");
+ log.trace("AQUIRED " + startupLatch);
+
+ PassthroughDownPacket passthtough = new PassthroughDownPacket();
+ passthtough.setBuffers(packet.getBuffers());
+
+ getDownProtocol().sendDown(passthtough);
+ } catch (InterruptedException e) {
throw new ProtocolException(e);
}
- } else if (p instanceof NoBootUpPacket) {
- log.trace("NO BOOT");
- state = STOPPED;
- listener.shutdown();
- } else if (p instanceof ShutdownRequestUpPacket) {
- log.trace("SHUTDOWN_REQ");
- getDownProtocol().sendDown(new ShutdownAcknowledgeDownPacket());
- state = STOPPED;
- listener.shutdown();
- } else if (p instanceof ShutdownAcknowledgeUpPacket) {
- log.trace("SHUTDOWN_ACK");
- shutdownLatch.release();
- state = STOPPED;
- listener.shutdown();
}
- }
+ };
- public void sendDown(DownPacket packet) throws ProtocolException {
- try {
- log.trace("AQUIRING " + sendLatch);
- if (!sendLatch.attempt(timeout)) throw new ProtocolException("Send timeout");
- log.trace("AQUIRED " + sendLatch);
+ private final State RUN = new State(this) {
+
+ public void sendUp(UpPacket packet) throws ProtocolException {
+ UpPacket p = ControlPacketReader.getInstance().read(packet.getBuffer());
+ if (p instanceof PassthroughUpPacket) {
+ log.trace("PASSTHROUGH");
+ getUpProtocol().sendUp(packet);
+ } else if (p instanceof ShutdownRequestUpPacket) {
+ log.trace("SHUTDOWN_REQ");
+ getDownProtocol().sendDown(new ShutdownAcknowledgeDownPacket());
+ listener.shutdown();
+ state = START;
+ } else if (p instanceof ShutdownAcknowledgeUpPacket) {
+ log.trace("SHUTDOWN_ACK");
+ listener.shutdown();
+ state = START;
+ }
+ }
+ public void sendDown(DownPacket packet) throws ProtocolException {
PassthroughDownPacket passthtough = new PassthroughDownPacket();
passthtough.setBuffers(packet.getBuffers());
getDownProtocol().sendDown(passthtough);
-
- } catch (InterruptedException e) {
- throw new ProtocolException(e);
}
- }
+ };
+
+ private volatile State state = START;
}
1.6 +80 -43 incubator-geronimo/modules/network/src/java/org/apache/geronimo/network/protocol/control/ControlServerProtocol.java
Index: ControlServerProtocol.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/network/src/java/org/apache/geronimo/network/protocol/control/ControlServerProtocol.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ControlServerProtocol.java 24 Apr 2004 06:29:01 -0000 1.5
+++ ControlServerProtocol.java 24 Apr 2004 22:34:01 -0000 1.6
@@ -19,17 +19,18 @@
import java.util.Collection;
+import EDU.oswego.cs.dl.util.concurrent.Latch;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.apache.geronimo.network.SelectorManager;
import org.apache.geronimo.network.protocol.DownPacket;
+import org.apache.geronimo.network.protocol.Protocol;
import org.apache.geronimo.network.protocol.ProtocolException;
import org.apache.geronimo.network.protocol.UpPacket;
import org.apache.geronimo.system.ClockPool;
import org.apache.geronimo.system.ThreadPool;
-import EDU.oswego.cs.dl.util.concurrent.Latch;
-
/**
* @version $Revision$ $Date$
@@ -43,13 +44,8 @@
private ThreadPool threadPool;
private ClockPool clockPool;
private SelectorManager selectorManager;
- private Latch sendLatch; //todo: replace with something that uses no locks
private long timeout;
- private final int STARTED = 0;
- private final int STOPPED = 1;
- private int state = STOPPED;
-
public ControlServerListener getControlServerListener() {
return controlServerListener;
}
@@ -98,17 +94,22 @@
this.timeout = timeout;
}
+ public Protocol cloneProtocol() throws CloneNotSupportedException {
+ ControlServerProtocol result = (ControlServerProtocol) super.clone();
+ result.START.setParent(result);
+ result.RUN.setParent(result);
+ return result;
+ }
+
public void setup() throws ProtocolException {
log.trace("Starting");
- sendLatch = new Latch();
- state = STARTED;
}
public void drain() throws ProtocolException {
log.trace("Stopping");
- if (state == STARTED) {
+
+ if (getState() == RUN) {
getDownProtocol().sendDown(new ShutdownRequestDownPacket());
- state = STOPPED;
}
}
@@ -116,40 +117,11 @@
}
public void sendUp(UpPacket packet) throws ProtocolException {
- UpPacket p = ControlPacketReader.getInstance().read(packet.getBuffer());
- if (p instanceof PassthroughUpPacket) {
- log.trace("PASSTHROUGH");
- getUpProtocol().sendUp(packet);
- } else if (p instanceof BootRequestUpPacket) {
- log.trace("BOOT REQUEST");
- getDownProtocol().sendDown(constructBootPacket());
- } else if (p instanceof BootSuccessUpPacket) {
- log.trace("BOOT SUCCESS");
- log.trace("RELEASING " + sendLatch);
- sendLatch.release();
- log.trace("RELEASED " + sendLatch);
- } else if (p instanceof ShutdownRequestUpPacket) {
- log.trace("SHUTDOWN_REQ");
- getDownProtocol().sendDown(new ShutdownAcknowledgeDownPacket());
- state = STOPPED;
- controlServerListener.shutdown();
- }
+ getState().sendUp(packet);
}
public void sendDown(DownPacket packet) throws ProtocolException {
- try {
- log.trace("AQUIRING " + sendLatch);
- if (!sendLatch.attempt(timeout)) throw new ProtocolException("Send timeout.");
- log.trace("AQUIRED " + sendLatch);
-
- PassthroughDownPacket passthtough = new PassthroughDownPacket();
- passthtough.setBuffers(packet.getBuffers());
-
- getDownProtocol().sendDown(passthtough);
-
- } catch (InterruptedException e) {
- throw new ProtocolException(e);
- }
+ getState().sendDown(packet);
}
protected DownPacket constructBootPacket() {
@@ -170,4 +142,69 @@
}
}
+ private final State START = new State(this) {
+ Latch startupLatch = new Latch();
+
+ public void sendUp(UpPacket packet) throws ProtocolException {
+ UpPacket p = ControlPacketReader.getInstance().read(packet.getBuffer());
+ if (p instanceof BootRequestUpPacket) {
+ log.trace("BOOT REQUEST");
+ getDownProtocol().sendDown(constructBootPacket());
+ } else if (p instanceof BootSuccessUpPacket) {
+ log.trace("BOOT SUCCESS");
+ log.trace("RELEASING " + startupLatch);
+ ((ControlServerProtocol)getParent()).setState(RUN);
+ startupLatch.release();
+ log.trace("RELEASED " + startupLatch);
+ }
+ }
+
+ public void sendDown(DownPacket packet) throws ProtocolException {
+ try {
+ log.trace("AQUIRING " + startupLatch);
+ if (!startupLatch.attempt(timeout)) throw new ProtocolException("Send timeout");
+ log.trace("AQUIRED " + startupLatch);
+
+ PassthroughDownPacket passthtough = new PassthroughDownPacket();
+ passthtough.setBuffers(packet.getBuffers());
+
+ getDownProtocol().sendDown(passthtough);
+ } catch (InterruptedException e) {
+ throw new ProtocolException(e);
+ }
+ }
+ };
+
+ private final State RUN = new State(this) {
+
+ public void sendUp(UpPacket packet) throws ProtocolException {
+ UpPacket p = ControlPacketReader.getInstance().read(packet.getBuffer());
+ if (p instanceof PassthroughUpPacket) {
+ log.trace("PASSTHROUGH");
+ getUpProtocol().sendUp(packet);
+ } else if (p instanceof ShutdownRequestUpPacket) {
+ log.trace("SHUTDOWN_REQ");
+ getDownProtocol().sendDown(new ShutdownAcknowledgeDownPacket());
+ ((ControlServerProtocol)getParent()).setState(START);
+ controlServerListener.shutdown();
+ }
+ }
+
+ public void sendDown(DownPacket packet) throws ProtocolException {
+ PassthroughDownPacket passthtough = new PassthroughDownPacket();
+ passthtough.setBuffers(packet.getBuffers());
+
+ getDownProtocol().sendDown(passthtough);
+ }
+ };
+
+ public State getState() {
+ return state;
+ }
+
+ public void setState(State state) {
+ this.state = state;
+ }
+
+ private volatile State state = START;
}
1.1 incubator-geronimo/modules/network/src/java/org/apache/geronimo/network/protocol/control/State.java
Index: State.java
===================================================================
/**
*
* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.geronimo.network.protocol.control;
import org.apache.geronimo.network.protocol.DownPacket;
import org.apache.geronimo.network.protocol.Protocol;
import org.apache.geronimo.network.protocol.ProtocolException;
import org.apache.geronimo.network.protocol.UpPacket;
/**
* @version $Revision: 1.1 $ $Date: 2004/04/24 22:34:01 $
*/
public abstract class State {
private Protocol parent;
protected State(Protocol parent) {
this.parent = parent;
}
public Protocol getParent() {
return parent;
}
public void setParent(Protocol parent) {
this.parent = parent;
}
protected Protocol getUpProtocol() {
return getParent().getUpProtocol();
}
protected Protocol getDownProtocol() {
return getParent().getDownProtocol();
}
public abstract void sendUp(UpPacket packet) throws ProtocolException;
public abstract void sendDown(DownPacket packet) throws ProtocolException;
}