Top


定義場所(file name)

jdk/src/solaris/bin/java_md.c

説明(description)

/*
 * Block current thread and continue execution in a new thread
 */

名前(function name)

int
ContinueInNewThread0(int (JNICALL *continuation)(void *), jlong stack_size, void * args) {

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

        int rslt;

  {- -------------------------------------------
  (1) Linux の場合は, 
      (引数の stack_size が有効な値であれば, それを指定した後) 
      pthread_create() で子スレッドを作り, 
      自分は pthread_join() で作ったスレッドの終了を待つ.

      (なお, 子スレッドのエントリポイントは continuation 引数で指定される)

      (なお, pthread_create() が失敗した場合には, 自分で残りの処理を実行する模様.
       といっても, JNI_CreateJavaVM() 内でもスレッドは作るので, そこで失敗してしまうだろうが...)
      ---------------------------------------- -}

    #ifdef __linux__
        pthread_t tid;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

        if (stack_size > 0) {
          pthread_attr_setstacksize(&attr, stack_size);
        }

        if (pthread_create(&tid, &attr, (void *(*)(void*))continuation, (void*)args) == 0) {
          void * tmp;
          pthread_join(tid, &tmp);
          rslt = (int)tmp;
        } else {
         /*
          * Continue execution in current thread if for some reason (e.g. out of
          * memory/LWP)  a new thread can't be created. This will likely fail
          * later in continuation as JNI_CreateJavaVM needs to create quite a
          * few new threads, anyway, just give it a try..
          */
          rslt = continuation(args);
        }

        pthread_attr_destroy(&attr);

  {- -------------------------------------------
  (1) Solaris の場合は, 
      thr_create() で子スレッドを作り, 
      自分は thr_join() で作ったスレッドの終了を待つ.

      (なお, 子スレッドのエントリポイントは continuation 引数で指定される)

      (なお Linux 版と同様, thr_create() が失敗した場合には自分で残りの処理を実行する)
      ---------------------------------------- -}

    #else
        thread_t tid;
        long flags = 0;
        if (thr_create(NULL, stack_size, (void *(*)(void *))continuation, args, flags, &tid) == 0) {
          void * tmp;
          thr_join(tid, NULL, &tmp);
          rslt = (int)tmp;
        } else {
          /* See above. Continue in current thread if thr_create() failed */
          rslt = continuation(args);
        }
    #endif

  {- -------------------------------------------
  (1) 結果をリターン
      ---------------------------------------- -}

        return rslt;
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.