A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
Dont produce that pdf output that we dont use
[simgrid.git]
/
src
/
simix
/
smx_process.c
diff --git
a/src/simix/smx_process.c
b/src/simix/smx_process.c
index
737ea00
..
a0bcac1
100644
(file)
--- a/
src/simix/smx_process.c
+++ b/
src/simix/smx_process.c
@@
-26,7
+26,7
@@
XBT_INLINE smx_process_t SIMIX_process_self(void)
{
smx_context_t self_context = SIMIX_context_self();
- return self_context ? SIMIX_context_get_
data
(self_context) : NULL;
+ return self_context ? SIMIX_context_get_
process
(self_context) : NULL;
}
/**
@@
-38,60
+38,51
@@
int SIMIX_process_has_pending_comms(smx_process_t process) {
return xbt_fifo_size(process->comms) > 0;
}
-void SIMIX_pre_process_cleanup(smx_simcall_t simcall, smx_process_t process) {
- SIMIX_process_cleanup(process);
-}
/**
* \brief Moves a process to the list of processes to destroy.
*/
void SIMIX_process_cleanup(smx_process_t process)
{
- XBT_DEBUG("Cleanup process %s (%p), waiting action %p",
- process->name, process, process->waiting_action);
+ XBT_DEBUG("Cleanup process %s (%p), waiting synchro %p",
+ process->name, process, process->waiting_synchro);
+
+ SIMIX_process_on_exit_runall(process);
/* cancel non-blocking communications */
- smx_
action_t action
;
- while ((
action
= xbt_fifo_pop(process->comms))) {
+ smx_
synchro_t synchro
;
+ while ((
synchro
= xbt_fifo_pop(process->comms))) {
/* make sure no one will finish the comm after this process is destroyed,
* because src_proc or dst_proc would be an invalid pointer */
- SIMIX_comm_cancel(
action
);
+ SIMIX_comm_cancel(
synchro
);
- if (
action
->comm.src_proc == process) {
+ if (
synchro
->comm.src_proc == process) {
XBT_DEBUG("Found an unfinished send comm %p (detached = %d), state %d, src = %p, dst = %p",
- action, action->comm.detached, (int)action->state, action->comm.src_proc, action->comm.dst_proc);
- action->comm.src_proc = NULL;
-
- if (action->comm.detached) {
- if (action->comm.refcount == 0) {
- XBT_DEBUG("Increase the refcount before destroying it since it's detached");
- /* I'm not supposed to destroy a detached comm from the sender side,
- * unless there is no receiver matching the rdv */
- action->comm.refcount++;
- SIMIX_comm_destroy(action);
- }
- else {
- XBT_DEBUG("Don't destroy it since its refcount is %d", action->comm.refcount);
- }
- } else {
- SIMIX_comm_destroy(action);
- }
+ synchro, synchro->comm.detached, (int)synchro->state, synchro->comm.src_proc, synchro->comm.dst_proc);
+ synchro->comm.src_proc = NULL;
+
+ /* I'm not supposed to destroy a detached comm from the sender side, */
+ if (!synchro->comm.detached)
+ SIMIX_comm_destroy(synchro);
+ else
+ XBT_DEBUG("Don't destroy it since it's a detached comm");
+
}
- else if (
action
->comm.dst_proc == process){
+ else if (
synchro
->comm.dst_proc == process){
XBT_DEBUG("Found an unfinished recv comm %p, state %d, src = %p, dst = %p",
-
action, (int)action->state, action->comm.src_proc, action
->comm.dst_proc);
-
action
->comm.dst_proc = NULL;
+
synchro, (int)synchro->state, synchro->comm.src_proc, synchro
->comm.dst_proc);
+
synchro
->comm.dst_proc = NULL;
- if (
action->comm.detached && action
->comm.refcount == 1
- &&
action
->comm.src_proc != NULL) {
+ if (
synchro->comm.detached && synchro
->comm.refcount == 1
+ &&
synchro
->comm.src_proc != NULL) {
/* the comm will be freed right now, remove it from the sender */
- xbt_fifo_remove(
action->comm.src_proc->comms, action
);
+ xbt_fifo_remove(
synchro->comm.src_proc->comms, synchro
);
}
- SIMIX_comm_destroy(
action
);
+ SIMIX_comm_destroy(
synchro
);
}
else {
- xbt_die("Communication
action
%p is in my list but I'm not the sender "
- "or the receiver",
action
);
+ xbt_die("Communication
synchro
%p is in my list but I'm not the sender "
+ "or the receiver",
synchro
);
}
}
@@
-101,7
+92,7
@@
void SIMIX_process_cleanup(smx_process_t process)
process->context->iwannadie = 0;
}
-/**
+/**
* Garbage collection
*
* Should be called some time to time to free the memory allocated for processes
@@
-137,18
+128,12
@@
void SIMIX_create_maestro_process()
/* Create maestro process and intilialize it */
maestro = xbt_new0(s_smx_process_t, 1);
maestro->pid = simix_process_maxpid++;
+ maestro->ppid = -1;
maestro->name = (char *) "";
maestro->running_ctx = xbt_new(xbt_running_ctx_t, 1);
XBT_RUNNING_CTX_INITIALIZE(maestro->running_ctx);
maestro->context = SIMIX_context_new(NULL, 0, NULL, NULL, maestro);
maestro->simcall.issuer = maestro;
-
- if (SIMIX_process_self()) {
- maestro->ppid = SIMIX_process_get_PID(SIMIX_process_self());
- } else {
- maestro->ppid = -1;
- }
-
simix_global->maestro_process = maestro;
return;
}
@@
-185,23
+170,23
@@
void SIMIX_process_stop(smx_process_t arg) {
smx_process_t SIMIX_process_create_from_wrapper(smx_process_arg_t args) {
smx_process_t process;
- simix_global->create_process_function(
-
&process
,
-
args->nam
e,
-
args->code
,
-
args->data
,
-
args->hostna
me,
-
args->kill_time
,
-
args->argc
,
-
args->argv
,
-
args->properties
,
-
args->auto_restart
);
+ simix_global->create_process_function(
&process,
+
args->name
,
+
args->cod
e,
+
args->data
,
+
args->hostname
,
+
args->kill_ti
me,
+
args->argc
,
+
args->argv
,
+
args->properties
,
+
args->auto_restart
,
+
NULL
);
xbt_free(args);
return process;
}
-void
SIMIX_pre
_process_create(smx_simcall_t simcall,
+void
simcall_HANDLER
_process_create(smx_simcall_t simcall,
smx_process_t *process,
const char *name,
xbt_main_func_t code,
@@
-211,8
+196,9
@@
void SIMIX_pre_process_create(smx_simcall_t simcall,
int argc, char **argv,
xbt_dict_t properties,
int auto_restart){
- return SIMIX_process_create(process, name, code, data, hostname,
- kill_time, argc, argv, properties, auto_restart);
+ SIMIX_process_create(process, name, code, data, hostname,
+ kill_time, argc, argv, properties, auto_restart,
+ simcall->issuer);
}
/**
* \brief Internal function to create a process.
@@
-231,8
+217,9
@@
void SIMIX_process_create(smx_process_t *process,
double kill_time,
int argc, char **argv,
xbt_dict_t properties,
- int auto_restart) {
-
+ int auto_restart,
+ smx_process_t parent_process)
+{
*process = NULL;
smx_host_t host = SIMIX_host_get_by_name(hostname);
@@
-257,9
+244,9
@@
void SIMIX_process_create(smx_process_t *process,
(*process)->data = data;
(*process)->comms = xbt_fifo_new();
(*process)->simcall.issuer = *process;
-
- if (
SIMIX_process_self()
) {
- (*process)->ppid = SIMIX_process_get_PID(
SIMIX_process_self()
);
+
+ if (
parent_process
) {
+ (*process)->ppid = SIMIX_process_get_PID(
parent_process
);
} else {
(*process)->ppid = -1;
}
@@
-295,10
+282,8
@@
void SIMIX_process_create(smx_process_t *process,
xbt_swag_insert(*process, simix_global->process_list);
XBT_DEBUG("Inserting %s(%s) in the to_run list", (*process)->name, sg_host_name(host));
xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, *process);
- }
- if (kill_time > SIMIX_get_clock()) {
- if (simix_global->kill_process_function) {
+ if (kill_time > SIMIX_get_clock() && simix_global->kill_process_function) {
XBT_DEBUG("Process %s(%s) will be kill at time %f", (*process)->name,
sg_host_name((*process)->smx_host), kill_time);
SIMIX_timer_set(kill_time, simix_global->kill_process_function, *process);
@@
-325,7
+310,7
@@
void SIMIX_process_runall(void)
xbt_dynar_reset(simix_global->process_to_run);
}
-void
SIMIX_pre
_process_kill(smx_simcall_t simcall, smx_process_t process) {
+void
simcall_HANDLER
_process_kill(smx_simcall_t simcall, smx_process_t process) {
SIMIX_process_kill(process, simcall->issuer);
}
/**
@@
-344,43
+329,40
@@
void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) {
process->context->iwannadie = 1;
process->blocked = 0;
process->suspended = 0;
- /* FIXME: set doexception to 0 also? */
+ process->doexception = 0;
- /* destroy the blocking
action
if any */
- if (process->waiting_
action
) {
+ /* destroy the blocking
synchro
if any */
+ if (process->waiting_
synchro
) {
- switch (process->waiting_
action
->type) {
+ switch (process->waiting_
synchro
->type) {
- case SIMIX_
ACTION
_EXECUTE:
- case SIMIX_
ACTION
_PARALLEL_EXECUTE:
- SIMIX_host_execution_destroy(process->waiting_
action
);
+ case SIMIX_
SYNC
_EXECUTE:
+ case SIMIX_
SYNC
_PARALLEL_EXECUTE:
+ SIMIX_host_execution_destroy(process->waiting_
synchro
);
break;
- case SIMIX_
ACTION
_COMMUNICATE:
- xbt_fifo_remove(process->comms, process->waiting_
action
);
- SIMIX_comm_cancel(process->waiting_
action
);
- SIMIX_comm_destroy(process->waiting_
action
);
+ case SIMIX_
SYNC
_COMMUNICATE:
+ xbt_fifo_remove(process->comms, process->waiting_
synchro
);
+ SIMIX_comm_cancel(process->waiting_
synchro
);
+ SIMIX_comm_destroy(process->waiting_
synchro
);
break;
- case SIMIX_
ACTION
_SLEEP:
- SIMIX_process_sleep_destroy(process->waiting_
action
);
+ case SIMIX_
SYNC
_SLEEP:
+ SIMIX_process_sleep_destroy(process->waiting_
synchro
);
break;
- case SIMIX_ACTION_SYNCHRO:
- SIMIX_synchro_stop_waiting(process, &process->simcall);
- SIMIX_synchro_destroy(process->waiting_action);
+ case SIMIX_SYNC_JOIN:
+ SIMIX_process_sleep_destroy(process->waiting_synchro);
break;
- case SIMIX_ACTION_IO:
- SIMIX_io_destroy(process->waiting_action);
+ case SIMIX_SYNC_SYNCHRO:
+ SIMIX_synchro_stop_waiting(process, &process->simcall);
+ SIMIX_synchro_destroy(process->waiting_synchro);
break;
- /* **************************************/
- /* TUTORIAL: New API */
- case SIMIX_ACTION_NEW_API:
- SIMIX_new_api_destroy(process->waiting_action);
+ case SIMIX_SYNC_IO:
+ SIMIX_io_destroy(process->waiting_synchro);
break;
- /* **************************************/
}
}
@@
-390,7
+372,58
@@
void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) {
}
-void SIMIX_pre_process_killall(smx_simcall_t simcall, int reset_pid) {
+/** @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);
}
/**
@@
-415,7
+448,7
@@
void SIMIX_process_killall(smx_process_t issuer, int reset_pid)
SIMIX_process_empty_trash();
}
-void
SIMIX_pre
_process_change_host(smx_simcall_t simcall, smx_process_t process,
+void
simcall_HANDLER
_process_change_host(smx_simcall_t simcall, smx_process_t process,
smx_host_t dest)
{
process->new_host = dest;
@@
-430,22
+463,22
@@
void SIMIX_process_change_host(smx_process_t process,
}
-void
SIMIX_pre
_process_suspend(smx_simcall_t simcall, smx_process_t process)
+void
simcall_HANDLER
_process_suspend(smx_simcall_t simcall, smx_process_t process)
{
- smx_
action_t action
_suspend =
+ smx_
synchro_t sync
_suspend =
SIMIX_process_suspend(process, simcall->issuer);
if (process != simcall->issuer) {
SIMIX_simcall_answer(simcall);
} else {
- xbt_fifo_push(
action
_suspend->simcalls, simcall);
- process->waiting_
action = action
_suspend;
- SIMIX_host_execution_suspend(process->waiting_
action
);
+ xbt_fifo_push(
sync
_suspend->simcalls, simcall);
+ process->waiting_
synchro = sync
_suspend;
+ SIMIX_host_execution_suspend(process->waiting_
synchro
);
}
/* If we are suspending ourselves, then just do not finish the simcall now */
}
-smx_
action
_t SIMIX_process_suspend(smx_process_t process, smx_process_t issuer)
+smx_
synchro
_t SIMIX_process_suspend(smx_process_t process, smx_process_t issuer)
{
xbt_assert((process != NULL), "Invalid parameters");
@@
-456,34
+489,34
@@
smx_action_t SIMIX_process_suspend(smx_process_t process, smx_process_t issuer)
process->suspended = 1;
- /* If we are suspending another process, and it is waiting on a
n action
,
- suspend its
ac
tion. */
+ /* If we are suspending another process, and it is waiting on a
sync
,
+ suspend its
synchroniza
tion. */
if (process != issuer) {
- if (process->waiting_
action
) {
+ if (process->waiting_
synchro
) {
- switch (process->waiting_
action
->type) {
+ switch (process->waiting_
synchro
->type) {
- case SIMIX_
ACTION
_EXECUTE:
- case SIMIX_
ACTION
_PARALLEL_EXECUTE:
- SIMIX_host_execution_suspend(process->waiting_
action
);
+ case SIMIX_
SYNC
_EXECUTE:
+ case SIMIX_
SYNC
_PARALLEL_EXECUTE:
+ SIMIX_host_execution_suspend(process->waiting_
synchro
);
break;
- case SIMIX_
ACTION
_COMMUNICATE:
- SIMIX_comm_suspend(process->waiting_
action
);
+ case SIMIX_
SYNC
_COMMUNICATE:
+ SIMIX_comm_suspend(process->waiting_
synchro
);
break;
- case SIMIX_
ACTION
_SLEEP:
- SIMIX_process_sleep_suspend(process->waiting_
action
);
+ case SIMIX_
SYNC
_SLEEP:
+ SIMIX_process_sleep_suspend(process->waiting_
synchro
);
break;
- case SIMIX_
ACTION
_SYNCHRO:
+ case SIMIX_
SYNC
_SYNCHRO:
/* Suspension is delayed to when the process is rescheduled. */
break;
default:
- xbt_die("Internal error in SIMIX_process_suspend: unexpected
ac
tion type %d",
- (int)process->waiting_
action
->type);
+ xbt_die("Internal error in SIMIX_process_suspend: unexpected
synchroniza
tion type %d",
+ (int)process->waiting_
synchro
->type);
}
return NULL;
} else {
@@
-496,14
+529,12
@@
smx_action_t SIMIX_process_suspend(smx_process_t process, smx_process_t issuer)
}
}
-void
SIMIX_pre
_process_resume(smx_simcall_t simcall, smx_process_t process){
+void
simcall_HANDLER
_process_resume(smx_simcall_t simcall, smx_process_t process){
SIMIX_process_resume(process, simcall->issuer);
}
void SIMIX_process_resume(smx_process_t process, smx_process_t issuer)
{
- xbt_assert((process != NULL), "Invalid parameters");
-
XBT_IN("process = %p, issuer = %p", process, issuer);
if(process->context->iwannadie) {
@@
-514,35
+545,35
@@
void SIMIX_process_resume(smx_process_t process, smx_process_t issuer)
if(!process->suspended) return;
process->suspended = 0;
- /* If we are resuming another process, resume the
ac
tion it was waiting for
+ /* If we are resuming another process, resume the
synchroniza
tion it was waiting for
if any. Otherwise add it to the list of process to run in the next round. */
if (process != issuer) {
- if (process->waiting_
action
) {
+ if (process->waiting_
synchro
) {
- switch (process->waiting_
action
->type) {
+ switch (process->waiting_
synchro
->type) {
- case SIMIX_
ACTION_EXECUTE:
- case SIMIX_
ACTION
_PARALLEL_EXECUTE:
- SIMIX_host_execution_resume(process->waiting_
action
);
+ case SIMIX_
SYNC_EXECUTE:
+ case SIMIX_
SYNC
_PARALLEL_EXECUTE:
+ SIMIX_host_execution_resume(process->waiting_
synchro
);
break;
- case SIMIX_
ACTION
_COMMUNICATE:
- SIMIX_comm_resume(process->waiting_
action
);
+ case SIMIX_
SYNC
_COMMUNICATE:
+ SIMIX_comm_resume(process->waiting_
synchro
);
break;
- case SIMIX_
ACTION
_SLEEP:
- SIMIX_process_sleep_resume(process->waiting_
action
);
+ case SIMIX_
SYNC
_SLEEP:
+ SIMIX_process_sleep_resume(process->waiting_
synchro
);
break;
- case SIMIX_
ACTION
_SYNCHRO:
+ case SIMIX_
SYNC
_SYNCHRO:
/* I cannot resume it now. This is delayed to when the process is rescheduled at
* the end of the synchro. */
break;
default:
- xbt_die("Internal error in SIMIX_process_resume: unexpected
ac
tion type %d",
- (int)process->waiting_
action
->type);
+ xbt_die("Internal error in SIMIX_process_resume: unexpected
synchroniza
tion type %d",
+ (int)process->waiting_
synchro
->type);
}
}
} else XBT_WARN("Strange. Process %p is trying to resume himself.", issuer);
@@
-554,18
+585,11
@@
int SIMIX_process_get_maxpid(void) {
return simix_process_maxpid;
}
-int SIMIX_pre_process_count(smx_simcall_t simcall){
- return SIMIX_process_count();
-}
int SIMIX_process_count(void)
{
return xbt_swag_size(simix_global->process_list);
}
-int SIMIX_pre_process_get_PID(smx_simcall_t simcall, smx_process_t self){
- return SIMIX_process_get_PID(self);
-}
-
int SIMIX_process_get_PID(smx_process_t self){
if (self == NULL)
return 0;
@@
-573,10
+597,6
@@
int SIMIX_process_get_PID(smx_process_t self){
return self->pid;
}
-int SIMIX_pre_process_get_PPID(smx_simcall_t simcall, smx_process_t self){
- return SIMIX_process_get_PPID(self);
-}
-
int SIMIX_process_get_PPID(smx_process_t self){
if (self == NULL)
return 0;
@@
-584,10
+604,6
@@
int SIMIX_process_get_PPID(smx_process_t self){
return self->ppid;
}
-void* SIMIX_pre_process_self_get_data(smx_simcall_t simcall, smx_process_t self){
- return SIMIX_process_self_get_data(self);
-}
-
void* SIMIX_process_self_get_data(smx_process_t self)
{
xbt_assert(self == SIMIX_process_self(), "This is not the current process");
@@
-598,10
+614,6
@@
void* SIMIX_process_self_get_data(smx_process_t self)
return SIMIX_process_get_data(self);
}
-void SIMIX_pre_process_set_data(smx_simcall_t simcall, smx_process_t process,
- void *data){
- SIMIX_process_set_data(process, data);
-}
void SIMIX_process_self_set_data(smx_process_t self, void *data)
{
xbt_assert(self == SIMIX_process_self(), "This is not the current process");
@@
-609,9
+621,6
@@
void SIMIX_process_self_set_data(smx_process_t self, void *data)
SIMIX_process_set_data(self, data);
}
-void* SIMIX_pre_process_get_data(smx_simcall_t simcall, smx_process_t process){
- return SIMIX_process_get_data(process);
-}
void* SIMIX_process_get_data(smx_process_t process)
{
return process->data;
@@
-622,9
+631,6
@@
void SIMIX_process_set_data(smx_process_t process, void *data)
process->data = data;
}
-smx_host_t SIMIX_pre_process_get_host(smx_simcall_t simcall, smx_process_t process){
- return SIMIX_process_get_host(process);
-}
smx_host_t SIMIX_process_get_host(smx_process_t process)
{
return process->smx_host;
@@
-641,9
+647,6
@@
const char* SIMIX_process_self_get_name(void) {
return SIMIX_process_get_name(process);
}
-const char* SIMIX_pre_process_get_name(smx_simcall_t simcall, smx_process_t process) {
- return SIMIX_process_get_name(process);
-}
const char* SIMIX_process_get_name(smx_process_t process)
{
return process->name;
@@
-661,23
+664,55
@@
smx_process_t SIMIX_process_get_by_name(const char* name)
return NULL;
}
-int SIMIX_pre_process_is_suspended(smx_simcall_t simcall, smx_process_t process){
- return SIMIX_process_is_suspended(process);
-}
int SIMIX_process_is_suspended(smx_process_t process)
{
return process->suspended;
}
-xbt_dict_t SIMIX_pre_process_get_properties(smx_simcall_t simcall, smx_process_t process){
- return SIMIX_process_get_properties(process);
-}
xbt_dict_t SIMIX_process_get_properties(smx_process_t process)
{
return process->properties;
}
-void SIMIX_pre_process_sleep(smx_simcall_t simcall, double duration)
+void simcall_HANDLER_process_join(smx_simcall_t simcall, smx_process_t process, double timeout)
+{
+ smx_synchro_t sync = SIMIX_process_join(simcall->issuer, process, timeout);
+ xbt_fifo_push(sync->simcalls, simcall);
+ simcall->issuer->waiting_synchro = sync;
+}
+
+static int SIMIX_process_join_finish(smx_process_exit_status_t status, smx_synchro_t sync){
+ if (sync->sleep.surf_sleep) {
+ surf_action_cancel(sync->sleep.surf_sleep);
+
+ smx_simcall_t simcall;
+ while ((simcall = xbt_fifo_shift(sync->simcalls))) {
+ simcall_process_sleep__set__result(simcall, SIMIX_DONE);
+ simcall->issuer->waiting_synchro = NULL;
+ if (simcall->issuer->suspended) {
+ XBT_DEBUG("Wait! This process is suspended and can't wake up now.");
+ simcall->issuer->suspended = 0;
+ simcall_HANDLER_process_suspend(simcall, simcall->issuer);
+ } else {
+ SIMIX_simcall_answer(simcall);
+ }
+ }
+ surf_action_unref(sync->sleep.surf_sleep);
+ sync->sleep.surf_sleep = NULL;
+ }
+ xbt_mallocator_release(simix_global->synchro_mallocator, sync);
+ return 0;
+}
+
+smx_synchro_t SIMIX_process_join(smx_process_t issuer, smx_process_t process, double timeout)
+{
+ smx_synchro_t res = SIMIX_process_sleep(issuer, timeout);
+ res->type = SIMIX_SYNC_JOIN;
+ SIMIX_process_on_exit(process, (int_f_pvoid_pvoid_t)SIMIX_process_join_finish, res);
+ return res;
+}
+
+void simcall_HANDLER_process_sleep(smx_simcall_t simcall, double duration)
{
if (MC_is_active()) {
MC_process_clock_add(simcall->issuer, duration);
@@
-685,14
+720,14
@@
void SIMIX_pre_process_sleep(smx_simcall_t simcall, double duration)
SIMIX_simcall_answer(simcall);
return;
}
- smx_
action_t action
= SIMIX_process_sleep(simcall->issuer, duration);
- xbt_fifo_push(
action
->simcalls, simcall);
- simcall->issuer->waiting_
action = action
;
+ smx_
synchro_t sync
= SIMIX_process_sleep(simcall->issuer, duration);
+ xbt_fifo_push(
sync
->simcalls, simcall);
+ simcall->issuer->waiting_
synchro = sync
;
}
-smx_
action
_t SIMIX_process_sleep(smx_process_t process, double duration)
+smx_
synchro
_t SIMIX_process_sleep(smx_process_t process, double duration)
{
- smx_
action_t action
;
+ smx_
synchro_t synchro
;
smx_host_t host = process->smx_host;
/* check if the host is active */
@@
-701,33
+736,32
@@
smx_action_t SIMIX_process_sleep(smx_process_t process, double duration)
sg_host_name(host));
}
-
action = xbt_mallocator_get(simix_global->action
_mallocator);
-
action->type = SIMIX_ACTION
_SLEEP;
-
action
->name = NULL;
+
synchro = xbt_mallocator_get(simix_global->synchro
_mallocator);
+
synchro->type = SIMIX_SYNC
_SLEEP;
+
synchro
->name = NULL;
#ifdef HAVE_TRACING
-
action
->category = NULL;
+
synchro
->category = NULL;
#endif
-
action
->sleep.host = host;
-
action
->sleep.surf_sleep =
+
synchro
->sleep.host = host;
+
synchro
->sleep.surf_sleep =
surf_workstation_sleep(host, duration);
- surf_action_set_data(
action->sleep.surf_sleep, action
);
- XBT_DEBUG("Create sleep
action %p", action
);
+ surf_action_set_data(
synchro->sleep.surf_sleep, synchro
);
+ XBT_DEBUG("Create sleep
synchronization %p", synchro
);
- return
action
;
+ return
synchro
;
}
-void SIMIX_post_process_sleep(smx_
action_t action
)
+void SIMIX_post_process_sleep(smx_
synchro_t synchro
)
{
smx_simcall_t simcall;
e_smx_state_t state;
+ xbt_assert(synchro->type == SIMIX_SYNC_SLEEP || synchro->type == SIMIX_SYNC_JOIN);
- xbt_assert(action->type == SIMIX_ACTION_SLEEP);
+ while ((simcall = xbt_fifo_shift(synchro->simcalls))) {
- while ((simcall = xbt_fifo_shift(action->simcalls))) {
-
- switch(surf_action_get_state(action->sleep.surf_sleep)){
+ switch(surf_action_get_state(synchro->sleep.surf_sleep)){
case SURF_ACTION_FAILED:
simcall->issuer->context->iwannadie = 1;
//SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed");
@@
-746,36
+780,46
@@
void SIMIX_post_process_sleep(smx_action_t action)
simcall->issuer->context->iwannadie = 1;
}
simcall_process_sleep__set__result(simcall, state);
- simcall->issuer->waiting_action = NULL;
- SIMIX_simcall_answer(simcall);
-
+ simcall->issuer->waiting_synchro = NULL;
+ if (simcall->issuer->suspended) {
+ XBT_DEBUG("Wait! This process is suspended and can't wake up now.");
+ simcall->issuer->suspended = 0;
+ simcall_HANDLER_process_suspend(simcall, simcall->issuer);
+ } else {
+ SIMIX_simcall_answer(simcall);
+ }
}
- SIMIX_process_sleep_destroy(action);
+
+ SIMIX_process_sleep_destroy(synchro);
}
-void SIMIX_process_sleep_destroy(smx_
action_t action
)
+void SIMIX_process_sleep_destroy(smx_
synchro_t synchro
)
{
- XBT_DEBUG("Destroy
action %p", action
);
- xbt_assert(
action->type == SIMIX_ACTION_SLEEP
);
+ XBT_DEBUG("Destroy
synchro %p", synchro
);
+ xbt_assert(
synchro->type == SIMIX_SYNC_SLEEP || synchro->type == SIMIX_SYNC_JOIN
);
- if (action->sleep.surf_sleep)
- surf_action_unref(action->sleep.surf_sleep);
- xbt_mallocator_release(simix_global->action_mallocator, action);
+ if (synchro->sleep.surf_sleep) {
+ surf_action_unref(synchro->sleep.surf_sleep);
+ synchro->sleep.surf_sleep = NULL;
+ }
+ if (synchro->type == SIMIX_SYNC_SLEEP)
+ xbt_mallocator_release(simix_global->synchro_mallocator, synchro);
}
-void SIMIX_process_sleep_suspend(smx_
action_t action
)
+void SIMIX_process_sleep_suspend(smx_
synchro_t synchro
)
{
- xbt_assert(
action->type == SIMIX_ACTION
_SLEEP);
- surf_action_suspend(
action
->sleep.surf_sleep);
+ xbt_assert(
synchro->type == SIMIX_SYNC
_SLEEP);
+ surf_action_suspend(
synchro
->sleep.surf_sleep);
}
-void SIMIX_process_sleep_resume(smx_
action_t action
)
+void SIMIX_process_sleep_resume(smx_
synchro_t synchro
)
{
- xbt_assert(action->type == SIMIX_ACTION_SLEEP);
- surf_action_resume(action->sleep.surf_sleep);
+ XBT_DEBUG("Synchro state is %d on process_sleep_resume.", synchro->state);
+ xbt_assert(synchro->type == SIMIX_SYNC_SLEEP);
+ surf_action_resume(synchro->sleep.surf_sleep);
}
-/**
+/**
* \brief Calling this function makes the process to yield.
*
* Only the current process can call this function, giving back the control to
@@
-803,10
+847,11
@@
void SIMIX_process_yield(smx_process_t self)
SIMIX_process_stop(self);
}
- if(self->suspended) {
- xbt_assert(!self->doexception, "Gloups! This exception may be lost by subsequent calls.");
+ if (self->suspended) {
+ XBT_DEBUG("Hey! I'm suspended.");
+ xbt_assert(!self->doexception, "Gasp! This exception may be lost by subsequent calls.");
self->suspended = 0;
- SIMIX_process_suspend(self,self);
+ SIMIX_process_suspend(self,
self);
}
if (self->doexception) {
@@
-873,19
+918,15
@@
xbt_dynar_t SIMIX_processes_as_dynar(void) {
void SIMIX_process_on_exit_runall(smx_process_t process) {
s_smx_process_exit_fun_t exit_fun;
-
+ smx_process_exit_status_t exit_status = (process->context->iwannadie) ?
+ SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
while (!xbt_dynar_is_empty(process->on_exit)) {
exit_fun = xbt_dynar_pop_as(process->on_exit,s_smx_process_exit_fun_t);
- (exit_fun.fun)(exit_fun.arg);
+ (exit_fun.fun)(
(void*)exit_status,
exit_fun.arg);
}
}
-void SIMIX_pre_process_on_exit(smx_simcall_t simcall, smx_process_t process,
- int_f_pvoid_t fun, void *data) {
- SIMIX_process_on_exit(process, fun, data);
-}
-
-void SIMIX_process_on_exit(smx_process_t process, int_f_pvoid_t fun, void *data) {
+void SIMIX_process_on_exit(smx_process_t process, int_f_pvoid_pvoid_t fun, void *data) {
xbt_assert(process, "current process not found: are you in maestro context ?");
if (!process->on_exit) {
@@
-897,10
+938,6
@@
void SIMIX_process_on_exit(smx_process_t process, int_f_pvoid_t fun, void *data)
xbt_dynar_push_as(process->on_exit,s_smx_process_exit_fun_t,exit_fun);
}
-void SIMIX_pre_process_auto_restart_set(smx_simcall_t simcall, smx_process_t process,
- int auto_restart) {
- SIMIX_process_auto_restart_set(process, auto_restart);
-}
/**
* \brief Sets the auto-restart status of the process.
* If set to 1, the process will be automatically restarted when its host
@@
-910,8
+947,8
@@
void SIMIX_process_auto_restart_set(smx_process_t process, int auto_restart) {
process->auto_restart = auto_restart;
}
-smx_process_t
SIMIX_pre
_process_restart(smx_simcall_t simcall, smx_process_t process) {
- return SIMIX_process_restart(process, simcall->issuer);
+smx_process_t
simcall_HANDLER
_process_restart(smx_simcall_t simcall, smx_process_t process) {
+ return SIMIX_process_restart(process, simcall->issuer);
}
/**
* \brief Restart a process.
@@
-949,19
+986,19
@@
smx_process_t SIMIX_process_restart(smx_process_t process, smx_process_t issuer)
arg.argc,
arg.argv,
arg.properties,
- arg.auto_restart
);
- }
- else {
+ arg.auto_restart
,
+ NULL);
+
}
else {
simcall_process_create(&new_process,
-
arg.argv[0],
-
arg.code,
-
arg.data,
-
arg.hostname,
-
arg.kill_time,
-
arg.argc,
-
arg.argv,
-
arg.properties,
-
arg.auto_restart);
+ arg.argv[0],
+ arg.code,
+ arg.data,
+ arg.hostname,
+ arg.kill_time,
+ arg.argc,
+ arg.argv,
+ arg.properties,
+ arg.auto_restart);
}
return new_process;