Mercurial > hg > truffle
diff c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/CompilerImpl.java @ 2288:8c426c2891c8
client/server: new interface Remote marks classes that should not be serialized, but called remotely
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Mon, 11 Apr 2011 10:37:24 +0200 |
parents | 762de4b26788 |
children | 175e7b4d7322 |
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/CompilerImpl.java Fri Apr 08 13:47:56 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/CompilerImpl.java Mon Apr 11 10:37:24 2011 +0200 @@ -22,7 +22,6 @@ import java.io.*; import java.lang.management.*; -import java.lang.reflect.Proxy; import java.net.*; import com.sun.c1x.*; @@ -30,15 +29,13 @@ import com.sun.cri.xir.*; import com.sun.hotspot.c1x.logging.*; import com.sun.hotspot.c1x.server.*; -import com.sun.hotspot.c1x.server.ReplacingStreams.ReplacingInputStream; -import com.sun.hotspot.c1x.server.ReplacingStreams.ReplacingOutputStream; /** * Singleton class holding the instance of the C1XCompiler. * * @author Thomas Wuerthinger, Lukas Stadler */ -public final class CompilerImpl implements Compiler { +public final class CompilerImpl implements Compiler, Remote { private static Compiler theInstance; private static boolean PrintGCStats = false; @@ -50,8 +47,27 @@ public static Compiler getInstance() { if (theInstance == null) { - theInstance = new CompilerImpl(null); - Runtime.getRuntime().addShutdownHook(new ShutdownThread()); + // remote compilation (will not create a C1XCompiler) + String remote = System.getProperty("c1x.remote"); + if (remote != null) { + try { + System.out.println("C1X compiler started in client/server mode, server: " + remote); + Socket socket = new Socket(remote, 1199); + ReplacingStreams streams = new ReplacingStreams(socket.getOutputStream(), socket.getInputStream()); + streams.getInvocation().sendResult(new VMEntriesNative()); + + theInstance = (Compiler) streams.getInvocation().waitForResult(); + } catch (IOException e1) { + System.out.println("Connection to compilation server FAILED."); + throw new RuntimeException(e1); + } catch (ClassNotFoundException e2) { + System.out.println("Connection to compilation server FAILED."); + throw new RuntimeException(e2); + } + } else { + theInstance = new CompilerImpl(null); + Runtime.getRuntime().addShutdownHook(new ShutdownThread()); + } } return theInstance; } @@ -96,6 +112,7 @@ public static Compiler initializeServer(VMEntries entries) { assert theInstance == null; theInstance = new CompilerImpl(entries); + Runtime.getRuntime().addShutdownHook(new ShutdownThread()); return theInstance; } @@ -110,31 +127,6 @@ } private CompilerImpl(VMEntries entries) { - // remote compilation (will not create a C1XCompiler) - String remote = System.getProperty("c1x.remote"); - if (remote != null) { - try { - System.out.println("C1X compiler started in client/server mode, server: " + remote); - Socket socket = new Socket(remote, 1199); - ReplacingStreams streams = new ReplacingStreams(); - - ReplacingOutputStream output = streams.new ReplacingOutputStream(new BufferedOutputStream(socket.getOutputStream())); - // required, because creating an ObjectOutputStream writes a header, but doesn't flush the stream - output.flush(); - ReplacingInputStream input = streams.new ReplacingInputStream(new BufferedInputStream(socket.getInputStream())); - input.setCompiler(this); - - InvocationSocket invocation = new InvocationSocket(output, input); - vmEntries = new VMEntriesNative(); - vmExits = (VMExits) Proxy.newProxyInstance(VMExits.class.getClassLoader(), new Class<?>[] { VMExits.class}, invocation); - invocation.setDelegate(vmEntries); - compiler = null; - return; - } catch (IOException t) { - System.out.println("Connection to compilation server FAILED."); - throw new RuntimeException(t); - } - } // initialize VMEntries if (entries == null)