- if ((i==msg_global->max_channel) && (process!=MSG_process_self()) &&
- (!p_simdata->waiting_task)) {
- xbt_die("UNKNOWN STATUS. Please report this bug.");
- }
-*/
- xbt_swag_remove(process,simix_global->process_to_run);
- xbt_swag_remove(process,simix_global->process_list);
- xbt_context_free(process->simdata->context);
+ /* HACK: We need this trick because when we xbt_context_new() do
+ syncronization stuff, the s_process field in the m_process needs
+ to have a valid value, and we call xbt_context_new() before
+ returning, of course, ie, before providing a right value to the
+ caller (Java_simgrid_msg_Msg_processCreate) have time to store it
+ in place. This way, we initialize the m_process->simdata->s_process
+ field ourself ASAP.
+
+ All this would be much simpler if the synchronization stuff would be done
+ in the JAVA world, I think.
+ */
+ *res = process;
+
+
+
+ DEBUG5("jprocess_create(name=%s,host=%p,data=%p,jproc=%p,jenv=%p)",
+ name, host, data, jprocess, jenv);
+ xbt_assert0(host, "Invalid parameters");
+ /* Simulator Data */
+ simdata->s_host = host;
+ simdata->mutex = NULL;
+ simdata->cond = NULL;
+ simdata->argc = 0;
+ simdata->argv = NULL;
+
+ simdata->context = xbt_context_new(NULL, NULL, NULL,
+ simix_global->
+ cleanup_process_function, process,
+ /* argc/argv */ 0, NULL);
+
+ /* Process structure */
+ process->name = xbt_strdup(name);
+ process->simdata = simdata;
+ process->data = data;
+ SIMIX_process_set_jprocess(process, jprocess);
+ SIMIX_process_set_jenv(process, jenv);
+
+ xbt_swag_insert(process, host->simdata->process_list);
+
+ /* fix current_process, about which xbt_context_start mocks around */
+ self = simix_global->current_process;
+ xbt_context_start(process->simdata->context);
+ simix_global->current_process = self;
+
+ xbt_swag_insert(process, simix_global->process_list);
+ DEBUG2("Inserting %s(%s) in the to_run list", process->name, host->name);
+ xbt_swag_insert(process, simix_global->process_to_run);