/* Mailboxes in MSG */
-/* Copyright (c) 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
msg_task_t MSG_mailbox_get_head(msg_mailbox_t mailbox)
{
- smx_action_t comm = simcall_rdv_get_head(mailbox);
+ smx_synchro_t comm = simcall_rdv_get_head(mailbox);
if (!comm)
return NULL;
/** \ingroup msg_mailbox_management
* \brief Set the mailbox to receive in asynchronous mode
*
- * All messages sent to this mailbox will be transferred to
- * the receiver without waiting for the receive call.
+ * All messages sent to this mailbox will be transferred to
+ * the receiver without waiting for the receive call.
* The receive call will still be necessary to use the received data.
- * If there is a need to receive some messages asynchronously, and some not,
+ * If there is a need to receive some messages asynchronously, and some not,
* two different mailboxes should be used.
*
- * \param alias The name of the mailbox
+ * \param alias The name of the mailbox
*/
void MSG_mailbox_set_async(const char *alias){
msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias);
* #MSG_HOST_FAILURE, or #MSG_TRANSFER_FAILURE otherwise.
*/
msg_error_t
-MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, msg_task_t * task,
+MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, msg_task_t *task,
msg_host_t host, double timeout)
{
- xbt_ex_t e;
- msg_error_t ret = MSG_OK;
- /* We no longer support getting a task from a specific host */
- if (host)
- THROW_UNIMPLEMENTED;
-
-#ifdef HAVE_TRACING
- TRACE_msg_task_get_start();
- double start_time = MSG_get_clock();
-#endif
-
- /* Sanity check */
- xbt_assert(task, "Null pointer for the task storage");
-
- if (*task)
- XBT_WARN
- ("Asked to write the received task in a non empty struct -- proceeding.");
-
- /* Try to receive it by calling SIMIX network layer */
- TRY {
- simcall_comm_recv(mailbox, task, NULL, NULL, NULL, timeout);
- XBT_DEBUG("Got task %s from %p",(*task)->name,mailbox);
- (*task)->simdata->isused=0;
- }
- CATCH(e) {
- switch (e.category) {
- case cancel_error:
- ret = MSG_HOST_FAILURE;
- break;
- case network_error:
- ret = MSG_TRANSFER_FAILURE;
- break;
- case timeout_error:
- ret = MSG_TIMEOUT;
- break;
- default:
- RETHROW;
- }
- xbt_ex_free(e);
- }
-
-#ifdef HAVE_TRACING
- if (ret != MSG_HOST_FAILURE &&
- ret != MSG_TRANSFER_FAILURE &&
- ret != MSG_TIMEOUT) {
- TRACE_msg_task_get_end(start_time, *task);
- }
-#endif
- MSG_RETURN(ret);
+ return MSG_mailbox_get_task_ext_bounded(mailbox, task, host, timeout, -1.0);
}
/** \ingroup msg_mailbox_management
*/
msg_error_t
MSG_mailbox_get_task_ext_bounded(msg_mailbox_t mailbox, msg_task_t * task,
- msg_host_t host, double timeout, double rate)
+ msg_host_t host, double timeout, double rate)
{
xbt_ex_t e;
msg_error_t ret = MSG_OK;
/* Try to receive it by calling SIMIX network layer */
TRY {
- simcall_comm_recv_bounded(mailbox, task, NULL, NULL, NULL, timeout, rate);
+ simcall_comm_recv(mailbox, task, NULL, NULL, NULL, NULL, timeout, rate);
XBT_DEBUG("Got task %s from %p",(*task)->name,mailbox);
- (*task)->simdata->isused=0;
+ if (msg_global->debug_multiple_use && (*task)->simdata->isused!=0)
+ xbt_ex_free(*(xbt_ex_t*)(*task)->simdata->isused);
+ (*task)->simdata->isused = 0;
}
CATCH(e) {
switch (e.category) {
MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, msg_task_t task,
double timeout)
{
- xbt_ex_t e;
msg_error_t ret = MSG_OK;
simdata_task_t t_simdata = NULL;
msg_process_t process = MSG_process_self();
t_simdata->sender = process;
t_simdata->source = ((simdata_process_t) SIMIX_process_self_get_data(process))->m_host;
- xbt_assert(t_simdata->isused == 0,
- "This task is still being used somewhere else. You cannot send it now. Go fix your code!");
+ if (t_simdata->isused != 0) {
+ if (msg_global->debug_multiple_use){
+ XBT_ERROR("This task is already used in there:");
+ xbt_backtrace_display(t_simdata->isused);
+ XBT_ERROR("And you try to reuse it from here:");
+ xbt_backtrace_display_current();
+ } else {
+ xbt_assert(t_simdata->isused == 0,
+ "This task is still being used somewhere else. You cannot send it now. Go fix your code! (use --cfg=msg/debug_multiple_use:on to get the backtrace of the other process)");
+ }
+ }
- t_simdata->isused=1;
+ if (msg_global->debug_multiple_use)
+ MSG_BT(t_simdata->isused, "Using Backtrace");
+ else
+ t_simdata->isused = (void*)1;
t_simdata->comm = NULL;
msg_global->sent_msg++;
p_simdata->waiting_task = task;
+ xbt_ex_t e;
/* Try to send it by calling SIMIX network layer */
TRY {
- smx_action_t comm = simcall_comm_isend(mailbox, t_simdata->message_size,
+ smx_synchro_t comm = NULL; /* MC needs the comm to be set to NULL during the simix call */
+ comm = simcall_comm_isend(SIMIX_process_self(), mailbox,t_simdata->message_size,
t_simdata->rate, task, sizeof(void *),
- NULL, NULL, task, 0);
+ NULL, NULL, NULL, task, 0);
#ifdef HAVE_TRACING
if (TRACE_is_enabled()) {
simcall_set_category(comm, task->category);
xbt_ex_free(e);
/* If the send failed, it is not used anymore */
+ if (msg_global->debug_multiple_use && t_simdata->isused!=0)
+ xbt_ex_free(*(xbt_ex_t*)t_simdata->isused);
t_simdata->isused = 0;
}
&& (channel < msg_global->max_channel), "Invalid channel %d",
channel);
- return host->mailboxes[(size_t) channel];
+ return MSG_host_priv(host)->mailboxes[(size_t) channel];
}
#endif