+/** @brief Ask another process to raise the given exception
+ *
+ * @param cat category of exception
+ * @param value value associated to the exception
+ * @param msg string information associated to the exception
+ */
+void SIMIX_process_throw(smx_process_t process, xbt_errcat_t cat, int value, const char *msg) {
+ SMX_EXCEPTION(process, cat, value, msg);
+
+ if (process->suspended)
+ SIMIX_process_resume(process,SIMIX_process_self());
+
+ /* cancel the blocking synchro if any */
+ if (process->waiting_synchro) {
+
+ switch (process->waiting_synchro->type) {
+
+ case SIMIX_SYNC_EXECUTE:
+ case SIMIX_SYNC_PARALLEL_EXECUTE:
+ SIMIX_host_execution_cancel(process->waiting_synchro);
+ break;
+
+ case SIMIX_SYNC_COMMUNICATE:
+ xbt_fifo_remove(process->comms, process->waiting_synchro);
+ SIMIX_comm_cancel(process->waiting_synchro);
+ break;
+
+ case SIMIX_SYNC_SLEEP:
+ SIMIX_process_sleep_destroy(process->waiting_synchro);
+ break;
+
+ case SIMIX_SYNC_JOIN:
+ SIMIX_process_sleep_destroy(process->waiting_synchro);
+ break;
+
+ case SIMIX_SYNC_SYNCHRO:
+ SIMIX_synchro_stop_waiting(process, &process->simcall);
+ break;
+
+ case SIMIX_SYNC_IO:
+ SIMIX_io_destroy(process->waiting_synchro);
+ break;
+
+ }
+ }
+ process->waiting_synchro = NULL;
+
+ if (!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != SIMIX_process_self())
+ xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process);
+}
+
+void simcall_HANDLER_process_killall(smx_simcall_t simcall, int reset_pid) {
+ SIMIX_process_killall(simcall->issuer, reset_pid);
+}