summaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorGuilhem Lavaux <guilhem@kaffe.org>2003-12-26 16:13:01 +0000
committerMichael Koch <mkoch@gcc.gnu.org>2003-12-26 16:13:01 +0000
commit38910ebb1b81498c7dfbd7904acf01a31052d17b (patch)
tree84dc4a18f5caccf1c8cec629cbe0024e43eb4af0 /libjava
parent4d42522958f2df6273535420af2b6b7b0e954ac7 (diff)
downloadgcc-38910ebb1b81498c7dfbd7904acf01a31052d17b.tar.gz
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
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog24
-rw-r--r--libjava/gnu/java/rmi/server/RMIVoidValue.java51
-rw-r--r--libjava/gnu/java/rmi/server/UnicastConnectionManager.java3
-rw-r--r--libjava/gnu/java/rmi/server/UnicastRemoteCall.java99
-rw-r--r--libjava/gnu/java/rmi/server/UnicastServer.java2
-rw-r--r--libjava/gnu/java/rmi/server/UnicastServerRef.java7
6 files changed, 153 insertions, 33 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index f6fd7f13dda..68a94764d38 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,27 @@
+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.
+
2003-12-25 Andreas Tobler <a.tobler@schweiz.ch>
* libltdl/ltdl.c (HAVE_DYLD): Remove ifdef conditional for
diff --git a/libjava/gnu/java/rmi/server/RMIVoidValue.java b/libjava/gnu/java/rmi/server/RMIVoidValue.java
new file mode 100644
index 00000000000..7829fc60138
--- /dev/null
+++ b/libjava/gnu/java/rmi/server/RMIVoidValue.java
@@ -0,0 +1,51 @@
+/* RMIVoidValue.java
+ Copyright (c) 2003 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 2, or (at your option)
+any later version.
+
+GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.rmi.server;
+
+/**
+ * Package private class used to indicate a void return type.
+ * INSTANCE is the only object of this class ever made.
+ */
+final class RMIVoidValue
+{
+ static RMIVoidValue INSTANCE = new RMIVoidValue();
+
+ private RMIVoidValue()
+ {
+ }
+}
diff --git a/libjava/gnu/java/rmi/server/UnicastConnectionManager.java b/libjava/gnu/java/rmi/server/UnicastConnectionManager.java
index d54dcf1d4cd..3b9aa40e0b8 100644
--- a/libjava/gnu/java/rmi/server/UnicastConnectionManager.java
+++ b/libjava/gnu/java/rmi/server/UnicastConnectionManager.java
@@ -152,6 +152,9 @@ private static void startScavenger(){
if (debug) System.out.println("************* exit scavenger.");
}
});
+ // As it is used for client connection, we may put this thread
+ // in daemon state to prevent the VM from blocking when exiting.
+ scavenger.setDaemon(true);
scavenger.start();
}
diff --git a/libjava/gnu/java/rmi/server/UnicastRemoteCall.java b/libjava/gnu/java/rmi/server/UnicastRemoteCall.java
index 68d1bfe01d8..2d7d6d4a9ff 100644
--- a/libjava/gnu/java/rmi/server/UnicastRemoteCall.java
+++ b/libjava/gnu/java/rmi/server/UnicastRemoteCall.java
@@ -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);
}
diff --git a/libjava/gnu/java/rmi/server/UnicastServer.java b/libjava/gnu/java/rmi/server/UnicastServer.java
index baa1ef1aa4a..fb6ec1f35a5 100644
--- a/libjava/gnu/java/rmi/server/UnicastServer.java
+++ b/libjava/gnu/java/rmi/server/UnicastServer.java
@@ -144,7 +144,7 @@ private static void incomingMessageCall(UnicastConnection conn) throws IOExcepti
(new UID()).write(out);
if(returnval != null && returncls != null)
((RMIObjectOutputStream)out).writeValue(returnval, returncls);
- else
+ else if (!(returnval instanceof RMIVoidValue))
out.writeObject(returnval);
out.flush();
diff --git a/libjava/gnu/java/rmi/server/UnicastServerRef.java b/libjava/gnu/java/rmi/server/UnicastServerRef.java
index e2f38ff5f8c..b004927502f 100644
--- a/libjava/gnu/java/rmi/server/UnicastServerRef.java
+++ b/libjava/gnu/java/rmi/server/UnicastServerRef.java
@@ -254,8 +254,11 @@ public Object incomingMessageCall(UnicastConnection conn, int method, long hash)
throw new NoSuchMethodException();
}
UnicastRemoteCall call = new UnicastRemoteCall(conn);
- skel.dispatch(myself, call, method, hash);
- return (call.returnValue());
+ skel.dispatch(myself, call, method, hash);
+ if (!call.isReturnValue())
+ return RMIVoidValue.INSTANCE;
+ else
+ return (call.returnValue());
}
}