diff options
author | Guilhem Lavaux <guilhem@kaffe.org> | 2003-12-26 16:13:01 +0000 |
---|---|---|
committer | Michael Koch <mkoch@gcc.gnu.org> | 2003-12-26 16:13:01 +0000 |
commit | 38910ebb1b81498c7dfbd7904acf01a31052d17b (patch) | |
tree | 84dc4a18f5caccf1c8cec629cbe0024e43eb4af0 /libjava | |
parent | 4d42522958f2df6273535420af2b6b7b0e954ac7 (diff) | |
download | gcc-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/ChangeLog | 24 | ||||
-rw-r--r-- | libjava/gnu/java/rmi/server/RMIVoidValue.java | 51 | ||||
-rw-r--r-- | libjava/gnu/java/rmi/server/UnicastConnectionManager.java | 3 | ||||
-rw-r--r-- | libjava/gnu/java/rmi/server/UnicastRemoteCall.java | 99 | ||||
-rw-r--r-- | libjava/gnu/java/rmi/server/UnicastServer.java | 2 | ||||
-rw-r--r-- | libjava/gnu/java/rmi/server/UnicastServerRef.java | 7 |
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()); } } |