Android Open Source - anode Isolate






From Project

Back to project page anode.

License

The source code is released under:

Apache License

If you think the Android project anode listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright 2011-2012 Paddy Byers/*from www .  j  a va 2 s .c o m*/
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */

package org.meshpoint.anode;

import java.util.HashSet;
import java.util.Set;

import org.meshpoint.anode.Runtime.IllegalStateException;
import org.meshpoint.anode.Runtime.NodeException;
import org.meshpoint.anode.Runtime.StateListener;
import org.meshpoint.anode.bridge.BridgeNative;

import android.content.Context;
import android.util.Log;

public class Isolate {

  private static String TAG = "anode::Isolate";

  /**************************
   * private state
   **************************/
  
  private final Context ctx;
  private final long handle;
  private int state;
  private int exitval;
  private final RuntimeThread runner;
  private final Set<StateListener> listeners = new HashSet<StateListener>();

  /**************************
   * public API
   **************************/
  
  /**
   * Start the Isolate.
   * This is a non-blocking call.
   * @param argv the command-line arguments to pass to the runtime
   * @throws IllegalStateException if the runtime is already started,
   * or is otherwise in a state that prevents it from starting
   * @throws NodeException if the runtime exited with an error
   */
  public void start(String[] argv) throws IllegalStateException, NodeException {
    synchronized(runner) {
      if(state != Runtime.STATE_CREATED) {
        throw new IllegalStateException(
          "Attempting to start Runtime when not in CREATED state"
        );
      }
      runner.start(argv);
      try{runner.wait();}catch(InterruptedException e){}
      if(state == Runtime.STATE_STOPPED)
        handleExitval();
    }
  }
  
  /**
   * Stop a running Runtime instance.
   * This is a non-blocking call.
   * @throws IllegalStateException if the runtime was not previously started,
   * or is otherwise in a state that prevents it from being stopped
   * @throws NodeException if the runtime exited with an error
   */
  public void stop() throws IllegalStateException, NodeException {
    synchronized(runner) {
      switch(state) {
      case Runtime.STATE_STARTED:
        /* expected case, the instance is running normally */
        setState(Runtime.STATE_STOPPING);
        RuntimeNative.stop(handle, RuntimeNative.SIGKILL);
        try{runner.wait();}catch(InterruptedException e){}
      case Runtime.STATE_STOPPED:
        /* already stopped, throw error if
         * there was one, otherwise silently succeed */
        handleExitval();
        return;
      default:
        throw new IllegalStateException(
          "Attempting to stop Runtime when not in STARTED state"
        );
      }
    }
  }

  /**
   * Get the current runtime state
   * @return
   */
  public int getState() {
    synchronized(runner) {
      return state;
    }
  }

  /**
   * Get the exit code for this isolate if in the stopped state
   * @return
   * @throws IllegalStateException
   */
  public int getExitval() throws IllegalStateException {
    synchronized(runner) {
      if(state == Runtime.STATE_STOPPED)
        return exitval;

      throw new IllegalStateException(
          "Attempting to access exit code when not in STOPPED state"
        );
    }
  }

  /**************************
   * private
   **************************/
  
  Isolate(Context ctx) {
    this.ctx = ctx;
    runner = new RuntimeThread();
    handle = RuntimeNative.create();
    state = Runtime.STATE_CREATED;
  }
  
  private void setState(int state) {
    Log.v(TAG, "stateState: state = " + state);
    synchronized(runner) {
      this.state = state;
      runner.notifyAll();
    }
    synchronized(listeners) {
      for(StateListener listener : listeners) {
        try {
          listener.stateChanged(state);
        } catch(Throwable t) {
          Log.e(TAG, "Unexpected exception calling state listener", t);
        }
      }
    }
  }
  
  /**
   * Listener interface for being notified of state changes
   */
  public void addStateListener(StateListener listener) {
    synchronized(listeners) {
      listeners.add(listener);
    }
  }
  
  public void removeStateListener(StateListener listener) {
    synchronized(listeners) {
      listeners.remove(listener);
    }
  }
  
  private void handleExitval() throws NodeException {
    if(exitval != 0) {
       /* clear exitval because we have consumed that error here */
      exitval = 0;
      throw new NodeException(exitval);
    }
  }

  private class RuntimeThread extends Thread {
    private String[] argv;
    
    public void start(String[] argv) {
      this.argv = argv;
      super.start();
    }

