Mercurial > hg > truffle
diff c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/CompilationServer.java @ 2284:569d3fe7d65c
non-static VMEntries and VMExits, CompilationServer simplifications
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Thu, 07 Apr 2011 15:32:25 +0200 |
parents | 52bb06250d35 |
children | 762de4b26788 |
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/CompilationServer.java Mon Apr 04 21:02:45 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/CompilationServer.java Thu Apr 07 15:32:25 2011 +0200 @@ -28,9 +28,9 @@ import javax.net.*; import com.sun.cri.ci.*; -import com.sun.cri.ri.*; import com.sun.hotspot.c1x.*; import com.sun.hotspot.c1x.Compiler; +import com.sun.hotspot.c1x.InvocationSocket.DelegateCallback; import com.sun.hotspot.c1x.logging.*; /** @@ -43,8 +43,10 @@ private Registry registry; private ServerSocket serverSocket; private Socket socket; - private ObjectOutputStream output; - private ObjectInputStream input; + + private ReplacingOutputStream output; + private ReplacingInputStream input; + public static void main(String[] args) throws Exception { new CompilationServer().run(); @@ -77,12 +79,10 @@ if (clazz == CiConstant.class) { CiConstant o = (CiConstant) obj; return new Container(clazz, o.kind, o.boxedValue()); - } else if (clazz == CiDebugInfo.class) { - CiDebugInfo o = (CiDebugInfo) obj; - return new Container(clazz, o.codePos, o.registerRefMap, o.frameRefMap); - } else if (clazz == CiCodePos.class) { - CiCodePos o = (CiCodePos) obj; - return new Container(clazz, o.caller, o.method, o.bci); + } else if (obj == CiValue.IllegalValue) { + return new Container(CiValue.class); + } else if (obj instanceof Compiler) { + return new Container(Compiler.class); } return obj; } @@ -92,24 +92,30 @@ * 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 == CiDebugInfo.class) { - return new CiDebugInfo((CiCodePos) c.values[0], (CiBitMap) c.values[2], (CiBitMap) c.values[3]); - } else if (c.clazz == CiCodePos.class) { - return new CiCodePos((CiCodePos) c.values[0], (RiMethod) c.values[1], (Integer) c.values[2]); + } 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"); + throw new RuntimeException("unexpected container class: " + c.clazz); } return obj; } @@ -117,24 +123,32 @@ private void run() throws IOException, ClassNotFoundException { serverSocket = ServerSocketFactory.getDefault().createServerSocket(1199); - while (true) { + do { try { Logger.log("Compilation server ready, waiting for client to connect..."); socket = serverSocket.accept(); Logger.log("Connected to " + socket.getRemoteSocketAddress()); - output = new ReplacingOutputStream(socket.getOutputStream()); - input = new ReplacingInputStream(socket.getInputStream()); + + output = 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())); - InvocationSocket invocation = new InvocationSocket(output, input); - VMEntries entries = (VMEntries) Proxy.newProxyInstance(VMEntries.class.getClassLoader(), new Class<?>[] {VMEntries.class}, invocation); - VMExits exits = Compiler.initializeServer(entries); - invocation.setDelegate(exits); + final InvocationSocket invocation = new InvocationSocket(output, input); + 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); + input.setCompiler(compiler); + return compiler.getVMExits(); + } + }); invocation.waitForResult(); } catch (IOException e) { e.printStackTrace(); socket.close(); } - } + } while (false); } }