X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/fc783dc02e4e1bf955b152713d1df4914ae3adb8..cbd4ed8aa6a505dd60197657144688207a8679ad:/src/jmsg.c diff --git a/src/jmsg.c b/src/jmsg.c index 57367ff560..0c1bbc2fd0 100644 --- a/src/jmsg.c +++ b/src/jmsg.c @@ -6,10 +6,11 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "msg/msg.h" -#include "msg/private.h" -#include "simix/private.h" -#include "simix/smx_context_java.h" +#include +#include +#include + +#include "smx_context_java.h" #include "jmsg_process.h" #include "jmsg_host.h" @@ -18,8 +19,15 @@ #include "jxbt_utilities.h" #include "jmsg.h" -#include "msg/mailbox.h" -#include "surf/surfxml_parse.h" + +/* Shut up some errors in eclipse online compiler. I wish such a pimple wouldn't be needed */ +#ifndef JNIEXPORT +#define JNIEXPORT +#endif +#ifndef JNICALL +#define JNICALL +#endif +/* end of eclipse-mandated pimple */ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg); @@ -43,8 +51,7 @@ JNIEnv *get_current_thread_env(void) static jobject native_to_java_process(m_process_t process) { - return ((smx_ctx_java_t) - (process->simdata->s_process->context))->jprocess; + return ((smx_ctx_java_t)MSG_process_get_smx_ctx(process))->jprocess; } /* @@ -52,102 +59,71 @@ static jobject native_to_java_process(m_process_t process) */ JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_processCreate(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_processCreate(JNIEnv * env, jclass cls, jobject jprocess_arg, jobject jhost) { + + jobject jprocess; /* the global reference to the java process instance */ jstring jname; /* the name of the java process instance */ const char *name; /* the C name of the process */ m_process_t process; /* the native process to create */ - char alias[MAX_ALIAS_NAME + 1] = { 0 }; - msg_mailbox_t mailbox; - - DEBUG4 - ("Java_simgrid_msg_MsgNative_processCreate(env=%p,cls=%p,jproc=%p,jhost=%p)", - env, cls, jprocess_arg, jhost); + m_host_t host; /* Where that process lives */ + + XBT_DEBUG("Java_org_simgrid_msg_MsgNative_processCreate(env=%p,cls=%p,jproc=%p,jhost=%p)", + env, cls, jprocess_arg, jhost); + + /* get the name of the java process */ jname = jprocess_get_name(jprocess_arg, env); - if (!jname) { jxbt_throw_null(env, - xbt_strdup - ("Internal error: Process name cannot be NULL")); + xbt_strdup("Internal error: Process name cannot be NULL")); return; } - /* allocate the data of the simulation */ - process = xbt_new0(s_m_process_t, 1); - process->simdata = xbt_new0(s_simdata_process_t, 1); + /* bind/retrieve the msg host */ + host = jhost_get_native(env, jhost); + + if (!(host)) { /* not binded */ + jxbt_throw_notbound(env, "host", jhost); + return; + } /* create a global java process instance */ jprocess = jprocess_new_global_ref(jprocess_arg, env); - if (!jprocess) { - free(process->simdata); - free(process); jxbt_throw_jni(env, "Can't get a global ref to the java process"); return; } - /* bind the java process instance to the native process */ - jprocess_bind(jprocess, process, env); - /* build the C name of the process */ name = (*env)->GetStringUTFChars(env, jname, 0); - process->name = xbt_strdup(name); - (*env)->ReleaseStringUTFChars(env, jname, name); - - process->simdata->m_host = jhost_get_native(env, jhost); - - - if (!(process->simdata->m_host)) { /* not binded */ - free(process->simdata); - free(process->data); - free(process); - jxbt_throw_notbound(env, "host", jhost); - return; - } - process->simdata->PID = msg_global->PID++; - - /* create a new context */ - DEBUG8 - ("fill in process %s/%s (pid=%d) %p (sd=%p, host=%p, host->sd=%p); env=%p", - process->name, process->simdata->m_host->name, - process->simdata->PID, process, process->simdata, - process->simdata->m_host, process->simdata->m_host->simdata, env); - - process->simdata->s_process = - SIMIX_process_create(process->name, (xbt_main_func_t) jprocess, - /*data */ (void *) process, - process->simdata->m_host->simdata-> - smx_host->name, 0, NULL, NULL); - - DEBUG1("context created (s_process=%p)", process->simdata->s_process); - - - if (SIMIX_process_self()) { /* someone created me */ - process->simdata->PPID = - MSG_process_get_PID(SIMIX_process_self()->data); - } else { - process->simdata->PPID = -1; - } - - process->simdata->last_errno = MSG_OK; - - /* add the process to the list of the processes of the simulation */ - xbt_fifo_unshift(msg_global->process_list, process); - - sprintf(alias, "%s:%s", - (process->simdata->m_host->simdata->smx_host)->name, - process->name); - - mailbox = MSG_mailbox_new(alias); + name = xbt_strdup(name); + + /* Actually build the MSG process */ + process = MSG_process_create_with_environment(name, + (xbt_main_func_t) jprocess, + /*data*/ NULL, + host, + /*kill_time*/0., + /*argc, argv, properties*/ + 0,NULL,NULL); + + MSG_process_set_data(process,&process); + + /* 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); + + /* bind the java process instance to the native process */ + jprocess_bind(jprocess, process, env); } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_processSuspend(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_processSuspend(JNIEnv * env, jclass cls, jobject jprocess) { m_process_t process = jprocess_to_native_process(jprocess, env); @@ -166,7 +142,23 @@ Java_simgrid_msg_MsgNative_processSuspend(JNIEnv * env, jclass cls, } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_processResume(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_Process_simulatedSleep(JNIEnv * env, jobject jprocess, + jdouble jseconds) { + m_process_t process = jprocess_to_native_process(jprocess, env); + + if (!process) { + jxbt_throw_notbound(env, "process", jprocess); + return; + } + MSG_error_t rv = MSG_process_sleep((double)jseconds); + + jxbt_check_res("MSG_process_sleep()", rv, MSG_OK, + bprintf("unexpected error , please report this bug")); +} + + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_MsgNative_processResume(JNIEnv * env, jclass cls, jobject jprocess) { m_process_t process = jprocess_to_native_process(jprocess, env); @@ -184,7 +176,7 @@ Java_simgrid_msg_MsgNative_processResume(JNIEnv * env, jclass cls, } JNIEXPORT jboolean JNICALL -Java_simgrid_msg_MsgNative_processIsSuspended(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_processIsSuspended(JNIEnv * env, jclass cls, jobject jprocess) { m_process_t process = jprocess_to_native_process(jprocess, env); @@ -199,7 +191,7 @@ Java_simgrid_msg_MsgNative_processIsSuspended(JNIEnv * env, jclass cls, } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_processKill(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_processKill(JNIEnv * env, jclass cls, jobject jprocess) { /* get the native instances from the java ones */ @@ -210,9 +202,6 @@ Java_simgrid_msg_MsgNative_processKill(JNIEnv * env, jclass cls, return; } - /* delete the global reference */ - jprocess_delete_global_ref(native_to_java_process(process), env); - /* kill the native process (this wrapper is call by the destructor of the java * process instance) */ @@ -220,7 +209,7 @@ Java_simgrid_msg_MsgNative_processKill(JNIEnv * env, jclass cls, } JNIEXPORT jobject JNICALL -Java_simgrid_msg_MsgNative_processGetHost(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_processGetHost(JNIEnv * env, jclass cls, jobject jprocess) { /* get the native instances from the java ones */ @@ -245,7 +234,7 @@ Java_simgrid_msg_MsgNative_processGetHost(JNIEnv * env, jclass cls, } JNIEXPORT jobject JNICALL -Java_simgrid_msg_MsgNative_processFromPID(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_processFromPID(JNIEnv * env, jclass cls, jint PID) { m_process_t process = MSG_process_from_PID(PID); @@ -265,7 +254,7 @@ Java_simgrid_msg_MsgNative_processFromPID(JNIEnv * env, jclass cls, JNIEXPORT jint JNICALL -Java_simgrid_msg_MsgNative_processGetPID(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_processGetPID(JNIEnv * env, jclass cls, jobject jprocess) { m_process_t process = jprocess_to_native_process(jprocess, env); @@ -280,7 +269,7 @@ Java_simgrid_msg_MsgNative_processGetPID(JNIEnv * env, jclass cls, JNIEXPORT jint JNICALL -Java_simgrid_msg_MsgNative_processGetPPID(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_processGetPPID(JNIEnv * env, jclass cls, jobject jprocess) { m_process_t process = jprocess_to_native_process(jprocess, env); @@ -294,7 +283,7 @@ Java_simgrid_msg_MsgNative_processGetPPID(JNIEnv * env, jclass cls, } JNIEXPORT jobject JNICALL -Java_simgrid_msg_MsgNative_processSelf(JNIEnv * env, jclass cls) +Java_org_simgrid_msg_MsgNative_processSelf(JNIEnv * env, jclass cls) { m_process_t process = MSG_process_self(); jobject jprocess; @@ -313,9 +302,16 @@ Java_simgrid_msg_MsgNative_processSelf(JNIEnv * env, jclass cls) } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_processChangeHost(JNIEnv * env, jclass cls, - jobject jhost) +Java_org_simgrid_msg_MsgNative_processMigrate(JNIEnv * env, jclass cls, + jobject jprocess, jobject jhost) { + m_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); if (!host) { @@ -324,15 +320,14 @@ Java_simgrid_msg_MsgNative_processChangeHost(JNIEnv * env, jclass cls, } /* try to change the host of the process */ - MSG_error_t rv = MSG_process_change_host(host); - - jxbt_check_res("MSG_process_change_host()", rv, MSG_OK, + MSG_error_t rv = MSG_process_migrate(process, host); + jxbt_check_res("MSG_process_migrate()", rv, MSG_OK, bprintf("unexpected error , please report this bug")); } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_processWaitFor(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_processWaitFor(JNIEnv * env, jclass cls, jdouble seconds) { MSG_error_t rv = MSG_process_sleep((double) seconds); @@ -349,7 +344,7 @@ Java_simgrid_msg_MsgNative_processWaitFor(JNIEnv * env, jclass cls, ***************************************************************************************/ JNIEXPORT jobject JNICALL -Java_simgrid_msg_MsgNative_hostGetByName(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_hostGetByName(JNIEnv * env, jclass cls, jstring jname) { m_host_t host; /* native host */ @@ -357,21 +352,21 @@ Java_simgrid_msg_MsgNative_hostGetByName(JNIEnv * env, jclass cls, /* get the C string from the java string */ const char *name = (*env)->GetStringUTFChars(env, jname, 0); - + XBT_DEBUG("Looking for host '%s'",name); /* get the host by name (the hosts are created during the grid resolution) */ host = MSG_get_host_by_name(name); - DEBUG2("MSG gave %p as native host (simdata=%p)", host, host->simdata); - - (*env)->ReleaseStringUTFChars(env, jname, name); + XBT_DEBUG("MSG gave %p as native host (smx_host=%p)", host,host? host->smx_host:NULL); if (!host) { /* invalid name */ jxbt_throw_host_not_found(env, name); + (*env)->ReleaseStringUTFChars(env, jname, name); return NULL; } + (*env)->ReleaseStringUTFChars(env, jname, name); if (!MSG_host_get_data(host)) { /* native host not associated yet with java host */ - /* instanciate a new java host */ + /* Instantiate a new java host */ jhost = jhost_new_instance(env); if (!jhost) { @@ -401,7 +396,7 @@ Java_simgrid_msg_MsgNative_hostGetByName(JNIEnv * env, jclass cls, } JNIEXPORT jstring JNICALL -Java_simgrid_msg_MsgNative_hostGetName(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_hostGetName(JNIEnv * env, jclass cls, jobject jhost) { m_host_t host = jhost_get_native(env, jhost); @@ -415,13 +410,16 @@ Java_simgrid_msg_MsgNative_hostGetName(JNIEnv * env, jclass cls, } JNIEXPORT jint JNICALL -Java_simgrid_msg_MsgNative_hostGetNumber(JNIEnv * env, jclass cls) +Java_org_simgrid_msg_MsgNative_hostGetNumber(JNIEnv * env, jclass cls) { - return (jint) MSG_get_host_number(); + xbt_dynar_t hosts = MSG_hosts_as_dynar(); + int nb_host = xbt_dynar_length(hosts); + xbt_dynar_free(&hosts); + return (jint) nb_host; } JNIEXPORT jobject JNICALL -Java_simgrid_msg_MsgNative_hostSelf(JNIEnv * env, jclass cls) +Java_org_simgrid_msg_MsgNative_hostSelf(JNIEnv * env, jclass cls) { jobject jhost; @@ -457,7 +455,7 @@ Java_simgrid_msg_MsgNative_hostSelf(JNIEnv * env, jclass cls) } JNIEXPORT jdouble JNICALL -Java_simgrid_msg_MsgNative_hostGetSpeed(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_hostGetSpeed(JNIEnv * env, jclass cls, jobject jhost) { m_host_t host = jhost_get_native(env, jhost); @@ -471,7 +469,7 @@ Java_simgrid_msg_MsgNative_hostGetSpeed(JNIEnv * env, jclass cls, } JNIEXPORT jint JNICALL -Java_simgrid_msg_MsgNative_hostGetLoad(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_hostGetLoad(JNIEnv * env, jclass cls, jobject jhost) { m_host_t host = jhost_get_native(env, jhost); @@ -486,7 +484,7 @@ Java_simgrid_msg_MsgNative_hostGetLoad(JNIEnv * env, jclass cls, JNIEXPORT jboolean JNICALL -Java_simgrid_msg_MsgNative_hostIsAvail(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_hostIsAvail(JNIEnv * env, jclass cls, jobject jhost) { m_host_t host = jhost_get_native(env, jhost); @@ -505,7 +503,7 @@ Java_simgrid_msg_MsgNative_hostIsAvail(JNIEnv * env, jclass cls, ***************************************************************************************/ JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_taskCreate(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskCreate(JNIEnv * env, jclass cls, jobject jtask, jstring jname, jdouble jcomputeDuration, jdouble jmessageSize) @@ -548,7 +546,7 @@ Java_simgrid_msg_MsgNative_taskCreate(JNIEnv * env, jclass cls, } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_parallel_taskCreate(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_parallel_taskCreate(JNIEnv * env, jclass cls, jobject jtask, jstring jname, jobjectArray jhosts, @@ -636,7 +634,7 @@ Java_simgrid_msg_MsgNative_parallel_taskCreate(JNIEnv * env, jclass cls, } JNIEXPORT jobject JNICALL -Java_simgrid_msg_MsgNative_taskGetSender(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskGetSender(JNIEnv * env, jclass cls, jobject jtask) { m_process_t process; @@ -653,7 +651,7 @@ Java_simgrid_msg_MsgNative_taskGetSender(JNIEnv * env, jclass cls, } JNIEXPORT jobject JNICALL -Java_simgrid_msg_MsgNative_taskGetSource(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskGetSource(JNIEnv * env, jclass cls, jobject jtask) { m_host_t host; @@ -676,7 +674,7 @@ Java_simgrid_msg_MsgNative_taskGetSource(JNIEnv * env, jclass cls, JNIEXPORT jstring JNICALL -Java_simgrid_msg_MsgNative_taskGetName(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskGetName(JNIEnv * env, jclass cls, jobject jtask) { m_task_t task = jtask_to_native_task(jtask, env); @@ -690,7 +688,7 @@ Java_simgrid_msg_MsgNative_taskGetName(JNIEnv * env, jclass cls, } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_taskCancel(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskCancel(JNIEnv * env, jclass cls, jobject jtask) { m_task_t ptask = jtask_to_native_task(jtask, env); @@ -707,7 +705,7 @@ Java_simgrid_msg_MsgNative_taskCancel(JNIEnv * env, jclass cls, } JNIEXPORT jdouble JNICALL -Java_simgrid_msg_MsgNative_taskGetComputeDuration(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskGetComputeDuration(JNIEnv * env, jclass cls, jobject jtask) { m_task_t ptask = jtask_to_native_task(jtask, env); @@ -720,7 +718,7 @@ Java_simgrid_msg_MsgNative_taskGetComputeDuration(JNIEnv * env, jclass cls, } JNIEXPORT jdouble JNICALL -Java_simgrid_msg_MsgNative_taskGetRemainingDuration(JNIEnv * env, +Java_org_simgrid_msg_MsgNative_taskGetRemainingDuration(JNIEnv * env, jclass cls, jobject jtask) { @@ -734,7 +732,7 @@ Java_simgrid_msg_MsgNative_taskGetRemainingDuration(JNIEnv * env, } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_taskSetPriority(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskSetPriority(JNIEnv * env, jclass cls, jobject jtask, jdouble priority) { m_task_t task = jtask_to_native_task(jtask, env); @@ -747,19 +745,17 @@ Java_simgrid_msg_MsgNative_taskSetPriority(JNIEnv * env, jclass cls, } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_taskDestroy(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskDestroy(JNIEnv * env, jclass cls, jobject jtask_arg) { /* get the native task */ m_task_t task = jtask_to_native_task(jtask_arg, env); - jobject jtask; if (!task) { jxbt_throw_notbound(env, "task", task); return; } - jtask = (jobject) MSG_task_get_data(task); MSG_error_t rv = MSG_task_destroy(task); @@ -768,7 +764,7 @@ Java_simgrid_msg_MsgNative_taskDestroy(JNIEnv * env, jclass cls, } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_taskExecute(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskExecute(JNIEnv * env, jclass cls, jobject jtask) { m_task_t task = jtask_to_native_task(jtask, env); @@ -781,7 +777,7 @@ Java_simgrid_msg_MsgNative_taskExecute(JNIEnv * env, jclass cls, MSG_error_t rv = MSG_task_execute(task); jxbt_check_res("MSG_task_execute()", rv, - MSG_HOST_FAILURE | MSG_TASK_CANCELLED, + MSG_HOST_FAILURE | MSG_TASK_CANCELED, bprintf("while executing task %s", MSG_task_get_name(task))); } @@ -790,22 +786,14 @@ Java_simgrid_msg_MsgNative_taskExecute(JNIEnv * env, jclass cls, * Unsortable functions * ***************************************************************************************/ - -JNIEXPORT jint JNICALL -Java_simgrid_msg_Msg_getErrCode(JNIEnv * env, jclass cls) -{ - return (jint) MSG_get_errno(); -} - JNIEXPORT jdouble JNICALL -Java_simgrid_msg_Msg_getClock(JNIEnv * env, jclass cls) +Java_org_simgrid_msg_Msg_getClock(JNIEnv * env, jclass cls) { return (jdouble) MSG_get_clock(); } - JNIEXPORT void JNICALL -Java_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs) +Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs) { char **argv = NULL; int index; @@ -813,13 +801,13 @@ Java_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs) jstring jval; const char *tmp; - factory_initializer_to_use = SIMIX_ctx_java_factory_init; + smx_factory_initializer_to_use = SIMIX_ctx_java_factory_init; if (jargs) argc = (int) (*env)->GetArrayLength(env, jargs); argc++; - argv = xbt_new0(char *, argc); + argv = xbt_new(char *, argc + 1); argv[0] = strdup("java"); for (index = 0; index < argc - 1; index++) { @@ -828,6 +816,7 @@ Java_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs) argv[index + 1] = strdup(tmp); (*env)->ReleaseStringUTFChars(env, jval, tmp); } + argv[argc] = NULL; MSG_global_init(&argc, argv); @@ -840,50 +829,54 @@ Java_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs) } JNIEXPORT void JNICALL - JNICALL Java_simgrid_msg_Msg_run(JNIEnv * env, jclass cls) + JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv * env, jclass cls) { MSG_error_t rv; - int index; //xbt_fifo_item_t item = NULL; - m_host_t *hosts; + int index; + xbt_dynar_t hosts; jobject jhost; /* Run everything */ + XBT_INFO("Ready to run MSG_MAIN"); rv = MSG_main(); + XBT_INFO("Done running MSG_MAIN"); jxbt_check_res("MSG_main()", rv, MSG_OK, bprintf ("unexpected error : MSG_main() failed .. please report this bug ")); - DEBUG0 - ("MSG_main finished. Bail out before cleanup since there is a bug in this part."); + XBT_INFO("MSG_main finished"); - DEBUG0("Clean java world"); + XBT_INFO("Clean java world"); /* Cleanup java hosts */ - hosts = MSG_get_host_table(); - for (index = 0; index < MSG_get_host_number() - 1; index++) { - jhost = (jobject) hosts[index]->data; + 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)); if (jhost) jhost_unref(env, jhost); } - - DEBUG0("Clean native world"); - /* cleanup native stuff */ - rv = MSG_OK != MSG_clean(); + xbt_dynar_free(&hosts); + XBT_INFO("Clean native world"); +} +JNIEXPORT void JNICALL + 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(); jxbt_check_res("MSG_clean()", rv, MSG_OK, bprintf ("unexpected error : MSG_clean() failed .. please report this bug ")); - } - + JNIEXPORT jint JNICALL -Java_simgrid_msg_MsgNative_processKillAll(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_processKillAll(JNIEnv * env, jclass cls, jint jresetPID) { return (jint) MSG_process_killall((int) jresetPID); } JNIEXPORT void JNICALL -Java_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls, jstring jplatformFile) { @@ -896,7 +889,7 @@ Java_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls, } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_processExit(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_processExit(JNIEnv * env, jclass cls, jobject jprocess) { @@ -907,19 +900,19 @@ Java_simgrid_msg_MsgNative_processExit(JNIEnv * env, jclass cls, return; } - SIMIX_context_stop(SIMIX_process_self()->context); + smx_ctx_java_stop(MSG_process_get_smx_ctx(process)); } JNIEXPORT void JNICALL -Java_simgrid_msg_Msg_info(JNIEnv * env, jclass cls, jstring js) +Java_org_simgrid_msg_Msg_info(JNIEnv * env, jclass cls, jstring js) { const char *s = (*env)->GetStringUTFChars(env, js, 0); - INFO1("%s", s); + XBT_INFO("%s", s); (*env)->ReleaseStringUTFChars(env, js, s); } JNIEXPORT jobjectArray JNICALL -Java_simgrid_msg_MsgNative_allHosts(JNIEnv * env, jclass cls_arg) +Java_org_simgrid_msg_MsgNative_allHosts(JNIEnv * env, jclass cls_arg) { int index; jobjectArray jtable; @@ -927,10 +920,10 @@ Java_simgrid_msg_MsgNative_allHosts(JNIEnv * env, jclass cls_arg) jstring jname; m_host_t host; - int count = MSG_get_host_number(); - m_host_t *table = MSG_get_host_table(); + xbt_dynar_t table = MSG_hosts_as_dynar(); + int count = xbt_dynar_length(table); - jclass cls = jxbt_get_class(env, "simgrid/msg/Host"); + jclass cls = jxbt_get_class(env, "org/simgrid/msg/Host"); if (!cls) { return NULL; @@ -944,25 +937,25 @@ Java_simgrid_msg_MsgNative_allHosts(JNIEnv * env, jclass cls_arg) } for (index = 0; index < count; index++) { - host = table[index]; + host = xbt_dynar_get_as(table,index,m_host_t); jhost = (jobject) (MSG_host_get_data(host)); if (!jhost) { jname = (*env)->NewStringUTF(env, MSG_host_get_name(host)); jhost = - Java_simgrid_msg_MsgNative_hostGetByName(env, cls_arg, jname); + Java_org_simgrid_msg_MsgNative_hostGetByName(env, cls_arg, jname); /* FIXME: leak of jname ? */ } (*env)->SetObjectArrayElement(env, jtable, index, jhost); } - + xbt_dynar_free(&table); return jtable; } JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_taskSend(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskSend(JNIEnv * env, jclass cls, jstring jalias, jobject jtask, jdouble jtimeout) { @@ -991,8 +984,43 @@ Java_simgrid_msg_MsgNative_taskSend(JNIEnv * env, jclass cls, MSG_task_get_name(task), alias)); } +static void msg_task_cancel_on_failed_dsend(void*t) { + m_task_t task = t; + JNIEnv *env =get_current_thread_env(); + jobject jtask_global = MSG_task_get_data(task); + + /* Destroy the global ref so that the JVM can free the stuff */ + (*env)->DeleteGlobalRef(env, jtask_global); + MSG_task_set_data(task, NULL); + MSG_task_destroy(task); +} + JNIEXPORT void JNICALL -Java_simgrid_msg_MsgNative_taskSendBounded(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskDSend(JNIEnv * env, jclass cls, + jstring jalias, jobject jtask) +{ + + const char *alias = (*env)->GetStringUTFChars(env, jalias, 0); + + m_task_t task = jtask_to_native_task(jtask, env); + + + if (!task) { + (*env)->ReleaseStringUTFChars(env, jalias, alias); + jxbt_throw_notbound(env, "task", jtask); + return; + } + + /* Pass a global ref to the Jtask into the Ctask so that the receiver can use it */ + MSG_task_set_data(task, (void *) (*env)->NewGlobalRef(env, jtask)); + MSG_task_dsend(task, alias, msg_task_cancel_on_failed_dsend); + + (*env)->ReleaseStringUTFChars(env, jalias, alias); +} + + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_MsgNative_taskSendBounded(JNIEnv * env, jclass cls, jstring jalias, jobject jtask, jdouble jmaxRate) { @@ -1022,7 +1050,7 @@ Java_simgrid_msg_MsgNative_taskSendBounded(JNIEnv * env, jclass cls, } JNIEXPORT jobject JNICALL -Java_simgrid_msg_MsgNative_taskReceive(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskReceive(JNIEnv * env, jclass cls, jstring jalias, jdouble jtimeout, jobject jhost) { @@ -1044,6 +1072,22 @@ Java_simgrid_msg_MsgNative_taskReceive(JNIEnv * env, jclass cls, alias = (*env)->GetStringUTFChars(env, jalias, 0); rv = MSG_task_receive_ext(&task, alias, (double) jtimeout, host); + if (rv != MSG_OK) { + switch (rv) { + case MSG_TIMEOUT: + jxbt_throw_time_out_failure(env,NULL); + break; + case MSG_TRANSFER_FAILURE: + jxbt_throw_transfer_failure(env,NULL); + break; + case MSG_HOST_FAILURE: + jxbt_throw_host_failure(env,NULL); + break; + default: + jxbt_throw_native(env,bprintf("receive failed")); + } + return NULL; + } jtask_global = MSG_task_get_data(task); /* Convert the global ref into a local ref so that the JVM can free the stuff */ @@ -1061,7 +1105,7 @@ Java_simgrid_msg_MsgNative_taskReceive(JNIEnv * env, jclass cls, } JNIEXPORT jboolean JNICALL -Java_simgrid_msg_MsgNative_taskListen(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskListen(JNIEnv * env, jclass cls, jstring jalias) { @@ -1078,7 +1122,7 @@ Java_simgrid_msg_MsgNative_taskListen(JNIEnv * env, jclass cls, } JNIEXPORT jint JNICALL -Java_simgrid_msg_MsgNative_taskListenFromHost(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskListenFromHost(JNIEnv * env, jclass cls, jstring jalias, jobject jhost) { @@ -1101,7 +1145,7 @@ Java_simgrid_msg_MsgNative_taskListenFromHost(JNIEnv * env, jclass cls, } JNIEXPORT jint JNICALL -Java_simgrid_msg_MsgNative_taskListenFrom(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_MsgNative_taskListenFrom(JNIEnv * env, jclass cls, jstring jalias) { @@ -1116,14 +1160,14 @@ Java_simgrid_msg_MsgNative_taskListenFrom(JNIEnv * env, jclass cls, } JNIEXPORT void JNICALL -Java_simgrid_msg_Msg_deployApplication(JNIEnv * env, jclass cls, +Java_org_simgrid_msg_Msg_deployApplication(JNIEnv * env, jclass cls, jstring jdeploymentFile) { const char *deploymentFile = (*env)->GetStringUTFChars(env, jdeploymentFile, 0); - surf_parse_reset_parser(); + surf_parse_reset_callbacks(); surfxml_add_callback(STag_surfxml_process_cb_list, japplication_handler_on_begin_process);