From 0b7177aaa933483692b39ba8ed330f531f204fac Mon Sep 17 00:00:00 2001 From: Samuel Lepetit Date: Mon, 11 Jun 2012 23:29:19 +0200 Subject: [PATCH] Add EXPERIMENTAL Coroutines support --- CMakeLists.txt | 2 ++ org/simgrid/msg/Process.java | 3 ++- org/simgrid/msg/RngStream.java | 2 +- src/jmsg.c | 15 +++++++++++++-- src/jmsg_process.c | 13 +++++++++++++ src/jmsg_process.h | 4 ++++ src/jmsg_task.c | 14 +++++++++----- src/smx_context_java.h | 2 +- 8 files changed, 45 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 94aef31dd7..4865ed3932 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,6 +72,8 @@ include(FindJavaSG.cmake) # Declare our package content # ############################### set(JMSG_C_SRC + src/smx_context_cojava.h + src/smx_context_cojava.c src/smx_context_java.h src/smx_context_java.c src/jxbt_utilities.c diff --git a/org/simgrid/msg/Process.java b/org/simgrid/msg/Process.java index 82e6c4fe16..f8c1061244 100644 --- a/org/simgrid/msg/Process.java +++ b/org/simgrid/msg/Process.java @@ -371,6 +371,7 @@ public abstract class Process implements Runnable { catch(ProcessKilledError pk) { } + exit(); } /** @@ -381,7 +382,7 @@ public abstract class Process implements Runnable { */ public abstract void main(String[]args) throws MsgException; - + public native void exit(); /** * Class initializer, to initialize various JNI stuff */ diff --git a/org/simgrid/msg/RngStream.java b/org/simgrid/msg/RngStream.java index b1b0c9d2e4..5f4a8bf3b0 100644 --- a/org/simgrid/msg/RngStream.java +++ b/org/simgrid/msg/RngStream.java @@ -76,7 +76,7 @@ public class RngStream { */ public native void resetNextSubstream(); /** - * If a = true the stream g will start generating antithetic variates, i.e., 1 − U instead of U , until + * If a = true the stream g will start generating antithetic variates, i.e., 1 - U instead of U , until * this method is called again with a = false. */ public native void setAntithetic(boolean a); diff --git a/src/jmsg.c b/src/jmsg.c index aaf5b10819..92d5d979ca 100644 --- a/src/jmsg.c +++ b/src/jmsg.c @@ -12,6 +12,7 @@ #include #include "smx_context_java.h" +#include "smx_context_cojava.h" #include "jmsg_process.h" @@ -87,7 +88,18 @@ Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs) (*env)->GetJavaVM(env, &__java_vm); - smx_factory_initializer_to_use = SIMIX_ctx_java_factory_init; + if ((*env)->FindClass(env, "java/dyn/Coroutine")) { + XBT_VERB("Using Coroutines"); + smx_factory_initializer_to_use = SIMIX_ctx_cojava_factory_init; + } + else { + XBT_VERB("Using java threads"); + smx_factory_initializer_to_use = SIMIX_ctx_java_factory_init; + } + jthrowable exc = (*env)->ExceptionOccurred(env); + if (exc) { + (*env)->ExceptionClear(env); + } setlocale(LC_NUMERIC,"C"); @@ -231,7 +243,6 @@ static int create_jprocess(int argc, char *argv[]) { /* 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)); - jprocess_bind(jprocess, process, env); return 0; diff --git a/src/jmsg_process.c b/src/jmsg_process.c index 6b2284dfdc..1fa964ce93 100644 --- a/src/jmsg_process.c +++ b/src/jmsg_process.c @@ -11,9 +11,19 @@ #include "jmsg_host.h" #include "jxbt_utilities.h" #include "smx_context_java.h" +#include "smx_context_cojava.h" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg); +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Process_exit(JNIEnv *env, jobject jprocess) { + if (smx_factory_initializer_to_use == SIMIX_ctx_cojava_factory_init) { + m_process_t process = jprocess_to_native_process(jprocess, env); + smx_context_t context = MSG_process_get_smx_ctx(process); + smx_ctx_cojava_stop(context); + } +} + jobject native_to_java_process(m_process_t process) { return ((smx_ctx_java_t)MSG_process_get_smx_ctx(process))->jprocess; @@ -325,3 +335,6 @@ Java_org_simgrid_msg_Process_migrate(JNIEnv * env, /* change the host java side */ (*env)->SetObjectField(env, jprocess, jprocess_field_Process_host, jhost); } + + + diff --git a/src/jmsg_process.h b/src/jmsg_process.h index a97c0ddd40..3b87be65eb 100644 --- a/src/jmsg_process.h +++ b/src/jmsg_process.h @@ -22,6 +22,9 @@ jfieldID jprocess_field_Process_name; jfieldID jprocess_field_Process_pid; jfieldID jprocess_field_Process_ppid; +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Process_exit(JNIEnv *env, jobject); + jobject native_to_java_process(m_process_t process); @@ -229,4 +232,5 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_kill */ JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_migrate (JNIEnv *, jobject, jobject); + #endif /* !MSG_JPROCESS_H */ diff --git a/src/jmsg_task.c b/src/jmsg_task.c index 9eb973c9f6..b7584644b4 100644 --- a/src/jmsg_task.c +++ b/src/jmsg_task.c @@ -56,7 +56,7 @@ Java_org_simgrid_msg_Task_nativeInit(JNIEnv *env, jclass cls) { if (!jtask_field_Task_bind || !jtask_class_Task || !jtask_field_Comm_bind || !jtask_field_Comm_taskBind || !jtask_field_Comm_receiving || !jtask_method_Comm_constructor) { jxbt_throw_native(env,bprintf("Can't find some fields in Java class.")); - } + } } JNIEXPORT void JNICALL @@ -410,7 +410,9 @@ Java_org_simgrid_msg_Task_receive(JNIEnv * env, jclass cls, jobject jhost) { MSG_error_t rv; - m_task_t task = NULL; + m_task_t *task = xbt_new(m_task_t,1); + *task = NULL; + m_host_t host = NULL; jobject jtask_global, jtask_local; const char *alias; @@ -426,7 +428,7 @@ Java_org_simgrid_msg_Task_receive(JNIEnv * env, jclass cls, alias = (*env)->GetStringUTFChars(env, jalias, 0); TRY { - rv = MSG_task_receive_ext(&task, alias, (double) jtimeout, host); + rv = MSG_task_receive_ext(task, alias, (double) jtimeout, host); } CATCH_ANONYMOUS { return NULL; @@ -435,15 +437,17 @@ Java_org_simgrid_msg_Task_receive(JNIEnv * env, jclass cls, jmsg_throw_status(env,rv); return NULL; } - jtask_global = MSG_task_get_data(task); + jtask_global = MSG_task_get_data(*task); /* Convert the global ref into a local ref so that the JVM can free the stuff */ jtask_local = (*env)->NewLocalRef(env, jtask_global); (*env)->DeleteGlobalRef(env, jtask_global); - MSG_task_set_data(task, NULL); + MSG_task_set_data(*task, NULL); (*env)->ReleaseStringUTFChars(env, jalias, alias); + xbt_free(task); + jxbt_check_res("MSG_task_receive_ext()", rv, MSG_HOST_FAILURE | MSG_TRANSFER_FAILURE | MSG_TIMEOUT, bprintf("while receiving from mailbox %s", alias)); diff --git a/src/smx_context_java.h b/src/smx_context_java.h index 4142bf120c..084c5d4ade 100644 --- a/src/smx_context_java.h +++ b/src/smx_context_java.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010. The SimGrid Team. +/* Copyright (c) 2009, 2010, 2012. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it -- 2.20.1