static void smx_ctx_cojava_suspend(smx_context_t context) { smx_context_t previous_context = context; unsigned long int i = cojava_process_index++; jobject next_coroutine; if (i < xbt_dynar_length(cojava_processes)) { smx_context_t next_context = SIMIX_process_get_context(xbt_dynar_get_as( cojava_processes,i, smx_process_t)); my_current_context = next_context; XBT_DEBUG("Switching to %p",my_current_context); smx_ctx_cojava_t java_context = (smx_ctx_cojava_t)(next_context); if (!java_context->jprocess) { java_context->super.code(java_context->super.argc, java_context->super.argv); smx_ctx_cojava_create_coroutine(java_context); } else if (!java_context->bound) { java_context->bound = 1; smx_process_t process = SIMIX_process_self(); (*global_env)->SetLongField(global_env, java_context->jprocess, jprocess_field_Process_bind, (intptr_t)process); } next_coroutine = java_context->jcoroutine; } else { //Give maestro the control back. next_coroutine = cojava_maestro_coroutine; my_current_context = maestro_context; } (*global_env)->CallStaticVoidMethod(global_env, coclass, coroutine_yieldTo, next_coroutine); my_current_context = previous_context; }
static void smx_ctx_cojava_runall(void) { cojava_processes = SIMIX_process_get_runnable(); smx_process_t process; if (!xbt_dynar_is_empty(cojava_processes)) { process = xbt_dynar_get_as(cojava_processes, 0, smx_process_t); cojava_process_index = 1; /* Execute the first process */ smx_ctx_cojava_resume(SIMIX_process_get_context(process)); } }
smx_context_t MSG_process_get_smx_ctx(msg_process_t process) { return SIMIX_process_get_context(process); }