Mercurial > hg > truffle
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); }