-/* 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);
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_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);
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_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);