#include "jmsg.h"
#include "jmsg_host.h"
#include "jxbt_utilities.h"
-
-#include "smx_context_java.h"
+#include "smx_context_java.h"
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
+static jfieldID jprocess_field_Process_bind;
+static jfieldID jprocess_field_Process_name;
static jfieldID jprocess_field_Process_host;
+static jfieldID jprocess_field_Process_id;
static jfieldID jprocess_field_Process_pid;
static jfieldID jprocess_field_Process_ppid;
(*env)->DeleteGlobalRef(env, jprocess);
}
-jboolean jprocess_is_alive(jobject jprocess, JNIEnv * env)
-{
- jmethodID id =
- jxbt_get_smethod(env, "org/simgrid/msg/Process", "isAlive", "()Z");
-
- if (!id)
- return 0;
-
- return (*env)->CallBooleanMethod(env, jprocess, id);
-}
-
void jprocess_join(jobject jprocess, JNIEnv * env)
{
- jmethodID id =
- jxbt_get_smethod(env, "org/simgrid/msg/Process", "join", "()V");
-
- if (!id)
- return;
-
- (*env)->CallVoidMethod(env, jprocess, id);
-}
-
-void jprocess_exit(jobject jprocess, JNIEnv * env)
-{
- jmethodID id =
- jxbt_get_smethod(env, "org/simgrid/msg/Process", "interrupt", "()V");
-
- if (!id)
- return;
-
- (*env)->CallVoidMethod(env, jprocess, id);
-}
-
-void jprocess_yield(jobject jprocess, JNIEnv * env)
-{
- jmethodID id =
- jxbt_get_smethod(env, "org/simgrid/msg/Process", "switchProcess", "()V");
-
- if (!id)
- return;
-
- (*env)->CallVoidMethod(env, jprocess, id);
-}
-
-void jprocess_lock_mutex(jobject jprocess, JNIEnv * env)
-{
- jmethodID id =
- jxbt_get_smethod(env, "org/simgrid/msg/Process", "lockMutex", "()V");
-
- if (!id)
- return;
-
- (*env)->CallVoidMethod(env, jprocess, id);
-}
-
-void jprocess_unlock_mutex(jobject jprocess, JNIEnv * env)
-{
- jmethodID id =
- jxbt_get_smethod(env, "org/simgrid/msg/Process", "unlockMutex", "()V");
-
- if (!id)
- return;
-
- (*env)->CallVoidMethod(env, jprocess, id);
-}
-
-
-void jprocess_signal_cond(jobject jprocess, JNIEnv * env)
-{
- jmethodID id =
- jxbt_get_smethod(env, "org/simgrid/msg/Process", "signalCond", "()V");
-
- if (!id)
- return;
-
- (*env)->CallVoidMethod(env, jprocess, id);
-}
-
-void jprocess_wait_cond(jobject jprocess, JNIEnv * env)
-{
- jmethodID id =
- jxbt_get_smethod(env, "org/simgrid/msg/Process", "waitCond", "()V");
-
- if (!id)
- return;
-
- (*env)->CallVoidMethod(env, jprocess, id);
-}
-
-
-void jprocess_start(jobject jprocess, JNIEnv * env)
-{
- jmethodID id =
- jxbt_get_smethod(env, "org/simgrid/msg/Process", "start", "()V");
-
- if (!id)
- return;
-
- XBT_DEBUG("jprocess_start(jproc=%p,env=%p)", jprocess, env);
- (*env)->CallVoidMethod(env, jprocess, id);
- XBT_DEBUG("jprocess started");
+ m_process_t process = jprocess_to_native_process(jprocess,env);
+ smx_ctx_java_t context = (smx_ctx_java_t)MSG_process_get_smx_ctx(process);
+ xbt_os_thread_join(context->thread,NULL);
}
m_process_t jprocess_to_native_process(jobject jprocess, JNIEnv * env)
{
- jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Process", "bind", "J");
-
- if (!id)
- return NULL;
-
- return (m_process_t) (long) (*env)->GetLongField(env, jprocess, id);
+ return (m_process_t) (long) (*env)->GetLongField(env, jprocess, jprocess_field_Process_bind);
}
void jprocess_bind(jobject jprocess, m_process_t process, JNIEnv * env)
{
- jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Process", "bind", "J");
- if (!id)
- return;
-
- (*env)->SetLongField(env, jprocess, id, (jlong) (long) (process));
+ (*env)->SetLongField(env, jprocess, jprocess_field_Process_bind, (jlong) (long) (process));
}
jlong jprocess_get_id(jobject jprocess, JNIEnv * env)
{
- jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Process", "id", "J");
-
- if (!id)
- return 0;
-
- return (*env)->GetLongField(env, jprocess, id);
+ return (*env)->GetLongField(env, jprocess, jprocess_field_Process_id);
}
jstring jprocess_get_name(jobject jprocess, JNIEnv * env)
{
- jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Process", "name",
- "Ljava/lang/String;");
- jobject jname;
-
- if (!id)
- return NULL;
-
- jname = (jstring) (*env)->GetObjectField(env, jprocess, id);
-
+ jstring jname = (jstring) (*env)->GetObjectField(env, jprocess, jprocess_field_Process_name);
return (*env)->NewGlobalRef(env, jname);
}
return (*env)->GetLongField(env, jprocess, id) ? JNI_TRUE : JNI_FALSE;
}
-
-void jprocess_schedule(smx_context_t context)
-{
- JNIEnv *env;
- jmethodID id;
-
- env = get_current_thread_env();
-
- id = jxbt_get_smethod(env, "org/simgrid/msg/Process", "schedule", "()V");
-
- if (!id) {
- XBT_CRITICAL("Cannot find java method org/simgrid/msg/Process/schedule()V");
- return;
- }
-
- (*env)->CallVoidMethod(env, ((smx_ctx_java_t) context)->jprocess, id);
-}
-
-
-
-void jprocess_unschedule(smx_context_t context)
-{
- JNIEnv *env;
- jmethodID id;
-
- env = get_current_thread_env();
-
-
- id = jxbt_get_smethod(env, "org/simgrid/msg/Process", "unschedule", "()V");
-
- if (!id)
- return;
-
- (*env)->CallVoidMethod(env, ((smx_ctx_java_t) context)->jprocess, id);
-}
JNIEXPORT void JNICALL
Java_org_simgrid_msg_Process_nativeInit(JNIEnv *env, jclass cls) {
jclass jprocess_class_Process = (*env)->FindClass(env, "org/simgrid/msg/Process");
- jprocess_field_Process_pid = jxbt_get_sfield(env, "org/simgrid/msg/Process", "pid", "I");
- jprocess_field_Process_ppid = jxbt_get_sfield(env, "org/simgrid/msg/Process", "ppid", "I");
+ jprocess_field_Process_name = jxbt_get_jfield(env, jprocess_class_Process, "name", "Ljava/lang/String;");
+ jprocess_field_Process_bind = jxbt_get_jfield(env, jprocess_class_Process, "bind", "J");
+ jprocess_field_Process_id = jxbt_get_jfield(env, jprocess_class_Process, "id", "J");
+ jprocess_field_Process_pid = jxbt_get_jfield(env, jprocess_class_Process, "pid", "I");
+ jprocess_field_Process_ppid = jxbt_get_jfield(env, jprocess_class_Process, "ppid", "I");
jprocess_field_Process_host = jxbt_get_jfield(env, jprocess_class_Process, "host", "Lorg/simgrid/msg/Host;");
- if (!jprocess_class_Process || !jprocess_field_Process_pid ||
+ if (!jprocess_class_Process || !jprocess_field_Process_id || !jprocess_field_Process_name || !jprocess_field_Process_pid ||
!jprocess_field_Process_ppid || !jprocess_field_Process_host) {
jxbt_throw_native(env,bprintf("Can't find some fields in Java class. You should report this bug."));
}
0,NULL,NULL);
MSG_process_set_data(process,&process);
+ /* bind the java process instance to the native process */
+ jprocess_bind(jprocess, process, env);
/* release our reference to the process name (variable name becomes invalid) */
//FIXME : This line should be uncommented but with mac it doesn't work. BIG WARNING
//(*env)->ReleaseStringUTFChars(env, jname, name);
(*env)->ReleaseStringUTFChars(env, jhostname, hostname);
- /* bind the java process instance to the native process */
- jprocess_bind(jprocess, process, env);
-
/* sets the PID and the PPID of the process */
(*env)->SetIntField(env, jprocess, jprocess_field_Process_pid,(jint) MSG_process_get_PID(process));
(*env)->SetIntField(env, jprocess, jprocess_field_Process_ppid, (jint) MSG_process_get_PPID(process));
}
JNIEXPORT void JNICALL
-Java_org_simgrid_msg_Process_exit(JNIEnv * env,
+Java_org_simgrid_msg_Process_kill(JNIEnv * env,
jobject jprocess)
{
-
+ /* get the native instances from the java ones */
m_process_t process = jprocess_to_native_process(jprocess, env);
-
- if (!process) {
- jxbt_throw_notbound(env, "process", jprocess);
- return;
- }
-
- smx_ctx_java_stop(MSG_process_get_smx_ctx(process));
-}
-
-JNIEXPORT void JNICALL
-Java_org_simgrid_msg_Process_kill(JNIEnv * env, jclass cls,
- jobject jprocess)
-{
- /* get the native instances from the java ones */
- m_process_t process = jprocess_to_native_process(jprocess, env);
-
if (!process) {
jxbt_throw_notbound(env, "process", jprocess);
return;
}
+ /* Sets the "killed" flag to kill the process on the next unschedule */
+ smx_ctx_java_t context = (smx_ctx_java_t)MSG_process_get_smx_ctx(process);
+ context->killed = 1;
- /* kill the native process (this wrapper is call by the destructor of the java
- * process instance)
- */
- MSG_process_kill(process);
+ MSG_process_kill(process);
}
JNIEXPORT void JNICALL
Java_org_simgrid_msg_Process_migrate(JNIEnv * env,