SunSPOT API V2.0


com.sun.squawk
Class Isolate

java.lang.Object
  extended by com.sun.squawk.Isolate
All Implemented Interfaces:
Runnable

public final class Isolate
extends Object
implements Runnable

The Isolate class represents a "process-like" unit of computation that is isolated from other instances of Isolate. The mutable objects of one isolate are logically separate from the mutable objects of another isolate. Similarly, the static variables of one isolate are seperate from the static variables of another isolate.

A Simple Example

The following code example shows the creation of a simple isolate with a single main method argument of "test" and a default context. The created isolate simply prints its arguments array.

  // The creating isolate
  Isolate i = new Isolate("org.example.App", "test", null, Isolate.currentIsolate().getParentSuiteSourceURI());
  i.start();
  i.join(); // wait for child isolate to finish
  System.out.println("Child isolate returned with exit code: " + i.getExitCode());

  // The newly created isolate
  package org.example;

  public class App {
      public static void main(String[] args) {
          for(int i = 0; i < args.length; i++ )
              System.out.println(args[i]);
      }
  }
Note that the last two arguments to the constructor are a classpath, and a URI, which specify where the isolate's main class can be found. The classpath is used when Squawk is configured with a class TranslatorInterface, while the URI specifies the Suite which contains the translated class file org.example.App. In this example code we specified that the child isolate will use the same suite as the parent Isolate.

Hibernation

An isolate may be suspended in hibernation. Hibernation removes the isolate and all of the isolate's threads from further execution. Once an isolate is hibernated, it can be serialized using the save(DataOutputStream, String) method. The saved form of the isolate includes all reachable objects, the state of all static variables, and the current execution context of all of the isolate's threads (the thread stacks, etc). The saved form can be stored in a file, sent over a network, etc. load(DataInputStream, String) can be used reconstruct the saved isolate.

Details

An Isolate may be in one of several states: NEW, ALIVE, HIBERNATED, and EXITED. The methods isNew(), isAlive(), isHibernated(), isExited() can be used to determine an isolate's current state. An Isolate starts out in the NEW state. When the start() method is called the isolate becomes ALIVE. hibernate() causes an isolate to become HIBERNATED, while unhibernate() brings a HIBERNATED back to ALIVE. An ALIVE isolate may become EXITED by calling exit(int).

Isolates may communicate between each other using Channel and ServerChannel instances, or a parent isolate may pass arguments to the main method of the child isolate, or add properties to a child isolate be calling setProperty(String, String).

Each Isolate has independent output streams for System.out and System.err. These output streams can be attached to instances of Connection by passing Generic Connection Framework URIs to addOut(String) or addErr(String).

Squawk Isolates are loosely based on the Isolates of JSR 121 - Application Isolation API, but are not compliant with that specification. In particular, Squawk Isolates support hibernation, and use a different inter-isolate communication mechanism than JSR 121.

Author:
Nik Shaylor, Doug Simon
See Also:
Channel, ServerChannel

Constructor Summary
Isolate(String mainClassName, String[] args, String classPath, String parentSuiteSourceURI)
          Creates an new isolate.
 
Method Summary
 void addErr(String url)
          Adds a new connection to which System.err will send its output.
 void addOut(String url)
          Adds a new connection to which System.out will send its output.
 void clearErr()
          Removes all the connections to which System.err is sending its output.
 void clearOut()
          Removes all the connections to which System.out is sending its output.
static Isolate currentIsolate()
          Gets the current isolate context.
 void exit(int code)
          Stop the isolate.
 String getClassPath()
          Gets the class path for the isolate.
 int getExitCode()
          Get the isolate exit code.
 int getId()
          Gets the unique id for this isolate
static Isolate[] getIsolates()
          Returns an array of active Isolate objects.
 String[] getMainClassArguments()
          Get the arguments.
 String getMainClassName()
          Get the name of the main class.
 String getParentSuiteSourceURI()
           
 String getProperty(String key)
          Gets a named property of this isolate.
 void hibernate()
          Hibernate the isolate.
 String intern(String value)
          Returns a canonical representation for the string object.
 boolean isAlive()
          Determines if this isolate has been (re)started and not yet (re)hibernated or exited.
 boolean isBeingDebugged()
          Determines whether this isolate is being debugged
 boolean isExited()
          Determines if this isolate is exited.
 boolean isHibernated()
          Determines if this isolate is hibernated.
 boolean isNew()
          Determines if this isolate has not yet been started.
 boolean isTrusted()
          Determines if this isolate can access trusted classes.
 void join()
          Waits for all the other threads and child isolates belonging to this isolate to stop.
 String[] listErr()
          Gets a list of URLs denoting the streams to which System.err is currently sending its output.
 String[] listOut()
          Gets a list of URLs denoting the streams to which System.out is currently sending its output.
