X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/62c250035c2cd177abe31131664a623e4d4416aa..762740361e42dd14f5d24d239a29a1e08895ef64:/src/simix/smx_process.c diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 49df074f35..0e92bfc463 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -41,6 +41,8 @@ void SIMIX_process_empty_trash(void) /* Free the exception allocated at creation time */ if (process->exception) free(process->exception); + if (process->properties) + xbt_dict_free(&process->properties); free(process->name); process->name = NULL; @@ -158,6 +160,10 @@ void SIMIX_process_kill(smx_process_t process) if (process->cond) xbt_swag_remove(process, process->cond->sleeping); + if (process->waiting_action) { + SIMIX_unregister_action_to_condition(process->waiting_action, process->cond); + SIMIX_action_destroy(process->waiting_action); + } SIMIX_context_stop(process->context); } else { DEBUG2("%p here! killing %p", simix_global->current_process, process); @@ -166,8 +172,23 @@ void SIMIX_process_kill(smx_process_t process) if (process->mutex) xbt_swag_remove(process, process->mutex->sleeping); - if (process->cond) + if (process->cond) { xbt_swag_remove(process, process->cond->sleeping); + + if (process->waiting_action) { + SIMIX_unregister_action_to_condition(process->waiting_action, process->cond); + SIMIX_action_destroy(process->waiting_action); + } + } + + if (process->sem) { + xbt_swag_remove(process, process->sem->sleeping); + + if (process->waiting_action) { + SIMIX_unregister_action_to_semaphore(process->waiting_action, process->sem); + SIMIX_action_destroy(process->waiting_action); + } + } } } @@ -178,7 +199,7 @@ void SIMIX_process_kill(smx_process_t process) * \param process SIMIX process * \return A void pointer to the user data */ -void *SIMIX_process_get_data(smx_process_t process) +XBT_INLINE void *SIMIX_process_get_data(smx_process_t process) { xbt_assert0((process != NULL), "Invalid parameters"); return (process->data); @@ -191,7 +212,7 @@ void *SIMIX_process_get_data(smx_process_t process) * \param process SIMIX process * \param data User data */ -void SIMIX_process_set_data(smx_process_t process, void *data) +XBT_INLINE void SIMIX_process_set_data(smx_process_t process, void *data) { xbt_assert0((process != NULL), "Invalid parameters"); @@ -206,7 +227,7 @@ void SIMIX_process_set_data(smx_process_t process, void *data) * \param process SIMIX process * \return SIMIX host */ -smx_host_t SIMIX_process_get_host(smx_process_t process) +XBT_INLINE smx_host_t SIMIX_process_get_host(smx_process_t process) { xbt_assert0((process != NULL), "Invalid parameters"); return (process->smx_host); @@ -219,7 +240,7 @@ smx_host_t SIMIX_process_get_host(smx_process_t process) * \param process SIMIX process * \return The process name */ -const char *SIMIX_process_get_name(smx_process_t process) +XBT_INLINE const char *SIMIX_process_get_name(smx_process_t process) { xbt_assert0((process != NULL), "Invalid parameters"); return (process->name); @@ -232,7 +253,7 @@ const char *SIMIX_process_get_name(smx_process_t process) * \param process SIMIX process * \param name The new process name */ -void SIMIX_process_set_name(smx_process_t process, char *name) +XBT_INLINE void SIMIX_process_set_name(smx_process_t process, char *name) { xbt_assert0((process != NULL), "Invalid parameters"); process->name = name; @@ -243,7 +264,7 @@ void SIMIX_process_set_name(smx_process_t process, char *name) * * This functions returns the properties associated with this process */ -xbt_dict_t SIMIX_process_get_properties(smx_process_t process) +XBT_INLINE xbt_dict_t SIMIX_process_get_properties(smx_process_t process) { return process->properties; } @@ -254,7 +275,7 @@ xbt_dict_t SIMIX_process_get_properties(smx_process_t process) * This functions returns the currently running #smx_process_t. * \return The SIMIX process */ -smx_process_t SIMIX_process_self(void) +XBT_INLINE smx_process_t SIMIX_process_self(void) { return simix_global ? simix_global->current_process : NULL; } @@ -301,9 +322,11 @@ void SIMIX_process_suspend(smx_process_t process) cond = SIMIX_cond_init(); dummy = SIMIX_action_execute(SIMIX_process_get_host(process), name, 0); + SIMIX_process_self()->waiting_action = dummy; surf_workstation_model->suspend(dummy->surf_action); SIMIX_register_action_to_condition(dummy, cond); __SIMIX_cond_wait(cond); + SIMIX_process_self()->waiting_action = NULL; SIMIX_unregister_action_to_condition(dummy, cond); SIMIX_action_destroy(dummy); SIMIX_cond_destroy(cond); @@ -371,7 +394,7 @@ void SIMIX_process_change_host(smx_process_t process, char *source, * \param process SIMIX process * \return 1, if the process is suspended, else 0. */ -int SIMIX_process_is_suspended(smx_process_t process) +XBT_INLINE int SIMIX_process_is_suspended(smx_process_t process) { xbt_assert0((process != NULL), "Invalid parameters"); @@ -383,7 +406,7 @@ int SIMIX_process_is_suspended(smx_process_t process) * * Maestro internal process is not counted, only user code processes are */ -int SIMIX_process_count() +XBT_INLINE int SIMIX_process_count() { return xbt_swag_size(simix_global->process_list); } @@ -401,7 +424,7 @@ void SIMIX_process_yield(void) DEBUG1("Yield process '%s'", simix_global->current_process->name); xbt_assert0((simix_global->current_process != simix_global->maestro_process), - "You are not supposed to run this function here!"); + "You are not supposed to run this function in maestro context!"); SIMIX_context_suspend(simix_global->current_process->context); @@ -421,6 +444,7 @@ void SIMIX_process_schedule(smx_process_t new_process) /* schedule the context */ SIMIX_context_resume(old_process->context, new_process->context); + DEBUG1("Resumed from scheduling context: '%s'", new_process->name); /* restore the current process to the previously saved process */ simix_global->current_process = old_process;