|
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.
|