From: <cr...@us...> - 2008-10-02 14:07:56
|
Revision: 4595 http://jnode.svn.sourceforge.net/jnode/?rev=4595&view=rev Author: crawley Date: 2008-10-02 13:24:26 +0000 (Thu, 02 Oct 2008) Log Message: ----------- Implemented more infrastructure for isolate Status messages. Modified Paths: -------------- trunk/core/src/classpath/ext/javax/isolate/IsolateStatus.java trunk/core/src/core/org/jnode/vm/isolate/VmIsolate.java trunk/core/src/core/org/jnode/vm/isolate/link/DataLinkMessage.java trunk/core/src/core/org/jnode/vm/isolate/link/IsolateLinkMessage.java trunk/core/src/core/org/jnode/vm/isolate/link/LinkLinkMessage.java trunk/core/src/core/org/jnode/vm/isolate/link/LinkMessageImpl.java trunk/core/src/core/org/jnode/vm/isolate/link/ObjectLinkMessage.java trunk/core/src/core/org/jnode/vm/isolate/link/StringLinkMessage.java trunk/core/src/core/org/jnode/vm/isolate/link/VmLink.java trunk/shell/src/shell/org/jnode/shell/isolate/IsolateCommandThreadImpl.java Added Paths: ----------- trunk/core/src/core/org/jnode/vm/isolate/link/StatusLinkMessage.java Modified: trunk/core/src/classpath/ext/javax/isolate/IsolateStatus.java =================================================================== --- trunk/core/src/classpath/ext/javax/isolate/IsolateStatus.java 2008-09-30 22:09:24 UTC (rev 4594) +++ trunk/core/src/classpath/ext/javax/isolate/IsolateStatus.java 2008-10-02 13:24:26 UTC (rev 4595) @@ -88,7 +88,7 @@ * @param type * @param exitReason */ - IsolateStatus(State state, ExitReason exitReason, int exitCode) { + public IsolateStatus(State state, ExitReason exitReason, int exitCode) { this.state = state; this.exitReason = exitReason; this.exitCode = exitCode; Modified: trunk/core/src/core/org/jnode/vm/isolate/VmIsolate.java =================================================================== --- trunk/core/src/core/org/jnode/vm/isolate/VmIsolate.java 2008-09-30 22:09:24 UTC (rev 4594) +++ trunk/core/src/core/org/jnode/vm/isolate/VmIsolate.java 2008-10-02 13:24:26 UTC (rev 4595) @@ -35,7 +35,9 @@ import javax.isolate.Isolate; import javax.isolate.IsolateStartupException; +import javax.isolate.IsolateStatus; import javax.isolate.Link; +import javax.isolate.LinkMessage; import javax.naming.NameNotFoundException; import org.jnode.naming.InitialNaming; @@ -54,6 +56,7 @@ import org.jnode.vm.annotation.SharedStatics; import org.jnode.vm.classmgr.VmIsolatedStatics; import org.jnode.vm.classmgr.VmType; +import org.jnode.vm.isolate.link.StatusLinkMessage; import org.jnode.vm.isolate.link.VmLink; /** @@ -783,6 +786,26 @@ } private void sendStatus(VmLink link, State state) { - // TODO implement. + IsolateStatus.State istate = null; + switch (state) { + case CREATED: + istate = IsolateStatus.State.UNKNOWN; + break; + case STARTING: + istate = IsolateStatus.State.STARTING; + break; + case STARTED: + istate = IsolateStatus.State.STARTED; + break; + case EXITED: + istate = IsolateStatus.State.EXITING; + break; + case TERMINATED: + istate = IsolateStatus.State.EXITED; + break; + } + LinkMessage message = + new StatusLinkMessage(istate, IsolateStatus.ExitReason.IMPLICIT_EXIT, 0); + link.sendStatus(message); } } Modified: trunk/core/src/core/org/jnode/vm/isolate/link/DataLinkMessage.java =================================================================== --- trunk/core/src/core/org/jnode/vm/isolate/link/DataLinkMessage.java 2008-09-30 22:09:24 UTC (rev 4594) +++ trunk/core/src/core/org/jnode/vm/isolate/link/DataLinkMessage.java 2008-10-02 13:24:26 UTC (rev 4595) @@ -22,7 +22,7 @@ * @see org.jnode.vm.isolate.LinkMessageImpl#CloneMessage() */ @Override - LinkMessageImpl CloneMessage() { + LinkMessageImpl cloneMessage() { final byte[] data = new byte[length]; System.arraycopy(bytes, offset, data, 0, length); return new DataLinkMessage(data, 0, length); Modified: trunk/core/src/core/org/jnode/vm/isolate/link/IsolateLinkMessage.java =================================================================== --- trunk/core/src/core/org/jnode/vm/isolate/link/IsolateLinkMessage.java 2008-09-30 22:09:24 UTC (rev 4594) +++ trunk/core/src/core/org/jnode/vm/isolate/link/IsolateLinkMessage.java 2008-10-02 13:24:26 UTC (rev 4595) @@ -25,7 +25,7 @@ * @see org.jnode.vm.isolate.LinkMessageImpl#CloneMessage() */ @Override - LinkMessageImpl CloneMessage() { + LinkMessageImpl cloneMessage() { return new IsolateLinkMessage(value); } Modified: trunk/core/src/core/org/jnode/vm/isolate/link/LinkLinkMessage.java =================================================================== --- trunk/core/src/core/org/jnode/vm/isolate/link/LinkLinkMessage.java 2008-09-30 22:09:24 UTC (rev 4594) +++ trunk/core/src/core/org/jnode/vm/isolate/link/LinkLinkMessage.java 2008-10-02 13:24:26 UTC (rev 4595) @@ -23,7 +23,7 @@ * @see org.jnode.vm.isolate.LinkMessageImpl#CloneMessage() */ @Override - LinkMessageImpl CloneMessage() { + LinkMessageImpl cloneMessage() { return new LinkLinkMessage(value); } Modified: trunk/core/src/core/org/jnode/vm/isolate/link/LinkMessageImpl.java =================================================================== --- trunk/core/src/core/org/jnode/vm/isolate/link/LinkMessageImpl.java 2008-09-30 22:09:24 UTC (rev 4594) +++ trunk/core/src/core/org/jnode/vm/isolate/link/LinkMessageImpl.java 2008-10-02 13:24:26 UTC (rev 4595) @@ -19,7 +19,7 @@ * * @return */ - abstract LinkMessageImpl CloneMessage(); + abstract LinkMessageImpl cloneMessage(); /** * Block the current thread, until this message has its received flag set. Modified: trunk/core/src/core/org/jnode/vm/isolate/link/ObjectLinkMessage.java =================================================================== --- trunk/core/src/core/org/jnode/vm/isolate/link/ObjectLinkMessage.java 2008-09-30 22:09:24 UTC (rev 4594) +++ trunk/core/src/core/org/jnode/vm/isolate/link/ObjectLinkMessage.java 2008-10-02 13:24:26 UTC (rev 4595) @@ -1,13 +1,39 @@ +/* + * $Id: VmIsolate.java 4592 2008-09-30 12:00:11Z crawley $ + * + * JNode.org + * Copyright (C) 2003-2006 JNode.org + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; If not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ package org.jnode.vm.isolate.link; +/** + * This message type passes an object by reference. This is probably a bad idea + * because it 'breaks' the isolation of isolates. Use sparingly if at all. + * + * @author cr...@jn... + */ public class ObjectLinkMessage extends LinkMessageImpl { - + private final Object obj; - + private ObjectLinkMessage(Object cr) { this.obj = cr; } - + public static ObjectLinkMessage newMessage (Object obj) { return new ObjectLinkMessage(obj); } @@ -18,7 +44,7 @@ } @Override - LinkMessageImpl CloneMessage() { + LinkMessageImpl cloneMessage() { return new ObjectLinkMessage(obj); } } Added: trunk/core/src/core/org/jnode/vm/isolate/link/StatusLinkMessage.java =================================================================== --- trunk/core/src/core/org/jnode/vm/isolate/link/StatusLinkMessage.java (rev 0) +++ trunk/core/src/core/org/jnode/vm/isolate/link/StatusLinkMessage.java 2008-10-02 13:24:26 UTC (rev 4595) @@ -0,0 +1,90 @@ +/* + * $Id: VmIsolate.java 4592 2008-09-30 12:00:11Z crawley $ + * + * JNode.org + * Copyright (C) 2003-2006 JNode.org + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; If not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.jnode.vm.isolate.link; + +import javax.isolate.IsolateStatus; + +/** + * This class is use to transport status isolate information + * @author cr...@jn... + */ +public final class StatusLinkMessage extends LinkMessageImpl { + + private final String state; + private final String exitReason; + private final int exitCode; + + /** + * Internal message constructor used by cloneMessage + * + * @param value + */ + private StatusLinkMessage(String state, String exitReason, int exitCode) { + this.state = state; + this.exitReason = exitReason; + this.exitCode = exitCode; + } + + /** + * Message constructor used VmIsolate + * + * @param value + */ + public StatusLinkMessage(IsolateStatus.State state, IsolateStatus.ExitReason exitReason, + int exitCode) { + this(state.toString(), exitReason.toString(), exitCode); + } + + /** + * @see org.jnode.vm.isolate.LinkMessageImpl#CloneMessage() + */ + @Override + LinkMessageImpl cloneMessage() { + return new StatusLinkMessage(state, exitReason, exitCode); + } + + /** + * @see javax.isolate.LinkMessage#extract() + */ + @Override + public Object extract() { + return extractStatus(); + } + + /** + * @see javax.isolate.LinkMessage#containsString() + */ + @Override + public boolean containsStatus() { + return true; + } + + /** + * @see javax.isolate.LinkMessage#extractString() + */ + @Override + public IsolateStatus extractStatus() { + return new IsolateStatus( + IsolateStatus.State.valueOf(state), + IsolateStatus.ExitReason.valueOf(exitReason), + exitCode); + } +} Modified: trunk/core/src/core/org/jnode/vm/isolate/link/StringLinkMessage.java =================================================================== --- trunk/core/src/core/org/jnode/vm/isolate/link/StringLinkMessage.java 2008-09-30 22:09:24 UTC (rev 4594) +++ trunk/core/src/core/org/jnode/vm/isolate/link/StringLinkMessage.java 2008-10-02 13:24:26 UTC (rev 4595) @@ -21,7 +21,7 @@ * @see org.jnode.vm.isolate.LinkMessageImpl#CloneMessage() */ @Override - LinkMessageImpl CloneMessage() { + LinkMessageImpl cloneMessage() { return new StringLinkMessage(new String(value)); } Modified: trunk/core/src/core/org/jnode/vm/isolate/link/VmLink.java =================================================================== --- trunk/core/src/core/org/jnode/vm/isolate/link/VmLink.java 2008-09-30 22:09:24 UTC (rev 4594) +++ trunk/core/src/core/org/jnode/vm/isolate/link/VmLink.java 2008-10-02 13:24:26 UTC (rev 4595) @@ -189,7 +189,7 @@ message = messages.poll(); } message.notifyReceived(); - return message.CloneMessage(); + return message.cloneMessage(); } /** @@ -278,18 +278,11 @@ * * @param message the status message to be sent. */ - public final void sendStatus(LinkMessage message) { - if (VmIsolate.currentIsolate() != sender) { - // Current isolate is not the sender for this message - throw new UnsupportedOperationException(); + public final synchronized void sendStatus(LinkMessage message) { + if (!this.closed) { + // Send message + messages.add((LinkMessageImpl) message); + notifyAll(); } - final LinkMessageImpl messageImpl = (LinkMessageImpl) message; - synchronized (this) { - if (!this.closed) { - // Send message - messages.add(messageImpl); - notifyAll(); - } - } } } Modified: trunk/shell/src/shell/org/jnode/shell/isolate/IsolateCommandThreadImpl.java =================================================================== --- trunk/shell/src/shell/org/jnode/shell/isolate/IsolateCommandThreadImpl.java 2008-09-30 22:09:24 UTC (rev 4594) +++ trunk/shell/src/shell/org/jnode/shell/isolate/IsolateCommandThreadImpl.java 2008-10-02 13:24:26 UTC (rev 4595) @@ -12,7 +12,9 @@ import java.util.Properties; import javax.isolate.Isolate; +import javax.isolate.IsolateStatus; import javax.isolate.Link; +import javax.isolate.LinkMessage; import javax.isolate.StreamBindings; import org.jnode.shell.CommandRunner; @@ -107,9 +109,18 @@ public void start(ThreadExitListener listener) throws ShellInvocationException { try { Link cl = Link.newLink(Isolate.currentIsolate(), isolate); + Link sl = isolate.newStatusLink(); isolate.start(cl); ObjectLinkMessage msg = ObjectLinkMessage.newMessage(this.cr); cl.send(msg); + while (true) { + LinkMessage statusMsg = sl.receive(); + IsolateStatus status = statusMsg.extractStatus(); + if (status.getState().equals(IsolateStatus.State.EXITED)) { + System.err.println("Got the EXITED message"); + break; + } + } } catch (Exception ex) { throw new ShellInvocationException("Cannot start isolate", ex); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |