$B<B9T>uBV$NHsF14|0\Aw$KBP1~$7$?<B9T;~%3%s%Q%$%i(B
$B%M%$%F%#%V%3!<%I$N<B9T$r5v$90[5!<o4VHsF14|<B9T>uBV0\AwJ}<0(B

- to be considered
  - suspend() $B$K$F!"(Bcompiled code $BMQ$N(B suspend $B=hM}$r$9$k$+$7$J$$$+$r(B
    $B7h$a$kJ}K!!#(B
    - $B6a$$$&$A$K(B opc_suspend_check $B$,<B9T$5$l$k8+9~$_$,$"$l$P!"(B
      opc_suspend_check $B8~$1$N=hM}$r9T$&!#(B-> migration safe $B$J(B suspend
    - migration safe $B$J(B suspend $B$J$k$Y$/9T$$$?$$!#(B
  - suspend $B$,(B migration safe $B$@$C$?$+$I$&$+$rCN$kJ}K!!#(B
  - 

- $B<B9T>uBV$NJQ49(B: JVM <-> JIT
  - $BB>$N%9%l%C%I$K$d$i$;$?J}$,$h$$$+!#(B
  - externalize $B$@$1$G$J$/!"(Binternalize $B$b9M$($kI,MW$,$"$k!#(B
    JVM -> JIT $B$NJQ49!#(B
  - $B%9%?%C%/$N%3%T!<$N$?$a$K!"7?>pJs$,MW$k!#(B64bit $B$+(B 32bit $B$+!#(B
    reference $B$+B(CM$+!"$rCN$kI,MW$,$"$k$N$O0\Aw%7%9%F%`(B(MOBA) $B$N$_!#(B

- suspend $BJ}K!!#(B
  - MobaThread#suspend(), resume() $B$rMQ0U$9$k!#(B
  - Thread#suspend(), resume() $B$r$9$2$+$($k!#(B
    private native void suspend0();
    private native void resume0();

- $B<B9T>uBV$NJQ49(B (JVM <-> JIT) $B$r9T$&%?%$%_%s%0!#(B
  - suspend $B$5$l$?;~E@!#(B
    $B!_(B $BL5BL$KJQ49$r$7$F$7$^$&!#$7$+$7!"$?$$$7$?%*!<%P%X%C%I$G$O$J$$!)(B
  - JVMDI $B7PM3$N%"%/%;%9$r%U%C%/$9$k!#(B
    $B!_(B JDK 1.2 $B$G$N$_F0:n!#(B
    $B!_(B $B%U%C%/$J$s$F2DG=$+!)(B

- JVM $B%G%U%)%k%H$N(B suspend, resume $BJ}K!(B
  JVM_SuspendThread  (jvm.c)
  threadSuspend  (threads.c)
  #define sysThreadSuspend(a)
	hpi_thread_interface->ThreadSuspend(a)  (sys_api.h)
  hpi_thread_interface->ThreadSuspend = sysThreadSuspend  (share/hpi/src/hpi.c)
  sysThreadSuspend
    (solaris/hpi/{native,green}_threads/src/threads_md.c)
  - native_threads $B$N>l9g(B
    np_suspend();
      np: Non-posix $B$NN,!#(B
    thr_suspend  (threads_solaris.c)
  - green_threads $B$N>l9g(B
    queueRemove(&runnable_queue, tid);
      runnable $B%-%e!<$+$i30$9!#(B

- suspend $B;~!"9MN8$9$Y$-;v9`(B
  - $B<+%9%l%C%I$+$=$&$G$J$$$+!#(B
  - JIT compiled code $B$+%$%s%?%W%j%?$+!#(B

- suspend, resume $B$NJ}<0(B
  - $B%9%l%C%I$4$H$KI,MW$J(B storage
    - $B%U%i%0(B x 1
      suspendReq
    - $B%b%K%?(B x 1
      suspendCond
  - $B2]Bj(B
    - Thread#interrupt $B$KBP1~(B

boolean suspendReq;	// suspend $B$,MW5a$5$l$F$$$k!#(B
#if 0
boolean jitSuspend;	// JIT compiled code $B<B9TCf$K(B suspend $B$7$F$$$k!#(B
#endif
Object suspendCond;

MobaThread#suspend() {
	// $BJ#?t$N%9%l%C%I$+$i8F$P$l$k$3$H$r9MN8!#MWGSB>=hM}!#(B
  $BDL>o$N(B suspend();
  if (JIT compiled method $B<B9TCf(B) {
	// todo: $B$3$N8e!"(Bopc_suspend_check $B$,L5$+$C$?$i!D(B
    suspendReq = true;
    synchronized (suspendCond) {
      $BDL>o$N(B resume();

      boolean suspend_done = false;
      while (!suspend_done) {
        try {
          suspendCond.wait();
		// $BK\Ev$K(B suspend $B$9$k$^$G(B caller $B$OBT$D!#(B
          suspend_done = true;
        } catch (InterruptedException e) {}
      }
    }
  }
}

opc_suspend_check:
  if (current_thread.suspendReq) {
    $B%$%s%?%W%j%?$N<B9T>uBV$r:n@.(B;
    current_thread.suspendReq = false;
    synchronized (suspendCond) {	// suspender $B$,(B wait() $B$9$k$^$GBT$D!#(B
      current_thread.suspendCond.notifyAll();
    }

    synchronized (resumeCond) {
#if 1
      $BDL>o$N(B suspend;
#else
      jitSuspend = true;

      boolean resume_done = false;
      while (!resume_done) {
        try {
          resumeCond.wait();
          resume_done = true;
        } catch (InterruptedException e) {}
      }
    }
#endif
    $B%$%s%?%W%j%?$N<B9T>uBV$r%/%j%"(B;
  }

MobaThread#resume() {
#if 1
  $BDL>o$N(B resume;
#else
  if (jitSuspend) {
    synchronized (resumeCond) {
      resumeCond.notify();
	// resumeCond.wait() $B$7$F$$$k$N$O(B resume $B$5$l$F$$$k%9%l%C%I$N$_$J$N$G(B
	// notifyAll() $B$G$O$J$$!#(B
    }
  }
#endif
}