static Isolate load(DataInputStream dis, String uri)
          Loads a serialized isolate from an input stream into RAM.
 void removeErr(String url)
          Removes the connection identified by url (if any) to which System.err is currently sending its output.
 void removeOut(String url)
          Removes the connection identified by url (if any) to which System.out is currently sending its output.
 void run()
          Deprecated. This is called by start(), and shouldn't be called directly
 void save(DataOutputStream dos, String uri)
          Serializes the object graph rooted by this hibernated isolate and writes it to a given stream.
 void save(DataOutputStream dos, String uri, boolean bigEndian)
          Serializes the object graph rooted by this hibernated isolate and writes it to a given stream.
 void setProperty(String key, String value)
          Adds a named property to this isolate.
 void start()
          Start the isolate running.
 String toString()
          Get the string representation of the isolate.
 void unhibernate()
          Unhibernate the isolate.
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

Isolate

public Isolate(String mainClassName,
               String[] args,
               String classPath,
               String parentSuiteSourceURI)
Creates an new isolate. start() will create a new execution context, and start executing the main method of the class specified by mainClassName.

Parameters:
mainClassName - the name of the class with main()
args - the command line arguments
classPath - the path where classes and suites can be found (may be null)
parentSuiteSourceURI - the URI of the suite containing mainClassName. (may be null)
Throws:
NullPointerException - if mainClassName or args is null
Method Detail

addErr

public void addErr(String url)
Adds a new connection to which System.err will send its output.

If the current thread is not owned by this isolate, opening of the connection is delayed until the next time System.err is written to by one of this isolate's threads. Otherwise the connection is opened as part of this call.

Output will be multicast to the new stream as well as any preexisting connection streams.

Parameters:
url - the URL used to open the connection via Connector.openOutputStream(java.lang.String)

addOut

public void addOut(String url)
Adds a new connection to which System.out will send its output.

If the current thread is not owned by this isolate, opening of the connection is delayed until the next time System.out is written to by one of this isolate's threads. Otherwise the connection is opened as part of this call.

Output will be multicast to the new stream as well as any preexisting connection streams.

The following code snippet is an example of how to pipe the standard output of the current isolate to a network connection:

     Thread.currentThread().getIsolate().addOut("socket://server.domain.com:9999").
 

Parameters:
url - the URL used to open the connection via Connector.openOutputStream(java.lang.String)

clearErr

public void clearErr()
Removes all the connections to which System.err is sending its output. The removed connections are immediately flushed and closed. Any IO exceptions are caught and are unlikely to be printed.


clearOut

public void clearOut()
Removes all the connections to which System.out is sending its output. The removed connections are immediately flushed and closed.. Any IO exceptions are caught and might be printed.


currentIsolate

public static Isolate currentIsolate()
Gets the current isolate context.

Returns:
the current Isolate context.

exit

public void exit(int code)
Stop the isolate.

Parameters:
code - the exit code
Throws:
IllegalStateException - if this isolate has not yet been started or is already hibernated or exited

getClassPath

public String getClassPath()
Gets the class path for the isolate.

Returns:
the class path

getExitCode

public int getExitCode()
Get the isolate exit code.

Returns:
the exit code

getId

public int getId()
Gets the unique id for this isolate

Returns:
the id of this isolate

getIsolates

public static Isolate[] getIsolates()
Returns an array of active Isolate objects. The array contains one entry for each isolate in the invoker's aggregate that has been started but has not yet terminated. New isolates may have been constructed or existing ones terminated by the time method returns.

Returns:
the active Isolate objects present at the time of the call

getMainClassArguments

public String[] getMainClassArguments()
Get the arguments.

Returns:
the arguments

getMainClassName

public String getMainClassName()
Get the name of the main class.

Returns:
the name

getParentSuiteSourceURI

public String getParentSuiteSourceURI()
Returns:
the URI of suite from which this isolate was started. This value will be "memory:bootstrap" if the isolate was not given an explicit suite at creation time.

getProperty

public String getProperty(String key)
Gets a named property of this isolate.

Parameters:
key - the name of the property to get
Returns:
the value of the property named by 'key' or null if there is no such property

hibernate

public void hibernate()
               throws IOException,
                      IllegalStateException
Hibernate the isolate. If the current thread is in this isolate then this function will only return when the isolate is unhibernated.

