- e_surf_action_state_t state = SURF_ACTION_NOT_IN_THE_SYSTEM;
- m_process_t process = MSG_process_self();
- m_task_t dummy = NULL;
- simdata_task_t simdata = NULL;
-
- xbt_assert1(nb_sec>=0,"Invalid duration %g",nb_sec);
-
- CHECK_HOST();
- dummy = MSG_task_create("MSG_sleep", nb_sec, 0.0, NULL);
- simdata = dummy->simdata;
-
- simdata->compute = surf_workstation_resource->extension_public->
- sleep(MSG_process_get_host(process)->simdata->host,
- simdata->computation_amount);
- surf_workstation_resource->common_public->action_set_data(simdata->compute,dummy);
-
-
- simdata->using++;
- do {
- __MSG_task_wait_event(process, dummy);
- state=surf_workstation_resource->common_public->action_get_state(simdata->compute);
- } while (state==SURF_ACTION_RUNNING);
- simdata->using--;
-
- if(state == SURF_ACTION_DONE) {
- if(surf_workstation_resource->extension_public->
- get_state(MSG_process_get_host(process)->simdata->host)
- == SURF_CPU_OFF) {
- if(surf_workstation_resource->common_public->action_free(simdata->compute))
- simdata->compute = NULL;
- MSG_RETURN(MSG_HOST_FAILURE);
- }
- if(__MSG_process_isBlocked(process)) {
- __MSG_process_unblock(MSG_process_self());
- }
- if(surf_workstation_resource->extension_public->
- get_state(MSG_process_get_host(process)->simdata->host)
- == SURF_CPU_OFF) {
- if(surf_workstation_resource->common_public->action_free(simdata->compute))
- simdata->compute = NULL;
+ smx_action_t act_sleep;
+ m_process_t proc = MSG_process_self();
+ smx_mutex_t mutex;
+ smx_cond_t cond;
+ /* create action to sleep */
+ act_sleep =
+ SIMIX_action_sleep(SIMIX_process_get_host(proc->simdata->s_process),
+ nb_sec);
+
+ mutex = SIMIX_mutex_init();
+ SIMIX_mutex_lock(mutex);
+ /* create conditional and register action to it */
+ cond = SIMIX_cond_init();
+
+ SIMIX_register_action_to_condition(act_sleep, cond);
+ SIMIX_cond_wait(cond, mutex);
+ SIMIX_unregister_action_to_condition(act_sleep, cond);
+ SIMIX_mutex_unlock(mutex);
+
+ /* remove variables */
+ SIMIX_cond_destroy(cond);
+ SIMIX_mutex_destroy(mutex);
+
+ if (SIMIX_action_get_state(act_sleep) == SURF_ACTION_DONE) {
+ if (SIMIX_host_get_state(SIMIX_host_self()) == SURF_CPU_OFF) {
+ SIMIX_action_destroy(act_sleep);