/* monitor.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 MONITOR_H_INCLUDED
#define	MONITOR_H_INCLUDED

#include "types.h"

#define	MONITOR_WAIT_NOT_A_OWNER	0
#define	MONITOR_WAIT_NOTIFIED		1
#define	MONITOR_WAIT_TIMEOUT		2
#define	MONITOR_WAIT_INTERRUPTED	3

/**
 * モニタ処理の設定を初期化する
 * モニタ関連の処理を行う前に、必ず1回呼び出しておく必要がある。
 *
 */
void init_monitor_settings();

/**
 * オブジェクトのモニタを取得する
 *
 * @param	objref	取得対象となるオブジェクトの参照
 */
bool monitor_enter(jobject objref);

/**
 * オブジェクトモニタを解放する
 *
 * @param	objref	解放対象となるオブジェクトの参照
 * @return	呼び出したスレッドがモニタを獲得していなかった場合false。
 *			正常に解放できた場合true
 */
bool monitor_exit(jobject objref);

/**
 * Object.wait()に相当する処理を行う。
 *
 * @param	objref	モニタ取得済みのオブジェクトへの参照
 * @param	timeout	タイムアウト値。０を指定した場合にはタイムアウトしない。
 * @return	このメソッドからリターンした理由。
 *			0 - このメソッドを呼び出したスレッドがモニタを取得していない。
 *			1 - notify()/notifyAll()が呼び出され、このスレッドが実行可能状態になった
 *			2 - タイムアウトした
 *			3 - 他のスレッドによって割り込まれた
 */
int monitor_wait(jobject objref, unsigned int timeout);

/**
 * Object.notify()に相当する処理を行う。
 *
 * @param	objref	モニタ取得済みのオブジェクトへの参照
 * @param	all		wait()状態の全スレッドに通知する場合はtrueを指定する。
 * @return	正常に処理が完了した場合true。
 *			この関数を呼び出したスレッドがモニタを取得していない場合はfalse。
 */
bool monitor_notify(jobject objref, bool all);

/**
 * 指定されたオブジェクトに関連付けられたモニタを破棄する
 * ガベージコレクタは、オブジェクトを解放したあとにこのメソッドを呼び出し、
 * モニタ関連のメモリを解放する
 *
 * @param	objref	解放するオブジェクト
 */
void delete_monitor(jobject objref);

/**
 * 現在のスレッドが指定されたオブジェクトのモニタを保有しているかを返す
 */
bool is_monitor_owner(jobject objref);

typedef struct monitor_t monitor;

/**
 * 指定されたオブジェクトのモニタを所有しているスレッドを表す
 * java.lang.Threadのインスタンスを返す
 *
 * @param obj
 * @return  該当オブジェクトのモニタを所有しているスレッド。該当モニタが使用されていない場合NULL
 */
jobject get_monitor_owner_thread(jobject obj);


#endif
