X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/95f8d2439ede822d33a1d491f53f4e80fc662941..2e3c299b6c518bfa45dd0056e90b1b95dfabd1b4:/src/jmsg.c diff --git a/src/jmsg.c b/src/jmsg.c index 62901c195a..997dfd0a7d 100644 --- a/src/jmsg.c +++ b/src/jmsg.c @@ -6,8 +6,10 @@ /* 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 "simix/context.h" +#include +#include +#include + #include "smx_context_java.h" #include "jmsg_process.h" @@ -17,7 +19,15 @@ #include "jxbt_utilities.h" #include "jmsg.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); @@ -49,20 +59,23 @@ 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 jhostname) { 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 */ + const char *hostname; m_process_t process; /* the native process to create */ m_host_t host; /* Where that process lives */ - DEBUG4("Java_simgrid_msg_MsgNative_processCreate(env=%p,cls=%p,jproc=%p,jhost=%p)", - env, cls, jprocess_arg, jhost); + hostname = (*env)->GetStringUTFChars(env, jhostname, 0); + + XBT_DEBUG("Java_org_simgrid_msg_MsgNative_processCreate(env=%p,cls=%p,jproc=%p,host=%s)", + env, cls, jprocess_arg, hostname); /* get the name of the java process */ @@ -74,10 +87,10 @@ Java_simgrid_msg_MsgNative_processCreate(JNIEnv * env, jclass cls, } /* bind/retrieve the msg host */ - host = jhost_get_native(env, jhost); + host = MSG_get_host_by_name(hostname); if (!(host)) { /* not binded */ - jxbt_throw_notbound(env, "host", jhost); + jxbt_throw_host_not_found(env, hostname); return; } @@ -97,23 +110,24 @@ Java_simgrid_msg_MsgNative_processCreate(JNIEnv * env, jclass cls, (xbt_main_func_t) jprocess, /*data*/ NULL, host, + /* kill_time */-1, /*argc, argv, properties*/ 0,NULL,NULL); MSG_process_set_data(process,&process); /* release our reference to the process name (variable name becomes invalid) */ - (*env)->ReleaseStringUTFChars(env, jname, name); + //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); } 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); @@ -132,7 +146,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); @@ -150,7 +180,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); @@ -165,7 +195,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 */ @@ -176,9 +206,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) */ @@ -186,7 +213,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 */ @@ -211,7 +238,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); @@ -231,7 +258,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); @@ -246,7 +273,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); @@ -260,7 +287,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; @@ -279,9 +306,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) { @@ -290,15 +324,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); @@ -315,7 +348,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 */ @@ -323,21 +356,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) { @@ -367,7 +400,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); @@ -381,13 +414,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; @@ -423,7 +459,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); @@ -437,7 +473,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); @@ -452,7 +488,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); @@ -471,7 +507,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) @@ -514,7 +550,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, @@ -602,7 +638,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; @@ -619,7 +655,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; @@ -642,7 +678,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); @@ -656,7 +692,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); @@ -673,7 +709,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); @@ -686,7 +722,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) { @@ -700,7 +736,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); @@ -713,19 +749,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); @@ -734,7 +768,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); @@ -747,7 +781,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))); } @@ -756,22 +790,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; @@ -779,13 +805,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++) { @@ -794,6 +820,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); @@ -806,50 +833,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) { @@ -862,7 +893,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) { @@ -873,19 +904,19 @@ Java_simgrid_msg_MsgNative_processExit(JNIEnv * env, jclass cls, return; } - MSG_process_kill(process); + 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; @@ -893,10 +924,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; @@ -910,25 +941,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) { @@ -957,8 +988,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) { @@ -988,7 +1054,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) { @@ -1010,6 +1076,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 */ @@ -1027,7 +1109,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) { @@ -1044,7 +1126,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) { @@ -1067,7 +1149,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) { @@ -1082,14 +1164,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);