This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FYI: Patch: gnu.java.rmi.server merge


Hi list,


I commited the attached patch from classpath to merge this again.


Michael
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.2486
diff -u -b -B -r1.2486 ChangeLog
--- ChangeLog	25 Dec 2003 17:31:12 -0000	1.2486
+++ ChangeLog	26 Dec 2003 16:09:40 -0000
@@ -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  Michael Koch  <konqueror@gmx.de>
 
 	* java/net/ServerSocket.java bind():
Index: gnu/java/rmi/server/RMIVoidValue.java
===================================================================
RCS file: gnu/java/rmi/server/RMIVoidValue.java
diff -N gnu/java/rmi/server/RMIVoidValue.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gnu/java/rmi/server/RMIVoidValue.java	26 Dec 2003 16:09:40 -0000
@@ -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()
+  {
+  }
+}
Index: gnu/java/rmi/server/UnicastConnectionManager.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/rmi/server/UnicastConnectionManager.java,v
retrieving revision 1.4
diff -u -b -B -r1.4 UnicastConnectionManager.java
--- gnu/java/rmi/server/UnicastConnectionManager.java	7 Nov 2002 18:01:05 -0000	1.4
+++ gnu/java/rmi/server/UnicastConnectionManager.java	26 Dec 2003 16:09:40 -0000
@@ -152,6 +152,9 @@
             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();
 }
 
Index: gnu/java/rmi/server/UnicastRemoteCall.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/rmi/server/UnicastRemoteCall.java,v
retrieving revision 1.5
diff -u -b -B -r1.5 UnicastRemoteCall.java
--- gnu/java/rmi/server/UnicastRemoteCall.java	8 Jun 2003 01:35:32 -0000	1.5
+++ gnu/java/rmi/server/UnicastRemoteCall.java	26 Dec 2003 16:09:40 -0000
@@ -65,6 +65,7 @@
   private long hash;
   private Vector vec;
   private int ptr;
+  private ObjID objid;
 
   private ObjectOutput oout;
   private ObjectInput oin;
@@ -86,22 +87,7 @@
     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 ObjectOutput getOutputStream() throws IOException
   {
-    if (conn != null)
-      {
-	if(oout == null)
-	  return (oout = conn.getObjectOutputStream());
-	else
-	  return oout;
-      }
-    else
-      {
+    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 @@
   {
     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 @@
     // 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 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);
     }
 
Index: gnu/java/rmi/server/UnicastServer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/rmi/server/UnicastServer.java,v
retrieving revision 1.4
diff -u -b -B -r1.4 UnicastServer.java
--- gnu/java/rmi/server/UnicastServer.java	7 Nov 2002 18:01:05 -0000	1.4
+++ gnu/java/rmi/server/UnicastServer.java	26 Dec 2003 16:09:40 -0000
@@ -144,7 +144,7 @@
 	(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();
Index: gnu/java/rmi/server/UnicastServerRef.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/rmi/server/UnicastServerRef.java,v
retrieving revision 1.6
diff -u -b -B -r1.6 UnicastServerRef.java
--- gnu/java/rmi/server/UnicastServerRef.java	14 Jul 2003 06:05:42 -0000	1.6
+++ gnu/java/rmi/server/UnicastServerRef.java	26 Dec 2003 16:09:40 -0000
@@ -255,6 +255,9 @@
 		}
 		UnicastRemoteCall call = new UnicastRemoteCall(conn);
 		skel.dispatch(myself, call, method, hash);
+		if (!call.isReturnValue())
+		  return RMIVoidValue.INSTANCE;
+		else
 		return (call.returnValue());
 	}
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]