-/* Copyright (c) 2007-2014. The SimGrid Team.
+/* Copyright (c) 2007-2015. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_synchro, simix,
"SIMIX Synchronization (mutex, semaphores and conditions)");
-static smx_synchro_t SIMIX_synchro_wait(smx_host_t smx_host, double timeout);
+static smx_synchro_t SIMIX_synchro_wait(sg_host_t smx_host, double timeout);
static void SIMIX_synchro_finish(smx_synchro_t synchro);
static void _SIMIX_cond_wait(smx_cond_t cond, smx_mutex_t mutex, double timeout,
smx_process_t issuer, smx_simcall_t simcall);
/***************************** Raw synchronization *********************************/
-static smx_synchro_t SIMIX_synchro_wait(smx_host_t smx_host, double timeout)
+static smx_synchro_t SIMIX_synchro_wait(sg_host_t smx_host, double timeout)
{
XBT_IN("(%p, %f)",smx_host,timeout);
sync = xbt_mallocator_get(simix_global->synchro_mallocator);
sync->type = SIMIX_SYNC_SYNCHRO;
sync->name = xbt_strdup("synchro");
- sync->synchro.sleep =
- surf_workstation_sleep(smx_host, timeout);
+ sync->synchro.sleep = surf_host_sleep(smx_host, timeout);
surf_action_set_data(sync->synchro.sleep, sync);
XBT_OUT();
if (mutex->locked) {
/* FIXME: check if the host is active ? */
/* Somebody using the mutex, use a synchronization to get host failures */
- synchro = SIMIX_synchro_wait(process->smx_host, -1);
+ synchro = SIMIX_synchro_wait(process->host, -1);
xbt_fifo_push(synchro->simcalls, simcall);
simcall->issuer->waiting_synchro = synchro;
xbt_swag_insert(simcall->issuer, mutex->sleeping);
XBT_OUT();
}
+int simcall_HANDLER_mutex_trylock(smx_simcall_t simcall, smx_mutex_t mutex){
+ return SIMIX_mutex_trylock(mutex, simcall->issuer);
+}
/**
* \brief Tries to lock a mutex.
*
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){
- XBT_OUT();
- return;
- }
+ /* If the mutex is not owned by the issuer, that's not good */
+ if (issuer != mutex->owner)
+ THROWF(mismatch_error, 0, "Cannot release that mutex: it was locked by %s (pid:%d), not by you.",
+ SIMIX_process_get_name(mutex->owner),SIMIX_process_get_PID(mutex->owner));
if (xbt_swag_size(mutex->sleeping) > 0) {
p = xbt_swag_extract(mutex->sleeping);
XBT_OUT();
}
-void simcall_HANDLER_mutex_destroy(smx_simcall_t simcall, smx_mutex_t mutex){
- SIMIX_mutex_destroy(mutex);
-}
/**
* \brief Destroys a mutex.
*
/********************************* Condition **********************************/
-smx_cond_t simcall_HANDLER_cond_init(smx_simcall_t simcall){
- return SIMIX_cond_init();
-}
/**
* \brief Initialize a condition.
*
SIMIX_mutex_unlock(mutex, issuer);
}
- synchro = SIMIX_synchro_wait(issuer->smx_host, timeout);
+ synchro = SIMIX_synchro_wait(issuer->host, timeout);
xbt_fifo_unshift(synchro->simcalls, simcall);
issuer->waiting_synchro = synchro;
xbt_swag_insert(simcall->issuer, cond->sleeping);
XBT_OUT();
}
-void simcall_HANDLER_cond_signal(smx_simcall_t simcall, smx_cond_t cond){
- SIMIX_cond_signal(cond);
-}
/**
* \brief Signalizes a condition.
*
XBT_OUT();
}
-void simcall_HANDLER_cond_broadcast(smx_simcall_t simcall, smx_cond_t cond){
- SIMIX_cond_broadcast(cond);
-}
/**
* \brief Broadcasts a condition.
*
XBT_OUT();
}
-void simcall_HANDLER_cond_destroy(smx_simcall_t simcall, smx_cond_t cond){
- SIMIX_cond_destroy(cond);
-}
/**
- * \brief Destroys a contidion.
+ * \brief Destroys a condition.
*
* Destroys and frees the condition's memory.
* \param cond A condition
/******************************** Semaphores **********************************/
#define SMX_SEM_NOLIMIT 99999
-smx_sem_t simcall_HANDLER_sem_init(smx_simcall_t simcall, unsigned int value){
- return SIMIX_sem_init(value);
-}
/** @brief Initialize a semaphore */
smx_sem_t SIMIX_sem_init(unsigned int value)
{
return sem;
}
-void simcall_HANDLER_sem_destroy(smx_simcall_t simcall, smx_sem_t sem){
- SIMIX_sem_destroy(sem);
-}
/** @brief Destroys a semaphore */
void SIMIX_sem_destroy(smx_sem_t sem)
{
XBT_DEBUG("Wait semaphore %p (timeout:%f)", sem, timeout);
if (sem->value <= 0) {
- synchro = SIMIX_synchro_wait(issuer->smx_host, timeout);
+ synchro = SIMIX_synchro_wait(issuer->host, timeout);
xbt_fifo_unshift(synchro->simcalls, simcall);
issuer->waiting_synchro = synchro;
xbt_swag_insert(issuer, sem->sleeping);