jdk/src/solaris/bin/java_md.c
/*
* Block current thread and continue execution in a new thread
*/
int
ContinueInNewThread0(int (JNICALL *continuation)(void *), jlong stack_size, void * args) {
{- -------------------------------------------
(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.