$ java -cp .:../simgrid.jar basic/BasicTest platform.xml basic/basicDeployment.xml
\endverbatim
+\section bindings_binding_java_coroutines How to use the coroutines context factory
+
+First, remember that the coroutines context factory is still experimental work.
+
+To use the coroutines context factory, you need a Java virtual machine which supports it.
+
+Our implementation rely on a JVM patch made by Lukas Stadler, which you can find <a href="http://ssw.jku.at/General/Staff/LS/coro/">here</a>.
+
+
*/
return env;
}
-void jmsg_throw_status(JNIEnv *env, MSG_error_t status) {
+void jmsg_throw_status(JNIEnv *env, msg_error_t status) {
switch (status) {
case MSG_TIMEOUT:
jxbt_throw_time_out_failure(env,NULL);
JNIEXPORT void JNICALL
JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv * env, jclass cls)
{
- MSG_error_t rv;
+ msg_error_t rv;
int index;
xbt_dynar_t hosts;
jobject jhost;
/* Cleanup java hosts */
hosts = MSG_hosts_as_dynar();
for (index = 0; index < xbt_dynar_length(hosts) - 1; index++) {
- jhost = (jobject) MSG_host_get_data(xbt_dynar_get_as(hosts,index,m_host_t));
+ jhost = (jobject) MSG_host_get_data(xbt_dynar_get_as(hosts,index,msg_host_t));
if (jhost)
jhost_unref(env, jhost);
JNICALL Java_org_simgrid_msg_Msg_clean(JNIEnv * env, jclass cls)
{
/* cleanup native stuff. Calling it is ... useless since leaking memory at the end of the simulation is a non-issue */
- MSG_error_t rv = MSG_OK != MSG_clean();
+ msg_error_t rv = MSG_OK != MSG_clean();
jxbt_check_res("MSG_clean()", rv, MSG_OK,
bprintf
("unexpected error : MSG_clean() failed .. please report this bug "));
xbt_assert((jprocess != NULL), "Process allocation failed.");
jprocess = (*env)->NewGlobalRef(env, jprocess);
//bind the process to the context
- m_process_t process = MSG_process_self();
+ msg_process_t process = MSG_process_self();
smx_ctx_java_t context = (smx_ctx_java_t)MSG_process_get_smx_ctx(process);
context->jprocess = jprocess;
/* sets the PID and the PPID of the process */
jboolean jreceiving = (*env)->GetBooleanField(env, jcomm, jcomm_field_Comm_receiving);
if (jreceiving == JNI_TRUE) {
//bind the task object.
- m_task_t task = MSG_comm_get_task(comm);
+ msg_task_t task = MSG_comm_get_task(comm);
xbt_assert(task != NULL, "Task is NULL");
jobject jtask_global = MSG_task_get_data(task);
//case where the data has already been retrieved
JNIEXPORT void JNICALL
Java_org_simgrid_msg_Comm_destroy(JNIEnv *env, jobject jcomm) {
msg_comm_t comm;
- m_task_t *task_received;
+ msg_task_t *task_received;
- task_received = (m_task_t*) (long) (*env)->GetLongField(env, jcomm, jcomm_field_Comm_taskBind);
+ task_received = (msg_task_t*) (long) (*env)->GetLongField(env, jcomm, jcomm_field_Comm_taskBind);
xbt_free(task_received);
comm = (msg_comm_t) (long) (*env)->GetLongField(env, jcomm, jcomm_field_Comm_bind);
xbt_ex_t e;
TRY {
if (MSG_comm_test(comm)) {
- MSG_error_t status = MSG_comm_get_status(comm);
+ msg_error_t status = MSG_comm_get_status(comm);
if (status == MSG_OK) {
jcomm_bind_task(env,jcomm);
return JNI_TRUE;
return;
}
- MSG_error_t status;
+ msg_error_t status;
xbt_ex_t e;
TRY {
status = MSG_comm_wait(comm,(double)timeout);
(*env)->DeleteGlobalRef(env, jhost);
}
-void jhost_bind(jobject jhost, m_host_t host, JNIEnv * env) {
+void jhost_bind(jobject jhost, msg_host_t host, JNIEnv * env) {
(*env)->SetLongField(env, jhost, jhost_field_Host_bind, (jlong) (long) (host));
}
-m_host_t jhost_get_native(JNIEnv * env, jobject jhost) {
- return (m_host_t) (long) (*env)->GetLongField(env, jhost, jhost_field_Host_bind);
+msg_host_t jhost_get_native(JNIEnv * env, jobject jhost) {
+ return (msg_host_t) (long) (*env)->GetLongField(env, jhost, jhost_field_Host_bind);
}
const char *jhost_get_name(jobject jhost, JNIEnv * env) {
- m_host_t host = jhost_get_native(env, jhost);
+ msg_host_t host = jhost_get_native(env, jhost);
return MSG_host_get_name(host);
}
JNIEXPORT jobject JNICALL
Java_org_simgrid_msg_Host_getByName(JNIEnv * env, jclass cls,
jstring jname) {
- m_host_t host; /* native host */
+ msg_host_t host; /* native host */
jobject jhost; /* global reference to the java host instance returned */
/* get the C string from the java string */
Java_org_simgrid_msg_Host_currentHost(JNIEnv * env, jclass cls) {
jobject jhost;
- m_host_t host = MSG_host_self();
+ msg_host_t host = MSG_host_self();
if (!MSG_host_get_data(host)) {
/* the native host not yet associated with the java host instance */
JNIEXPORT jdouble JNICALL
Java_org_simgrid_msg_Host_getSpeed(JNIEnv * env,
jobject jhost) {
- m_host_t host = jhost_get_native(env, jhost);
+ msg_host_t host = jhost_get_native(env, jhost);
if (!host) {
jxbt_throw_notbound(env, "host", jhost);
}
JNIEXPORT jint JNICALL
Java_org_simgrid_msg_Host_getLoad(JNIEnv * env, jobject jhost) {
- m_host_t host = jhost_get_native(env, jhost);
+ msg_host_t host = jhost_get_native(env, jhost);
if (!host) {
jxbt_throw_notbound(env, "host", jhost);
}
JNIEXPORT jboolean JNICALL
Java_org_simgrid_msg_Host_isAvail(JNIEnv * env, jobject jhost) {
- m_host_t host = jhost_get_native(env, jhost);
+ msg_host_t host = jhost_get_native(env, jhost);
if (!host) {
jxbt_throw_notbound(env, "host", jhost);
jobjectArray jtable;
jobject jhost;
jstring jname;
- m_host_t host;
+ msg_host_t host;
xbt_dynar_t table = MSG_hosts_as_dynar();
int count = xbt_dynar_length(table);
}
for (index = 0; index < count; index++) {
- host = xbt_dynar_get_as(table,index,m_host_t);
+ host = xbt_dynar_get_as(table,index,msg_host_t);
jhost = (jobject) (MSG_host_get_data(host));
if (!jhost) {
* this class is not found the function throws the exception
* NotSuchFieldException.
*/
-void jhost_bind(jobject jhost, m_host_t host, JNIEnv * env);
+void jhost_bind(jobject jhost, msg_host_t host, JNIEnv * env);
/**
* This function returns a native host from a java host instance.
* this class is not found the function throws the exception
* NotSuchFieldException.
*/
-m_host_t jhost_get_native(JNIEnv * env, jobject jhost);
+msg_host_t jhost_get_native(JNIEnv * env, jobject jhost);
/**
* This function returns the name of a MSG host.
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);
+ msg_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)
+jobject native_to_java_process(msg_process_t process)
{
return ((smx_ctx_java_t)MSG_process_get_smx_ctx(process))->jprocess;
}
void jprocess_join(jobject jprocess, JNIEnv * env)
{
- m_process_t process = jprocess_to_native_process(jprocess,env);
+ msg_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)
+msg_process_t jprocess_to_native_process(jobject jprocess, JNIEnv * env)
{
- return (m_process_t) (long) (*env)->GetLongField(env, jprocess, jprocess_field_Process_bind);
+ return (msg_process_t) (long) (*env)->GetLongField(env, jprocess, jprocess_field_Process_bind);
}
-void jprocess_bind(jobject jprocess, m_process_t process, JNIEnv * env)
+void jprocess_bind(jobject jprocess, msg_process_t process, JNIEnv * env)
{
(*env)->SetLongField(env, jprocess, jprocess_field_Process_bind, (jlong)(process));
}
jstring jname; /* the name of the java process instance */
const char *name; /* the C name of the process */
const char *hostname;
- m_process_t process; /* the native process to create */
- m_host_t host; /* Where that process lives */
+ msg_process_t process; /* the native process to create */
+ msg_host_t host; /* Where that process lives */
hostname = (*env)->GetStringUTFChars(env, jhostname, 0);
Java_org_simgrid_msg_Process_fromPID(JNIEnv * env, jclass cls,
jint PID)
{
- m_process_t process = MSG_process_from_PID(PID);
+ msg_process_t process = MSG_process_from_PID(PID);
if (!process) {
jxbt_throw_process_not_found(env, bprintf("PID = %d",(int) PID));
JNIEXPORT jobject JNICALL
Java_org_simgrid_msg_Process_currentProcess(JNIEnv * env, jclass cls)
{
- m_process_t process = MSG_process_self();
+ msg_process_t process = MSG_process_self();
jobject jprocess;
if (!process) {
Java_org_simgrid_msg_Process_suspend(JNIEnv * env,
jobject jprocess)
{
- m_process_t process = jprocess_to_native_process(jprocess, env);
+ msg_process_t process = jprocess_to_native_process(jprocess, env);
if (!process) {
jxbt_throw_notbound(env, "process", jprocess);
}
/* try to suspend the process */
- MSG_error_t rv = MSG_process_suspend(process);
+ msg_error_t rv = MSG_process_suspend(process);
jxbt_check_res("MSG_process_suspend()", rv, MSG_OK,
bprintf("unexpected error , please report this bug"));
Java_org_simgrid_msg_Process_resume(JNIEnv * env,
jobject jprocess)
{
- m_process_t process = jprocess_to_native_process(jprocess, env);
+ msg_process_t process = jprocess_to_native_process(jprocess, env);
if (!process) {
jxbt_throw_notbound(env, "process", jprocess);
}
/* try to resume the process */
- MSG_error_t rv = MSG_process_resume(process);
+ msg_error_t rv = MSG_process_resume(process);
jxbt_check_res("MSG_process_resume()", rv, MSG_OK,
bprintf("unexpected error , please report this bug"));
Java_org_simgrid_msg_Process_isSuspended(JNIEnv * env,
jobject jprocess)
{
- m_process_t process = jprocess_to_native_process(jprocess, env);
+ msg_process_t process = jprocess_to_native_process(jprocess, env);
if (!process) {
jxbt_throw_notbound(env, "process", jprocess);
(JNIEnv *env, jclass cls, jlong jmillis, jint jnanos) {
double time = jmillis / 1000 + jnanos / 1000;
- MSG_error_t rv;
+ msg_error_t rv;
xbt_ex_t e;
TRY {
rv = MSG_process_sleep(time);
Java_org_simgrid_msg_Process_waitFor(JNIEnv * env, jobject jprocess,
jdouble jseconds)
{
- MSG_error_t rv;
+ msg_error_t rv;
xbt_ex_t e;
TRY {
rv = MSG_process_sleep((double)jseconds);
jobject jprocess)
{
/* get the native instances from the java ones */
- m_process_t process = jprocess_to_native_process(jprocess, env);
+ msg_process_t process = jprocess_to_native_process(jprocess, env);
if (!process) {
jxbt_throw_notbound(env, "process", jprocess);
return;
Java_org_simgrid_msg_Process_migrate(JNIEnv * env,
jobject jprocess, jobject jhost)
{
- m_process_t process = jprocess_to_native_process(jprocess, env);
+ msg_process_t process = jprocess_to_native_process(jprocess, env);
if (!process) {
jxbt_throw_notbound(env, "process", jprocess);
return;
}
- m_host_t host = jhost_get_native(env, jhost);
+ msg_host_t host = jhost_get_native(env, jhost);
if (!host) {
jxbt_throw_notbound(env, "host", jhost);
}
/* try to change the host of the process */
- MSG_error_t rv = MSG_process_migrate(process, host);
+ msg_error_t rv = MSG_process_migrate(process, host);
if (rv != MSG_OK) {
jmsg_throw_status(env,rv);
}
}
JNIEXPORT void JNICALL
Java_org_simgrid_msg_Process_setKillTime (JNIEnv *env , jobject jprocess, jdouble jkilltime) {
- m_process_t process = jprocess_to_native_process(jprocess, env);
+ msg_process_t process = jprocess_to_native_process(jprocess, env);
MSG_process_set_kill_time(process, (double)jkilltime);
}
Java_org_simgrid_msg_Process_exit(JNIEnv *env, jobject);
-jobject native_to_java_process(m_process_t process);
+jobject native_to_java_process(msg_process_t process);
/**
* This function returns a global reference to the java process instance
* this class is not found the function throws the exception
* NotSuchFieldException.
*/
-void jprocess_bind(jobject jprocess, m_process_t process, JNIEnv * env);
+void jprocess_bind(jobject jprocess, msg_process_t process, JNIEnv * env);
/**
* This function returns a native process from a java process instance.
* this class is not found the function throws the exception
* NotSuchFieldException.
*/
-m_process_t jprocess_to_native_process(jobject jprocess, JNIEnv * env);
+msg_process_t jprocess_to_native_process(jobject jprocess, JNIEnv * env);
/**
* This function gets the id of the specified java process.
static jfieldID jtask_field_Comm_taskBind;
static jfieldID jtask_field_Comm_receiving;
-void jtask_bind(jobject jtask, m_task_t task, JNIEnv * env)
+void jtask_bind(jobject jtask, msg_task_t task, JNIEnv * env)
{
(*env)->SetLongField(env, jtask, jtask_field_Task_bind, (jlong) (long) (task));
}
-m_task_t jtask_to_native_task(jobject jtask, JNIEnv * env)
+msg_task_t jtask_to_native_task(jobject jtask, JNIEnv * env)
{
- return (m_task_t) (long) (*env)->GetLongField(env, jtask, jtask_field_Task_bind);
+ return (msg_task_t) (long) (*env)->GetLongField(env, jtask, jtask_field_Task_bind);
}
jboolean jtask_is_valid(jobject jtask, JNIEnv * env)
jdouble jcomputeDuration,
jdouble jmessageSize)
{
- m_task_t task; /* the native task to create */
+ msg_task_t task; /* the native task to create */
const char *name = NULL; /* the name of the task */
if (jcomputeDuration < 0) {
jdoubleArray
jmessageSizes_arg) {
- m_task_t task; /* the native parallel task to create */
+ msg_task_t task; /* the native parallel task to create */
const char *name; /* the name of the task */
int host_count;
- m_host_t *hosts;
+ msg_host_t *hosts;
double *computeDurations;
double *messageSizes;
jdouble *jcomputeDurations;
host_count = (int) (*env)->GetArrayLength(env, jhosts);
- hosts = xbt_new0(m_host_t, host_count);
+ hosts = xbt_new0(msg_host_t, host_count);
computeDurations = xbt_new0(double, host_count);
messageSizes = xbt_new0(double, host_count * host_count);
Java_org_simgrid_msg_Task_cancel(JNIEnv * env,
jobject jtask)
{
- m_task_t ptask = jtask_to_native_task(jtask, env);
+ msg_task_t ptask = jtask_to_native_task(jtask, env);
if (!ptask) {
jxbt_throw_notbound(env, "task", jtask);
return;
}
- MSG_error_t rv = MSG_task_cancel(ptask);
+ msg_error_t rv = MSG_task_cancel(ptask);
jxbt_check_res("MSG_task_cancel()", rv, MSG_OK,
bprintf("unexpected error , please report this bug"));
Java_org_simgrid_msg_Task_execute(JNIEnv * env,
jobject jtask)
{
- m_task_t task = jtask_to_native_task(jtask, env);
+ msg_task_t task = jtask_to_native_task(jtask, env);
if (!task) {
jxbt_throw_notbound(env, "task", jtask);
return;
}
xbt_ex_t e;
- MSG_error_t rv;
+ msg_error_t rv;
TRY {
rv = MSG_task_execute(task);
}
JNIEXPORT jstring JNICALL
Java_org_simgrid_msg_Task_getName(JNIEnv * env,
jobject jtask) {
- m_task_t task = jtask_to_native_task(jtask, env);
+ msg_task_t task = jtask_to_native_task(jtask, env);
if (!task) {
jxbt_throw_notbound(env, "task", jtask);
JNIEXPORT jobject JNICALL
Java_org_simgrid_msg_Task_getSender(JNIEnv * env,
jobject jtask) {
- m_process_t process;
+ msg_process_t process;
- m_task_t task = jtask_to_native_task(jtask, env);
+ msg_task_t task = jtask_to_native_task(jtask, env);
if (!task) {
jxbt_throw_notbound(env, "task", jtask);
Java_org_simgrid_msg_Task_getSource(JNIEnv * env,
jobject jtask)
{
- m_host_t host;
- m_task_t task = jtask_to_native_task(jtask, env);
+ msg_host_t host;
+ msg_task_t task = jtask_to_native_task(jtask, env);
if (!task) {
jxbt_throw_notbound(env, "task", jtask);
Java_org_simgrid_msg_Task_getComputeDuration(JNIEnv * env,
jobject jtask)
{
- m_task_t ptask = jtask_to_native_task(jtask, env);
+ msg_task_t ptask = jtask_to_native_task(jtask, env);
if (!ptask) {
jxbt_throw_notbound(env, "task", jtask);
JNIEXPORT jdouble JNICALL
Java_org_simgrid_msg_Task_getRemainingDuration(JNIEnv * env, jobject jtask)
{
- m_task_t ptask = jtask_to_native_task(jtask, env);
+ msg_task_t ptask = jtask_to_native_task(jtask, env);
if (!ptask) {
jxbt_throw_notbound(env, "task", jtask);
}
JNIEXPORT void JNICALL
Java_org_simgrid_msg_Task_setName(JNIEnv *env, jobject jtask, jobject jname) {
- m_task_t task = jtask_to_native_task(jtask, env);
+ msg_task_t task = jtask_to_native_task(jtask, env);
if (!task) {
jxbt_throw_notbound(env, "task", jtask);
Java_org_simgrid_msg_Task_setPriority(JNIEnv * env,
jobject jtask, jdouble priority)
{
- m_task_t task = jtask_to_native_task(jtask, env);
+ msg_task_t task = jtask_to_native_task(jtask, env);
if (!task) {
jxbt_throw_notbound(env, "task", jtask);
JNIEXPORT void JNICALL
Java_org_simgrid_msg_Task_setComputeDuration
(JNIEnv *env, jobject jtask, jdouble computationAmount) {
- m_task_t task = jtask_to_native_task(jtask, env);
+ msg_task_t task = jtask_to_native_task(jtask, env);
if (!task) {
jxbt_throw_notbound(env, "task", jtask);
jstring jalias,
jdouble jtimeout)
{
- MSG_error_t rv;
+ msg_error_t rv;
const char *alias = (*env)->GetStringUTFChars(env, jalias, 0);
- m_task_t task = jtask_to_native_task(jtask, env);
+ msg_task_t task = jtask_to_native_task(jtask, env);
if (!task) {
jstring jalias,
jdouble jmaxRate)
{
- m_task_t task = jtask_to_native_task(jtask, env);
- MSG_error_t rv;
+ msg_task_t task = jtask_to_native_task(jtask, env);
+ msg_error_t rv;
const char *alias;
if (!task) {
jstring jalias, jdouble jtimeout,
jobject jhost)
{
- MSG_error_t rv;
- m_task_t *task = xbt_new(m_task_t,1);
+ msg_error_t rv;
+ msg_task_t *task = xbt_new(msg_task_t,1);
*task = NULL;
- m_host_t host = NULL;
+ msg_host_t host = NULL;
jobject jtask_global, jtask_local;
const char *alias;
const char *mailbox;
jclass comm_class;
//pointer to store the task object pointer.
- m_task_t *task = xbt_new(m_task_t,1);
+ msg_task_t *task = xbt_new(msg_task_t,1);
*task = NULL;
/* There should be a cache here */
comm_class = (*env)->FindClass(env, "org/simgrid/msg/Comm");
const char *mailbox;
- m_task_t task;
+ msg_task_t task;
jobject jcomm;
msg_comm_t comm;
}
static void msg_task_cancel_on_failed_dsend(void*t) {
- m_task_t task = t;
+ msg_task_t task = t;
JNIEnv *env =get_current_thread_env();
jobject jtask_global = MSG_task_get_data(task);
jstring jalias) {
const char *alias = (*env)->GetStringUTFChars(env, jalias, 0);
- m_task_t task = jtask_to_native_task(jtask, env);
+ msg_task_t task = jtask_to_native_task(jtask, env);
if (!task) {
int rv;
const char *alias;
- m_host_t host = jhost_get_native(env, jhost);
+ msg_host_t host = jhost_get_native(env, jhost);
if (!host) {
jxbt_throw_notbound(env, "host", jhost);
* this class is not found the function throws the exception
* NotSuchFieldException.
*/
-void jtask_bind(jobject jtask, m_task_t task, JNIEnv * env);
+void jtask_bind(jobject jtask, msg_task_t task, JNIEnv * env);
/**
* This function returns a native task from a java task instance.
* this class is not found the function throws the exception
* NotSuchFieldException.
*/
-m_task_t jtask_to_native_task(jobject jtask, JNIEnv * env);
+msg_task_t jtask_to_native_task(jobject jtask, JNIEnv * env);
/**
* This function tests if a java task instance is valid.
}
JNIEXPORT void JNICALL
Java_org_simgrid_msg_VM_start(JNIEnv *env, jobject jvm, jobject jhost, jint jcoreamount) {
- m_host_t host = jhost_get_native(env, jhost);
+ msg_host_t host = jhost_get_native(env, jhost);
msg_vm_t vm = MSG_vm_start(host, (int)jcoreamount);
JNIEXPORT void JNICALL
Java_org_simgrid_msg_VM_bind(JNIEnv *env, jobject jvm, jobject jprocess) {
msg_vm_t vm = jvm_get_native(env,jvm);
- m_process_t process = jprocess_to_native_process(jprocess,env);
+ msg_process_t process = jprocess_to_native_process(jprocess,env);
xbt_assert((vm != NULL), "VM object is not binded");
xbt_assert((process != NULL), "Process object is not binded.");
JNIEXPORT void JNICALL
Java_org_simgrid_msg_VM_unbind(JNIEnv *env, jobject jvm, jobject jprocess) {
msg_vm_t vm = jvm_get_native(env,jvm);
- m_process_t process = jprocess_to_native_process(jprocess,env);
+ msg_process_t process = jprocess_to_native_process(jprocess,env);
MSG_vm_unbind(vm,process);
}
JNIEXPORT void JNICALL
Java_org_simgrid_msg_VM_migrate(JNIEnv *env, jobject jvm, jobject jhost) {
msg_vm_t vm = jvm_get_native(env,jvm);
- m_host_t host = jhost_get_native(env, jhost);
+ msg_host_t host = jhost_get_native(env, jhost);
MSG_vm_migrate(vm,host);
}