2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
Mark Wielaard <mark@klomp.org> * gnu/java/rmi/server/UnicastConnectionManager.java (startScavenger): Set the client connection manager to daemon state because it may block clients until TIMEOUT is reached when they are exiting. * gnu/java/rmi/RMIVoidValue.java: New file for a class representing a void return. * gnu/java/rmi/server/UnicastRemoteCall.java (DummyOutputStream): Add a boolean before each written field to know whether it is a primitive. (releaseOutputStream): Flush parameters at write time. * gnu/java/rmi/server/UnicastServerRef.java (incomingMessageCall): Return a RMIVoidValue if no value is to be returned. * gnu/java/rmi/server/UnicastServer.java (incomingMessageCall): Do not write a returned object if it is a RMIVoidValue. Co-Authored-By: Mark Wielaard <mark@klomp.org> From-SVN: r75033
This commit is contained in:
parent
4d42522958
commit
38910ebb1b
6 changed files with 153 additions and 33 deletions
|
@ -65,6 +65,7 @@ public class UnicastRemoteCall
|
|||
private long hash;
|
||||
private Vector vec;
|
||||
private int ptr;
|
||||
private ObjID objid;
|
||||
|
||||
private ObjectOutput oout;
|
||||
private ObjectInput oin;
|
||||
|
@ -86,22 +87,7 @@ public class UnicastRemoteCall
|
|||
this.conn = conn;
|
||||
this.opnum = opnum;
|
||||
this.hash = hash;
|
||||
|
||||
// signal the call when constructing
|
||||
try
|
||||
{
|
||||
DataOutputStream dout = conn.getDataOutputStream();
|
||||
dout.write(MESSAGE_CALL);
|
||||
|
||||
oout = conn.getObjectOutputStream();
|
||||
objid.write(oout);
|
||||
oout.writeInt(opnum);
|
||||
oout.writeLong(hash);
|
||||
}
|
||||
catch(IOException ex)
|
||||
{
|
||||
throw new MarshalException("Try to write header but failed.", ex);
|
||||
}
|
||||
this.objid = objid;
|
||||
}
|
||||
|
||||
UnicastConnection getConnection()
|
||||
|
@ -111,22 +97,43 @@ public class UnicastRemoteCall
|
|||
|
||||
public ObjectOutput getOutputStream() throws IOException
|
||||
{
|
||||
if (conn != null)
|
||||
{
|
||||
if(oout == null)
|
||||
return (oout = conn.getObjectOutputStream());
|
||||
else
|
||||
return oout;
|
||||
}
|
||||
else
|
||||
{
|
||||
vec = new Vector();
|
||||
return (new DummyObjectOutputStream());
|
||||
}
|
||||
if (vec == null)
|
||||
vec = new Vector();
|
||||
return (new DummyObjectOutputStream());
|
||||
}
|
||||
|
||||
public void releaseOutputStream() throws IOException
|
||||
{
|
||||
if (vec != null)
|
||||
{
|
||||
oout = conn.getObjectOutputStream();
|
||||
|
||||
for (int i = 0; i < vec.size(); i += 2)
|
||||
{
|
||||
boolean primitive = ((Boolean)vec.elementAt(i)).booleanValue();
|
||||
Object data = vec.elementAt(i+1);
|
||||
|
||||
// No type, this is
|
||||
if (!primitive)
|
||||
oout.writeObject(data);
|
||||
else
|
||||
{
|
||||
if (data instanceof Boolean)
|
||||
oout.writeBoolean(((Boolean)data).booleanValue());
|
||||
else if (data instanceof Character)
|
||||
oout.writeChar(((Character)data).charValue());
|
||||
else if (data instanceof Byte)
|
||||
oout.writeByte(((Byte)data).byteValue());
|
||||
else if (data instanceof Short)
|
||||
oout.writeShort(((Short)data).shortValue());
|
||||
else if (data instanceof Integer)
|
||||
oout.writeInt(((Integer)data).intValue());
|
||||
else if (data instanceof Long)
|
||||
oout.writeLong(((Long)data).longValue());
|
||||
}
|
||||
}
|
||||
vec = null;
|
||||
}
|
||||
if(oout != null)
|
||||
oout.flush();
|
||||
}
|
||||
|
@ -163,6 +170,23 @@ public class UnicastRemoteCall
|
|||
{
|
||||
byte returncode;
|
||||
ObjectInput oin;
|
||||
|
||||
// signal the call when constructing
|
||||
try
|
||||
{
|
||||
DataOutputStream dout = conn.getDataOutputStream();
|
||||
dout.write(MESSAGE_CALL);
|
||||
|
||||
oout = conn.getObjectOutputStream();
|
||||
objid.write(oout);
|
||||
oout.writeInt(opnum);
|
||||
oout.writeLong(hash);
|
||||
}
|
||||
catch(IOException ex)
|
||||
{
|
||||
throw new MarshalException("Try to write header but failed.", ex);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
releaseOutputStream();
|
||||
|
@ -211,9 +235,15 @@ public class UnicastRemoteCall
|
|||
// conn.disconnect();
|
||||
}
|
||||
|
||||
boolean isReturnValue()
|
||||
{
|
||||
return vec.size() > 0;
|
||||
}
|
||||
|
||||
Object returnValue()
|
||||
{
|
||||
return (vec.size() > 0 ? vec.elementAt(0) : null);
|
||||
// This is not the first one (Boolean) but the second.
|
||||
return vec.elementAt(1);
|
||||
}
|
||||
|
||||
Object[] getArguments()
|
||||
|
@ -256,46 +286,55 @@ public class UnicastRemoteCall
|
|||
|
||||
public void writeBoolean(boolean v) throws IOException
|
||||
{
|
||||
vec.addElement(new Boolean(v));
|
||||
vec.addElement(Boolean.TRUE);
|
||||
vec.addElement(Boolean.valueOf(v));
|
||||
}
|
||||
|
||||
public void writeByte(int v) throws IOException
|
||||
{
|
||||
vec.addElement(Boolean.TRUE);
|
||||
vec.addElement(new Byte((byte) v));
|
||||
}
|
||||
|
||||
public void writeChar(int v) throws IOException
|
||||
{
|
||||
vec.addElement(Boolean.TRUE);
|
||||
vec.addElement(new Character((char) v));
|
||||
}
|
||||
|
||||
public void writeDouble(double v) throws IOException
|
||||
{
|
||||
vec.addElement(Boolean.TRUE);
|
||||
vec.addElement(new Double(v));
|
||||
}
|
||||
|
||||
public void writeFloat(float v) throws IOException
|
||||
{
|
||||
vec.addElement(Boolean.TRUE);
|
||||
vec.addElement(new Float(v));
|
||||
}
|
||||
|
||||
public void writeInt(int v) throws IOException
|
||||
{
|
||||
vec.addElement(Boolean.TRUE);
|
||||
vec.addElement(new Integer(v));
|
||||
}
|
||||
|
||||
public void writeLong(long v) throws IOException
|
||||
{
|
||||
vec.addElement(Boolean.TRUE);
|
||||
vec.addElement(new Long(v));
|
||||
}
|
||||
|
||||
public void writeShort(int v) throws IOException
|
||||
{
|
||||
vec.addElement(Boolean.TRUE);
|
||||
vec.addElement(new Short((short) v));
|
||||
}
|
||||
|
||||
public void writeObject(Object obj) throws IOException
|
||||
{
|
||||
vec.addElement(Boolean.FALSE);
|
||||
vec.addElement(obj);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue