diff c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/CompilationServer.java @ 2285:762de4b26788

turn Compiler and HotSpotTypeResolved into interfaces
author Lukas Stadler <lukas.stadler@jku.at>
date Fri, 08 Apr 2011 13:43:05 +0200
parents 569d3fe7d65c
children 8c426c2891c8
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/CompilationServer.java	Thu Apr 07 15:32:25 2011 +0200
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/CompilationServer.java	Fri Apr 08 13:43:05 2011 +0200
@@ -27,11 +27,12 @@
 
 import javax.net.*;
 
-import com.sun.cri.ci.*;
 import com.sun.hotspot.c1x.*;
 import com.sun.hotspot.c1x.Compiler;
 import com.sun.hotspot.c1x.InvocationSocket.DelegateCallback;
 import com.sun.hotspot.c1x.logging.*;
+import com.sun.hotspot.c1x.server.ReplacingStreams.ReplacingInputStream;
+import com.sun.hotspot.c1x.server.ReplacingStreams.ReplacingOutputStream;
 
 /**
  * Server side of the client/server compilation model.
@@ -40,105 +41,33 @@
  */
 public class CompilationServer {
 
-    private Registry registry;
-    private ServerSocket serverSocket;
-    private Socket socket;
-
     private ReplacingOutputStream output;
     private ReplacingInputStream input;
 
-
     public static void main(String[] args) throws Exception {
         new CompilationServer().run();
     }
 
-    public static class Container implements Serializable {
-
-        public final Class<?> clazz;
-        public final Object[] values;
-
-        public Container(Class<?> clazz, Object... values) {
-            this.clazz = clazz;
-            this.values = values;
-        }
-    }
-
-    /**
-     * Replaces certain cir objects that cannot easily be made Serializable.
-     */
-    public static class ReplacingOutputStream extends ObjectOutputStream {
-
-        public ReplacingOutputStream(OutputStream out) throws IOException {
-            super(out);
-            enableReplaceObject(true);
-        }
-
-        @Override
-        protected Object replaceObject(Object obj) throws IOException {
-            Class<? extends Object> clazz = obj.getClass();
-            if (clazz == CiConstant.class) {
-                CiConstant o = (CiConstant) obj;
-                return new Container(clazz, o.kind, o.boxedValue());
-            } else if (obj == CiValue.IllegalValue) {
-                return new Container(CiValue.class);
-            } else if (obj instanceof Compiler) {
-                return new Container(Compiler.class);
-            }
-            return obj;
-        }
-    }
-
-    /**
-     * Replaces certain cir objects that cannot easily be made Serializable.
-     */
-    public static class ReplacingInputStream extends ObjectInputStream {
-        private Compiler compiler;
-
-        public ReplacingInputStream(InputStream in) throws IOException {
-            super(in);
-            enableResolveObject(true);
-        }
-
-        public void setCompiler(Compiler compiler) {
-            this.compiler = compiler;
-        }
-
-        @Override
-        protected Object resolveObject(Object obj) throws IOException {
-            if (obj instanceof Container) {
-                Container c = (Container) obj;
-                if (c.clazz == CiConstant.class) {
-                    return CiConstant.forBoxed((CiKind) c.values[0], c.values[1]);
-                } else if (c.clazz == CiValue.class) {
-                    return CiValue.IllegalValue;
-                } else if (c.clazz == Compiler.class) {
-                    assert compiler != null;
-                    return compiler;
-                }
-                throw new RuntimeException("unexpected container class: " + c.clazz);
-            }
-            return obj;
-        }
-    }
-
     private void run() throws IOException, ClassNotFoundException {
-        serverSocket = ServerSocketFactory.getDefault().createServerSocket(1199);
+        ServerSocket serverSocket = ServerSocketFactory.getDefault().createServerSocket(1199);
         do {
+            Socket socket = null;
+            ReplacingStreams streams = new ReplacingStreams();
             try {
                 Logger.log("Compilation server ready, waiting for client to connect...");
                 socket = serverSocket.accept();
                 Logger.log("Connected to " + socket.getRemoteSocketAddress());
 
-                output = new ReplacingOutputStream(new BufferedOutputStream(socket.getOutputStream()));
+                output = streams.new ReplacingOutputStream(new BufferedOutputStream(socket.getOutputStream()));
                 // required, because creating an ObjectOutputStream writes a header, but doesn't flush the stream
                 output.flush();
-                input = new ReplacingInputStream(new BufferedInputStream(socket.getInputStream()));
+                input = streams.new ReplacingInputStream(new BufferedInputStream(socket.getInputStream()));
 
                 final InvocationSocket invocation = new InvocationSocket(output, input);
-                invocation.setDelegateCallback( new DelegateCallback() {
+                invocation.setDelegateCallback(new DelegateCallback() {
                     public Object getDelegate() {
-                        VMEntries entries = (VMEntries) Proxy.newProxyInstance(VMEntries.class.getClassLoader(), new Class<?>[] {VMEntries.class}, invocation);
-                        Compiler compiler = Compiler.initializeServer(entries);
+                        VMEntries entries = (VMEntries) Proxy.newProxyInstance(VMEntries.class.getClassLoader(), new Class<?>[] { VMEntries.class}, invocation);
+                        Compiler compiler = CompilerImpl.initializeServer(entries);
                         input.setCompiler(compiler);
                         return compiler.getVMExits();
                     }
@@ -147,7 +76,9 @@
                 invocation.waitForResult();
             } catch (IOException e) {
                 e.printStackTrace();
-                socket.close();
+                if (socket != null) {
+                    socket.close();
+                }
             }
         } while (false);
     }