-static void smx_ctx_java_free(smx_context_t context)
-{
- if (context) {
- smx_ctx_java_t ctx_java = (smx_ctx_java_t) context;
-
- if (ctx_java->jprocess) {
- jobject jprocess = ctx_java->jprocess;
-
- ctx_java->jprocess = NULL;
-
- /* if the java process is alive join it */
- if (jprocess_is_alive(jprocess, get_current_thread_env()))
- jprocess_join(jprocess, get_current_thread_env());
- }
+static void* smx_ctx_java_thread_run(void *data) {
+ smx_ctx_java_t context = (smx_ctx_java_t)data;
+ xbt_os_thread_set_extra_data(context);
+ //Attach the thread to the JVM
+ JNIEnv *env;
+ JavaVM *jvm = get_current_vm();
+ jint error = (*jvm)->AttachCurrentThread(jvm, (void **) &env, NULL);
+ xbt_assert((error == JNI_OK), "The thread could not be attached to the JVM");
+ context->jenv = get_current_thread_env();
+ //Wait for the first scheduling round to happen.
+ xbt_os_sem_acquire(context->begin);
+ //Create the "Process" object if needed.
+ if (context->super.argc > 0) {
+ (*(context->super.code))(context->super.argc, context->super.argv);
+ }
+ xbt_assert((context->jprocess != NULL), "Process not created...");
+ //wait for the process to be able to begin
+ //TODO: Cache it
+ jfieldID jprocess_field_Process_startTime = jxbt_get_sfield(env, "org/simgrid/msg/Process", "startTime", "D");
+ jdouble startTime = (*env)->GetDoubleField(env, context->jprocess, jprocess_field_Process_startTime);
+ if (startTime > MSG_get_clock()) {
+ MSG_process_sleep(startTime - MSG_get_clock());