/* java_thread.h
   Copyright (C) 2005 Free Software Foundation, Inc.

This file is part of Mysaifu JVM

Mysaifu JVM is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

Mysaifu JVM is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
*/

#ifndef JAVA_THREAD_INCLUDED
#define JAVA_THREAD_INCLUDED

#include "ClassFile.h"

/**
 * スレッド開始時のパラメータ
 */
struct thread_start_parameter {
	jobject vmthread_reference;	// VMThreadオブジェクトへの参照
	jobject thread_reference;	// Threadオブジェクトへの参照
	bool daemon;				// Daemonスレッドの場合true
};

/**
 * スレッド関連変数を初期化する
 */
void init_thread_settings(DWORD thread_stack_size);

/**
 * 指定されたメソッドを新しいスレッド内で実行する
 */
DWORD WINAPI thread_start(LPVOID pvarg);

/**
 * 新しいネイティブスレッドを作成する
 */
bool create_native_thread(LPTHREAD_START_ROUTINE thread_start, thread_start_parameter* param);

/**
 * カレントスレッド以外のスレッドをすべてサスペンドする
 */
bool suspend_all_other_threads();

/**
 * カレントスレッド以外のスレッドをすべて再開する
 */
bool resume_all_other_threads();

HANDLE get_terminate_handle();

/**
 * 指定されたスレッドIDに対応する interrupt() 用イベントオブジェクトを返す。
 */
HANDLE get_interrupt_event(DWORD thread_id);

/**
 * 指定されたスレッドIDに対応する割り込みフラグを設定する
 */
void set_interrupted(DWORD thread_id, bool flag);

/**
 * 指定されたスレッドIDに対応する割り込みフラグを返す
 */
bool is_interrupted(jobject vmThread);

/**
 * 指定されたスレッドIDに対応するスレッドに割り込む。
 * 割り込みフラグはtrueに設定される。
 */
void interrupt(jobject vmThread);

/**
 * 指定されたVMThreadオブジェクトのインスタンスに対応する、ネイティブスレッドのスレッドハンドルを返す
 */
HANDLE get_thread_handle(jobject vmthread);

/**
 * カレントスレッドに対応する Thread の参照を返す
 */
jobject current_Thread();

/**
 * 指定されたスレッドIDに対応するjava.lang.Threadオブジェクトを返す
 */
jobject get_thread_object_of(DWORD thread_id);

/**
 * JVMTI_THREAD_STATE_XXX フラグを Thread.State を表す文字列に変換する
 */
const _TCHAR* get_thread_state_from_jvmti_bits(int jvmti_thread_state_bits);

/**
 * グローバル変数にアクセスする際に使用するCRITICAL_SECTION
 */
extern CRITICAL_SECTION g_global_critical_section;

/**
 * グローバルクリティカルセクションに入る際に使用するマクロ
 */
#define LOCK_GLOBAL()     EnterCriticalSection(&g_global_critical_section)
#define UNLOCK_GLOBAL()   LeaveCriticalSection(&g_global_critical_section)

#endif