/* 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, LPVOID 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(DWORD thread_id);

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

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

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

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

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

#endif