    public void run() {
      try {
        Log.v(TAG, "Isolate.run(): setting context");
        BridgeNative.setContext(ctx);
        Log.v(TAG, "Isolate.run(): set context");
        setState(Runtime.STATE_STARTED);
        exitval = RuntimeNative.start(handle, argv);
        setState(Runtime.STATE_STOPPED);
      } catch(Throwable t) {
        Log.e(TAG, "Isolate.run(): exception", t);
        exitval = 1;
        setState(Runtime.STATE_STOPPED);
      }
    }
  }

}




Java Source Code List

org.meshpoint.anode.AndroidContext.java
org.meshpoint.anode.AnodeActivity.java
org.meshpoint.anode.AnodeReceiver.java
org.meshpoint.anode.AnodeService.java
org.meshpoint.anode.Constants.java
org.meshpoint.anode.Isolate.java
org.meshpoint.anode.RuntimeNative.java
org.meshpoint.anode.Runtime.java
org.meshpoint.anode.bridge.BridgeNative.java
org.meshpoint.anode.bridge.Env.java
org.meshpoint.anode.bridge.Env.java
org.meshpoint.anode.bridge.FinalizeQueue.java
org.meshpoint.anode.bridge.ModuleClassLoader.java
org.meshpoint.anode.bridge.ModuleContext.java
org.meshpoint.anode.bridge.SynchronousOperation.java
org.meshpoint.anode.error.GeneralError.java
org.meshpoint.anode.error.InternalError.java
org.meshpoint.anode.error.ReferenceError.java
org.meshpoint.anode.error.ScriptError.java
org.meshpoint.anode.error.TypeError.java
org.meshpoint.anode.idl.BoundInterface.java
org.meshpoint.anode.idl.Callback.java
org.meshpoint.anode.idl.Dictionary.java
org.meshpoint.anode.idl.Dictionary.java
org.meshpoint.anode.idl.IDLInterface.java
org.meshpoint.anode.idl.IDLInterface.java
org.meshpoint.anode.idl.InterfaceManager.java
org.meshpoint.anode.idl.InterfaceManager.java
org.meshpoint.anode.idl.StubUtil.java
org.meshpoint.anode.idl.Types.java
org.meshpoint.anode.java.Array.java
org.meshpoint.anode.java.Base.java
org.meshpoint.anode.java.Base.java
org.meshpoint.anode.java.ByteArray.java
org.meshpoint.anode.java.DoubleArray.java
org.meshpoint.anode.java.IntegerArray.java
org.meshpoint.anode.java.LongArray.java
org.meshpoint.anode.java.ObjectArray.java
org.meshpoint.anode.js.JSArray.java
org.meshpoint.anode.js.JSByteArray.java
org.meshpoint.anode.js.JSDoubleArray.java
org.meshpoint.anode.js.JSFunction.java
org.meshpoint.anode.js.JSIntegerArray.java
org.meshpoint.anode.js.JSInterface.java
org.meshpoint.anode.js.JSLongArray.java
org.meshpoint.anode.js.JSObjectArray.java
org.meshpoint.anode.js.JSObject.java
org.meshpoint.anode.js.JSValue.java
org.meshpoint.anode.module.IModuleContext.java
org.meshpoint.anode.module.IModuleContext.java
org.meshpoint.anode.module.IModule.java
org.meshpoint.anode.module.IModule.java
org.meshpoint.anode.stub.DictionaryStubGenerator.java
org.meshpoint.anode.stub.PlatformStubGenerator.java
org.meshpoint.anode.stub.StubGenerator.java
org.meshpoint.anode.stub.UserStubGenerator.java
org.meshpoint.anode.stub.util.DirectoryClassLoader.java
org.meshpoint.anode.stub.util.StubGen.java
org.meshpoint.anode.type.ICollection.java
org.meshpoint.anode.type.IFunction.java
org.meshpoint.anode.type.IIndexedCollection.java
org.meshpoint.anode.util.AndroidLog.java
org.meshpoint.anode.util.ArgProcessor.java
org.meshpoint.anode.util.Log.java
org.meshpoint.anode.util.ModuleUtils.java
org.meshpoint.anode.util.PrintStreamLog.java
org.meshpoint.anode.util.TarExtractor.java
org.meshpoint.anode.util.ZipExtractor.java
org.w3c.dom.Array.java
org.w3c.dom.Array.java
org.w3c.dom.ByteArray.java
org.w3c.dom.ByteArray.java
org.w3c.dom.DoubleArray.java
org.w3c.dom.DoubleArray.java
org.w3c.dom.IntegerArray.java
org.w3c.dom.IntegerArray.java
org.w3c.dom.LongArray.java
org.w3c.dom.LongArray.java
org.w3c.dom.ObjectArray.java
org.w3c.dom.ObjectArray.java
org.w3c.dom.PrimitiveArray.java
org.w3c.dom.PrimitiveArray.java