X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0ca1291c2f63ca6235f4b4885c48413a900aade4..53cde8dfb94134348e908b3c2845200ffc582dc7:/src/simix/smx_synchro.c diff --git a/src/simix/smx_synchro.c b/src/simix/smx_synchro.c index aed9f50d2f..c9af7b95a8 100644 --- a/src/simix/smx_synchro.c +++ b/src/simix/smx_synchro.c @@ -4,7 +4,7 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "private.h" +#include "smx_private.h" #include "xbt/log.h" @@ -14,15 +14,15 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_synchro, simix, static smx_action_t SIMIX_synchro_wait(smx_host_t smx_host, double timeout); static void SIMIX_synchro_finish(smx_action_t action); static void _SIMIX_cond_wait(smx_cond_t cond, smx_mutex_t mutex, double timeout, - smx_process_t issuer, smx_req_t req); + smx_process_t issuer, smx_simcall_t simcall); static void _SIMIX_sem_wait(smx_sem_t sem, double timeout, smx_process_t issuer, - smx_req_t req); -static void SIMIX_sem_block_onto(smx_sem_t sem); + smx_simcall_t simcall); /***************************** Synchro action *********************************/ static smx_action_t SIMIX_synchro_wait(smx_host_t smx_host, double timeout) { + XBT_IN("(%p, %f)",smx_host,timeout); smx_action_t action; action = xbt_mallocator_get(simix_global->action_mallocator); action->type = SIMIX_ACTION_SYNCHRO; @@ -31,76 +31,76 @@ static smx_action_t SIMIX_synchro_wait(smx_host_t smx_host, double timeout) surf_workstation_model->extension.workstation.sleep(smx_host->host, timeout); surf_workstation_model->action_data_set(action->synchro.sleep, action); + XBT_OUT(); return action; } -void SIMIX_synchro_stop_waiting(smx_process_t process, smx_req_t req) +void SIMIX_synchro_stop_waiting(smx_process_t process, smx_simcall_t simcall) { - switch (req->call) { + XBT_IN("(%p, %p)",process,simcall); + switch (simcall->call) { - case REQ_MUTEX_LOCK: - xbt_swag_remove(process, req->mutex_lock.mutex->sleeping); + case SIMCALL_MUTEX_LOCK: + xbt_swag_remove(process, simcall->mutex_lock.mutex->sleeping); break; - case REQ_COND_WAIT: - xbt_swag_remove(process, req->cond_wait.cond->sleeping); + case SIMCALL_COND_WAIT: + xbt_swag_remove(process, simcall->cond_wait.cond->sleeping); break; - case REQ_COND_WAIT_TIMEOUT: - xbt_swag_remove(process, req->cond_wait_timeout.cond->sleeping); + case SIMCALL_COND_WAIT_TIMEOUT: + xbt_swag_remove(process, simcall->cond_wait_timeout.cond->sleeping); break; - case REQ_SEM_ACQUIRE: - xbt_swag_remove(process, req->sem_acquire.sem->sleeping); + case SIMCALL_SEM_ACQUIRE: + xbt_swag_remove(process, simcall->sem_acquire.sem->sleeping); break; - case REQ_SEM_ACQUIRE_TIMEOUT: - xbt_swag_remove(process, req->sem_acquire_timeout.sem->sleeping); + case SIMCALL_SEM_ACQUIRE_TIMEOUT: + xbt_swag_remove(process, simcall->sem_acquire_timeout.sem->sleeping); break; default: THROW_IMPOSSIBLE; } + XBT_OUT(); } void SIMIX_synchro_destroy(smx_action_t action) { + XBT_IN("(%p)",action); XBT_DEBUG("Destroying synchro %p", action); action->synchro.sleep->model_type->action_unref(action->synchro.sleep); xbt_free(action->name); xbt_mallocator_release(simix_global->action_mallocator, action); + XBT_OUT(); } void SIMIX_post_synchro(smx_action_t action) { + XBT_IN("(%p)",action); if (surf_workstation_model->action_state_get(action->synchro.sleep) == SURF_ACTION_FAILED) action->state = SIMIX_FAILED; else if(surf_workstation_model->action_state_get(action->synchro.sleep) == SURF_ACTION_DONE) action->state = SIMIX_SRC_TIMEOUT; SIMIX_synchro_finish(action); + XBT_OUT(); } static void SIMIX_synchro_finish(smx_action_t action) { - smx_req_t req = xbt_fifo_shift(action->request_list); + XBT_IN("(%p)",action); + smx_simcall_t simcall = xbt_fifo_shift(action->simcalls); switch (action->state) { case SIMIX_SRC_TIMEOUT: - TRY { - THROWF(timeout_error, 0, "Synchro's wait timeout"); - } CATCH(req->issuer->running_ctx->exception) { - req->issuer->doexception = 1; - } + SMX_EXCEPTION(simcall->issuer, timeout_error, 0, "Synchro's wait timeout"); break; case SIMIX_FAILED: - TRY { - THROWF(host_error, 0, "Host failed"); - } CATCH(req->issuer->running_ctx->exception) { - req->issuer->doexception = 1; - } + SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed"); break; default: @@ -108,9 +108,10 @@ static void SIMIX_synchro_finish(smx_action_t action) break; } - SIMIX_synchro_stop_waiting(req->issuer, req); + SIMIX_synchro_stop_waiting(simcall->issuer, simcall); SIMIX_synchro_destroy(action); - SIMIX_request_answer(req); + SIMIX_simcall_answer(simcall); + XBT_OUT(); } /*********************************** Mutex ************************************/ @@ -122,38 +123,42 @@ static void SIMIX_synchro_finish(smx_action_t action) */ smx_mutex_t SIMIX_mutex_init(void) { + XBT_IN("()"); s_smx_process_t p; /* useful to initialize sleeping swag */ smx_mutex_t mutex = xbt_new0(s_smx_mutex_t, 1); mutex->locked = 0; mutex->sleeping = xbt_swag_new(xbt_swag_offset(p, synchro_hookup)); + XBT_OUT(); return mutex; } /** - * \brief Handle mutex lock request - * \param req The request + * \brief Handles a mutex lock simcall. + * \param simcall the simcall */ -void SIMIX_pre_mutex_lock(smx_req_t req) +void SIMIX_pre_mutex_lock(smx_simcall_t simcall) { + XBT_IN("(%p)",simcall); /* FIXME: check where to validate the arguments */ smx_action_t sync_act = NULL; - smx_mutex_t mutex = req->mutex_lock.mutex; - smx_process_t process = req->issuer; + smx_mutex_t mutex = simcall->mutex_lock.mutex; + smx_process_t process = simcall->issuer; if (mutex->locked) { /* FIXME: check if the host is active ? */ /* Somebody using the mutex, use a synchro action to get host failures */ sync_act = SIMIX_synchro_wait(process->smx_host, -1); - xbt_fifo_push(sync_act->request_list, req); - req->issuer->waiting_action = sync_act; - xbt_swag_insert(req->issuer, mutex->sleeping); + xbt_fifo_push(sync_act->simcalls, simcall); + simcall->issuer->waiting_action = sync_act; + xbt_swag_insert(simcall->issuer, mutex->sleeping); } else { /* mutex free */ mutex->locked = 1; - mutex->owner = req->issuer; - SIMIX_request_answer(req); + mutex->owner = simcall->issuer; + SIMIX_simcall_answer(simcall); } + XBT_OUT(); } /** @@ -167,11 +172,15 @@ void SIMIX_pre_mutex_lock(smx_req_t req) */ int SIMIX_mutex_trylock(smx_mutex_t mutex, smx_process_t issuer) { - if (mutex->locked) - return 0; + XBT_IN("(%p, %p)",mutex,issuer); + if (mutex->locked){ + XBT_OUT(); + return 0; + } mutex->locked = 1; mutex->owner = issuer; + XBT_OUT(); return 1; } @@ -186,23 +195,27 @@ int SIMIX_mutex_trylock(smx_mutex_t mutex, smx_process_t issuer) */ void SIMIX_mutex_unlock(smx_mutex_t mutex, smx_process_t issuer) { + XBT_IN("(%p, %p)",mutex,issuer); smx_process_t p; /*process to wake up */ /* If the mutex is not owned by the issuer do nothing */ - if (issuer != mutex->owner) - return; + if (issuer != mutex->owner){ + XBT_OUT(); + return; + } if (xbt_swag_size(mutex->sleeping) > 0) { p = xbt_swag_extract(mutex->sleeping); SIMIX_synchro_destroy(p->waiting_action); p->waiting_action = NULL; mutex->owner = p; - SIMIX_request_answer(&p->request); + SIMIX_simcall_answer(&p->simcall); } else { /* nobody to wake up */ mutex->locked = 0; mutex->owner = NULL; } + XBT_OUT(); } /** @@ -213,10 +226,12 @@ void SIMIX_mutex_unlock(smx_mutex_t mutex, smx_process_t issuer) */ void SIMIX_mutex_destroy(smx_mutex_t mutex) { + XBT_IN("(%p)",mutex); if (mutex){ xbt_swag_free(mutex->sleeping); xbt_free(mutex); } + XBT_OUT(); } /********************************* Condition **********************************/ @@ -230,44 +245,51 @@ void SIMIX_mutex_destroy(smx_mutex_t mutex) */ smx_cond_t SIMIX_cond_init() { + XBT_IN("()"); s_smx_process_t p; smx_cond_t cond = xbt_new0(s_smx_cond_t, 1); cond->sleeping = xbt_swag_new(xbt_swag_offset(p, synchro_hookup)); cond->mutex = NULL; + XBT_OUT(); return cond; } /** - * \brief Handle condition waiting requests without timeouts - * \param The request + * \brief Handle a condition waiting simcall without timeouts + * \param simcall the simcall */ -void SIMIX_pre_cond_wait(smx_req_t req) +void SIMIX_pre_cond_wait(smx_simcall_t simcall) { - smx_process_t issuer = req->issuer; - smx_cond_t cond = req->cond_wait.cond; - smx_mutex_t mutex = req->cond_wait.mutex; + XBT_IN("(%p)",simcall); + smx_process_t issuer = simcall->issuer; + smx_cond_t cond = simcall->cond_wait.cond; + smx_mutex_t mutex = simcall->cond_wait.mutex; - _SIMIX_cond_wait(cond, mutex, -1, issuer, req); + _SIMIX_cond_wait(cond, mutex, -1, issuer, simcall); + XBT_OUT(); } /** - * \brief Handle condition waiting requests with timeouts - * \param The request + * \brief Handle a condition waiting simcall with timeouts + * \param simcall the simcall */ -void SIMIX_pre_cond_wait_timeout(smx_req_t req) +void SIMIX_pre_cond_wait_timeout(smx_simcall_t simcall) { - smx_process_t issuer = req->issuer; - smx_cond_t cond = req->cond_wait_timeout.cond; - smx_mutex_t mutex = req->cond_wait_timeout.mutex; - double timeout = req->cond_wait_timeout.timeout; - - _SIMIX_cond_wait(cond, mutex, timeout, issuer, req); + XBT_IN("(%p)",simcall); + smx_process_t issuer = simcall->issuer; + smx_cond_t cond = simcall->cond_wait_timeout.cond; + smx_mutex_t mutex = simcall->cond_wait_timeout.mutex; + double timeout = simcall->cond_wait_timeout.timeout; + + _SIMIX_cond_wait(cond, mutex, timeout, issuer, simcall); + XBT_OUT(); } static void _SIMIX_cond_wait(smx_cond_t cond, smx_mutex_t mutex, double timeout, - smx_process_t issuer, smx_req_t req) + smx_process_t issuer, smx_simcall_t simcall) { + XBT_IN("(%p, %p, %f, %p,%p)",cond,mutex,timeout,issuer,simcall); smx_action_t sync_act = NULL; XBT_DEBUG("Wait condition %p", cond); @@ -280,9 +302,10 @@ static void _SIMIX_cond_wait(smx_cond_t cond, smx_mutex_t mutex, double timeout, } sync_act = SIMIX_synchro_wait(issuer->smx_host, timeout); - xbt_fifo_unshift(sync_act->request_list, req); + xbt_fifo_unshift(sync_act->simcalls, simcall); issuer->waiting_action = sync_act; - xbt_swag_insert(req->issuer, cond->sleeping); + xbt_swag_insert(simcall->issuer, cond->sleeping); + XBT_OUT(); } /** @@ -294,9 +317,10 @@ static void _SIMIX_cond_wait(smx_cond_t cond, smx_mutex_t mutex, double timeout, */ void SIMIX_cond_signal(smx_cond_t cond) { + XBT_IN("(%p)",cond); smx_process_t proc = NULL; smx_mutex_t mutex = NULL; - smx_req_t req = NULL; + smx_simcall_t simcall = NULL; XBT_DEBUG("Signal condition %p", cond); @@ -308,18 +332,19 @@ void SIMIX_cond_signal(smx_cond_t cond) SIMIX_synchro_destroy(proc->waiting_action); proc->waiting_action = NULL; - /* Now transform the cond wait request into a mutex lock one */ - req = &proc->request; - if(req->call == REQ_COND_WAIT) - mutex = req->cond_wait.mutex; + /* Now transform the cond wait simcall into a mutex lock one */ + simcall = &proc->simcall; + if(simcall->call == SIMCALL_COND_WAIT) + mutex = simcall->cond_wait.mutex; else - mutex = req->cond_wait_timeout.mutex; + mutex = simcall->cond_wait_timeout.mutex; - req->call = REQ_MUTEX_LOCK; - req->mutex_lock.mutex = mutex; + simcall->call = SIMCALL_MUTEX_LOCK; + simcall->mutex_lock.mutex = mutex; - SIMIX_pre_mutex_lock(req); + SIMIX_pre_mutex_lock(simcall); } + XBT_OUT(); } /** @@ -331,12 +356,14 @@ void SIMIX_cond_signal(smx_cond_t cond) */ void SIMIX_cond_broadcast(smx_cond_t cond) { + XBT_IN("(%p)",cond); XBT_DEBUG("Broadcast condition %p", cond); /* Signal the condition until nobody is waiting on it */ while (xbt_swag_size(cond->sleeping)) { SIMIX_cond_signal(cond); } + XBT_OUT(); } /** @@ -347,6 +374,7 @@ void SIMIX_cond_broadcast(smx_cond_t cond) */ void SIMIX_cond_destroy(smx_cond_t cond) { + XBT_IN("(%p)",cond); XBT_DEBUG("Destroy condition %p", cond); if (cond != NULL) { @@ -356,6 +384,7 @@ void SIMIX_cond_destroy(smx_cond_t cond) xbt_swag_free(cond->sleeping); xbt_free(cond); } + XBT_OUT(); } /******************************** Semaphores **********************************/ @@ -363,17 +392,20 @@ void SIMIX_cond_destroy(smx_cond_t cond) /** @brief Initialize a semaphore */ smx_sem_t SIMIX_sem_init(unsigned int value) { + XBT_IN("(%u)",value); s_smx_process_t p; smx_sem_t sem = xbt_new0(s_smx_sem_t, 1); sem->sleeping = xbt_swag_new(xbt_swag_offset(p, synchro_hookup)); sem->value = value; + XBT_OUT(); return sem; } /** @brief Destroys a semaphore */ void SIMIX_sem_destroy(smx_sem_t sem) { + XBT_IN("(%p)",sem); XBT_DEBUG("Destroy semaphore %p", sem); if (sem != NULL) { xbt_assert(xbt_swag_size(sem->sleeping) == 0, @@ -381,6 +413,7 @@ void SIMIX_sem_destroy(smx_sem_t sem) xbt_swag_free(sem->sleeping); xbt_free(sem); } + XBT_OUT(); } /** @brief release the semaphore @@ -390,6 +423,7 @@ void SIMIX_sem_destroy(smx_sem_t sem) */ void SIMIX_sem_release(smx_sem_t sem) { + XBT_IN("(%p)",sem); smx_process_t proc; XBT_DEBUG("Sem release semaphore %p", sem); @@ -397,54 +431,67 @@ void SIMIX_sem_release(smx_sem_t sem) proc = xbt_swag_extract(sem->sleeping); SIMIX_synchro_destroy(proc->waiting_action); proc->waiting_action = NULL; - SIMIX_request_answer(&proc->request); + SIMIX_simcall_answer(&proc->simcall); } else if (sem->value < SMX_SEM_NOLIMIT) { sem->value++; } + XBT_OUT(); } /** @brief Returns true if acquiring this semaphore would block */ XBT_INLINE int SIMIX_sem_would_block(smx_sem_t sem) { + XBT_IN("(%p)",sem); + XBT_OUT(); return (sem->value <= 0); } /** @brief Returns the current capacity of the semaphore */ int SIMIX_sem_get_capacity(smx_sem_t sem) { + XBT_IN("(%p)",sem); + XBT_OUT(); return sem->value; } static void _SIMIX_sem_wait(smx_sem_t sem, double timeout, smx_process_t issuer, - smx_req_t req) + smx_simcall_t simcall) { + XBT_IN("(%p, %f, %p, %p)",sem,timeout,issuer,simcall); smx_action_t sync_act = NULL; XBT_DEBUG("Wait semaphore %p (timeout:%f)", sem, timeout); if (sem->value <= 0) { sync_act = SIMIX_synchro_wait(issuer->smx_host, timeout); - xbt_fifo_unshift(sync_act->request_list, req); + xbt_fifo_unshift(sync_act->simcalls, simcall); issuer->waiting_action = sync_act; xbt_swag_insert(issuer, sem->sleeping); } else { sem->value--; - SIMIX_request_answer(req); + SIMIX_simcall_answer(simcall); } + XBT_OUT(); } /** - * \brief Handle sem acquire requests without timeouts + * \brief Handles a sem acquire simcall without timeout. + * \param simcall the simcall */ -void SIMIX_pre_sem_acquire(smx_req_t req) +void SIMIX_pre_sem_acquire(smx_simcall_t simcall) { - _SIMIX_sem_wait(req->sem_acquire.sem, -1, req->issuer, req); + XBT_IN("(%p)",simcall); + _SIMIX_sem_wait(simcall->sem_acquire.sem, -1, simcall->issuer, simcall); + XBT_OUT(); } /** - * \brief Handle sem acquire requests with timeouts + * \brief Handles a sem acquire simcall with timeout. + * \param simcall the simcall */ -void SIMIX_pre_sem_acquire_timeout(smx_req_t req) +void SIMIX_pre_sem_acquire_timeout(smx_simcall_t simcall) { - _SIMIX_sem_wait(req->sem_acquire_timeout.sem, - req->sem_acquire_timeout.timeout, req->issuer, req); + XBT_IN("(%p)",simcall); + _SIMIX_sem_wait(simcall->sem_acquire_timeout.sem, + simcall->sem_acquire_timeout.timeout, simcall->issuer, simcall); + XBT_OUT(); }