Throws:
IOException - if the underlying IO system cannot be serialized
IllegalStateException - if this isolate has not yet been started or is already hibernated or exited or has a debugger attached to it

intern

public String intern(String value)
Returns a canonical representation for the string object.

A pool of strings, initially empty, is maintained privately by the class Isolate.

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the Object.equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.

All literal strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language Specification

Returns:
a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.

isAlive

public boolean isAlive()
Determines if this isolate has been (re)started and not yet (re)hibernated or exited.

Returns:
true if it is

isBeingDebugged

public boolean isBeingDebugged()
Determines whether this isolate is being debugged

Returns:
true if it is

isExited

public boolean isExited()
Determines if this isolate is exited.

Returns:
true if it is

isHibernated

public boolean isHibernated()
Determines if this isolate is hibernated.

Returns:
true if it is

isNew

public boolean isNew()
Determines if this isolate has not yet been started.

Returns:
true if it is

isTrusted

public boolean isTrusted()
Determines if this isolate can access trusted classes. A trusted class will call this method in its static constructor.

Returns:
boolean

join

public void join()
Waits for all the other threads and child isolates belonging to this isolate to stop.


listErr

public String[] listErr()
Gets a list of URLs denoting the streams to which System.err is currently sending its output. Note that due to multi-threading, the returned list may not reflect the complete set of streams. If a stream was added by another thread, then the returned list may not include the URL of the added stream. If a stream was removed by another thread, then the returned list may include the URL of the removed stream.

Returns:
the list of streams to which System.err is currently sending its output

listOut

public String[] listOut()
Gets a list of URLs denoting the streams to which System.out is currently sending its output. Note that due to multi-threading, the returned list may not reflect the complete set of streams. If a stream was added by another thread, then the returned list may not include the URL of the added stream. If a stream was removed by another thread, then the returned list may include the URL of the removed stream.

Returns:
the list of streams to which System.out is currently sending its output

load

public static Isolate load(DataInputStream dis,
                           String uri)
Loads a serialized isolate from an input stream into RAM. It is up to the caller to unhibernate the isolate.

Parameters:
dis - the data input stream to load from
uri - a URI identifying the serialized isolate

removeErr

public void removeErr(String url)
Removes the connection identified by url (if any) to which System.err is currently sending its output. The removed connection is immediately flushed and closed. Any IO exceptions are caught and might be printed.

Parameters:
url - the URL identifying the connection to be removed

removeOut

public void removeOut(String url)
Removes the connection identified by url (if any) to which System.out is currently sending its output. The removed connection is immediately flushed and closed. Any IO exceptions are caught and might be printed.

Parameters:
url - the URL identifying the connection to be removed

run

public final void run()
               throws IllegalStateException
Deprecated. This is called by start(), and shouldn't be called directly

Starts running this isolate. This is called by start(), and shouldn't be called directly.

Specified by:
run in interface Runnable
Throws:
IllegalStateException - if this isolate has already been started
See Also:
Thread.run()

save

public void save(DataOutputStream dos,
                 String uri)
          throws IOException
Serializes the object graph rooted by this hibernated isolate and writes it to a given stream. The endianess of the serialized object graph is the endianess of the unerdlying platform.

Parameters:
dos - the DataOutputStream to which the serialized isolate should be written
uri - a URI identifying the serialized isolate
Throws:
OutOfMemoryError - if there was insufficient memory to do the save
IOException - if there was some IO problem while writing the output
IllegalStateException - if this isolate is not currently hibernated or exited

save

public void save(DataOutputStream dos,
                 String uri,
                 boolean bigEndian)
          throws IOException
Serializes the object graph rooted by this hibernated isolate and writes it to a given stream.

Parameters:
dos - the DataOutputStream to which the serialized isolate should be written
uri - a URI identifying the serialized isolate
bigEndian - the endianess to be used when serializing this isolate
Throws:
OutOfMemoryError - if there was insufficient memory to do the save
IOException - if there was some IO problem while writing the output
IllegalStateException - if this isolate is not currently hibernated or exited

setProperty

public void setProperty(String key,
                        String value)
Adds a named property to this isolate. These properties are included in the look up performed by System.getProperty(String).

Parameters:
key - the name of the property
value - the value of the property or null to remove the property

start

public void start()
Start the isolate running.


toString

public String toString()
Get the string representation of the isolate.

Overrides:
toString in class Object
Returns:
the string

unhibernate

public void unhibernate()
Unhibernate the isolate.


SunSPOT API V2.0


Copyright © 2007 Sun Microsystems, Inc. All Rights Reserved.