From c861b15010ab22b3a4b7b7762929433f6d8b47ff Mon Sep 17 00:00:00 2001 From: cherierm Date: Mon, 7 Jan 2008 16:39:40 +0000 Subject: [PATCH] Add the mailbox source file and header. msg_mailbox.h Header containing the declaration of the functions related with the mailbox concept msg_mailbox.c Source file containing the implementation of the functions related with the mailbox concept git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@5164 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/msg/msg_mailbox.c | 200 +++++++++++++++++++++++++++++++++ src/msg/msg_mailbox.h | 250 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 450 insertions(+) create mode 100644 src/msg/msg_mailbox.c create mode 100644 src/msg/msg_mailbox.h diff --git a/src/msg/msg_mailbox.c b/src/msg/msg_mailbox.c new file mode 100644 index 0000000000..d27bdc90aa --- /dev/null +++ b/src/msg/msg_mailbox.c @@ -0,0 +1,200 @@ +#include "msg_mailbox.h" +#include "msg/private.h" + +static xbt_dict_t +msg_mailboxes = NULL; + +xbt_dict_t +MSG_get_mailboxes(void) +{ + return msg_mailboxes; +} + +void +MSG_mailbox_mod_init(void) +{ + msg_mailboxes = xbt_dict_new(); +} + +void +MSG_mailbox_mod_exit(void) +{ + xbt_dict_free(&msg_mailboxes); +} + +msg_mailbox_t +MSG_mailbox_new(const char *alias) +{ + msg_mailbox_t mailbox = xbt_new0(s_msg_mailbox_t,1); + + mailbox->tasks = xbt_fifo_new(); + mailbox->cond = NULL; + mailbox->alias = xbt_strdup(alias); + mailbox->hostname = NULL; + + /* add the mbox in the dictionary */ + xbt_dict_set(msg_mailboxes, alias, mailbox, MSG_mailbox_free); + + return mailbox; +} + +void +MSG_mailbox_destroy(msg_mailbox_t* mailbox) +{ + xbt_dict_remove(msg_mailboxes,(*mailbox)->alias); + + if(NULL != ((*mailbox)->hostname)) + free((*mailbox)->hostname); + + + free((*mailbox)->alias); + + free(*mailbox); + + *mailbox = NULL; +} + +void +MSG_mailbox_put(msg_mailbox_t mailbox, m_task_t task) +{ + xbt_fifo_push(mailbox->tasks, task); +} + +smx_cond_t +MSG_mailbox_get_cond(msg_mailbox_t mailbox) +{ + return mailbox->cond; +} + +void +MSG_mailbox_remove(msg_mailbox_t mailbox, m_task_t task) +{ + xbt_fifo_remove(mailbox->tasks,task); +} + +int +MSG_mailbox_is_empty(msg_mailbox_t mailbox) +{ + return (NULL == xbt_fifo_get_first_item(mailbox->tasks)); +} + +m_task_t +MSG_mailbox_pop_head(msg_mailbox_t mailbox) +{ + return (m_task_t)xbt_fifo_shift(mailbox->tasks); +} + +m_task_t +MSG_mailbox_get_head(msg_mailbox_t mailbox) +{ + xbt_fifo_item_t item; + + if(NULL == (item = xbt_fifo_get_first_item(mailbox->tasks))) + return NULL; + + return (m_task_t)xbt_fifo_get_item_content(item); +} + +m_task_t +MSG_mailbox_get_first_host_task(msg_mailbox_t mailbox, m_host_t host) +{ + m_task_t task = NULL; + xbt_fifo_item_t item = NULL; + + xbt_fifo_foreach(mailbox->tasks, item, task, m_task_t) + { + if (task->simdata->source == host) + break; + } + + if(item) + xbt_fifo_remove_item(mailbox->tasks, item); + + return task; +} + +int +MSG_mailbox_get_count_host_tasks(msg_mailbox_t mailbox, m_host_t host) +{ + m_task_t task = NULL; + xbt_fifo_item_t item = NULL; + int count = 0; + + xbt_fifo_foreach(mailbox->tasks, item, task, m_task_t) + { + if (task->simdata->source == host) + count++; + } + + return count; +} + +void +MSG_mailbox_set_cond(msg_mailbox_t mailbox, smx_cond_t cond) +{ + mailbox->cond = cond; +} + +const char* +MSG_mailbox_get_alias(msg_mailbox_t mailbox) +{ + return mailbox->alias; +} + +const char* +MSG_mailbox_get_hostname(msg_mailbox_t mailbox) +{ + return mailbox->hostname; +} + +void +MSG_mailbox_set_hostname(msg_mailbox_t mailbox, const char* hostname) +{ + mailbox->hostname = xbt_strdup(hostname); +} + +void +MSG_mailbox_free(void* mailbox) +{ + msg_mailbox_t __mailbox = (msg_mailbox_t)mailbox; + + if(NULL != (__mailbox->hostname)) + free(__mailbox->hostname); + + free(__mailbox->alias); + + free(__mailbox); +} + +msg_mailbox_t +MSG_mailbox_get_by_alias(const char* alias) +{ + xbt_ex_t e; + int found = 1; + msg_mailbox_t mailbox; + + TRY + { + mailbox = xbt_dict_get(msg_mailboxes,alias); + } + CATCH(e) + { + if (e.category == not_found_error) + { + found = 0; + xbt_ex_free(e); + } + else + { + RETHROW; + } + } + + if(!found) + { + mailbox = MSG_mailbox_new(alias); + MSG_mailbox_set_hostname(mailbox,MSG_host_self()->name); + } + + return mailbox; +} \ No newline at end of file diff --git a/src/msg/msg_mailbox.h b/src/msg/msg_mailbox.h new file mode 100644 index 0000000000..9a4ebdd9d1 --- /dev/null +++ b/src/msg/msg_mailbox.h @@ -0,0 +1,250 @@ +#ifndef SMX_MAILBOX_H +#define SMX_MAILBOX_H + +#include "xbt/fifo.h" +#include "simix/private.h" +#include "msg/datatypes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_ALIAS_NAME ((size_t)260) + +/* this structure represents a mailbox */ +typedef struct s_msg_mailbox +{ + char* alias; /* the key of the mailbox in the dictionary */ + xbt_fifo_t tasks; /* the list of the tasks in the mailbox */ + smx_cond_t cond; /* the condition on the mailbox */ + char* hostname; /* the name of the host containing the mailbox */ +}s_msg_mailbox_t, * msg_mailbox_t; + +/* + * Initialization of the mailbox module. + */ +void +MSG_mailbox_mod_init(void); + +/* + * Terminaison of the mailbox module. + */ +void +MSG_mailbox_mod_exit(void); + +/*! \brief MSG_get_mailboxes - get the dictionary containing all the mailboxes. + * + * The function MSG_get_mailboxes returns the dictionary containing all the mailboxes + * of the simulation. A mailbox allow different processes to communicate using msg tasks. + * It is identified by an alias which is a key of the dictionary containing all of them. + * + * \return The dictionary containing all the mailboxes of the simulation. + */ +xbt_dict_t +MSG_get_mailboxes(void); + +/*! \brief MSG_mailbox_new - create a new mailbox. + * + * The function MSG_mailbox_new creates a new mailbox identified by the key specified + * by the parameter alias. + * + * \param alias The alias of the mailbox to create. + * + * \return The newly created mailbox. + */ +msg_mailbox_t +MSG_mailbox_new(const char *alias); + +/* \brief MSG_mailbox_destroy - destroy a mailbox. + * + * The function MSG_mailbox_destroy removes a mailbox from the dictionary containing + * all the mailbox of the simulation an release it from the memory. This function is + * different to the MSG_mailbox_free which only release a mailbox from the memory but + does not remove it from the dictionary. + * + * \param mailbox The mailbox to destroy. + * + * \see MSG_mailbox_free. + */ +void +MSG_mailbox_destroy(msg_mailbox_t* mailbox); + +/* \brief MSG_mailbox_free - release a mailbox from the memory. + * + * The function MSG_mailbox_free release a mailbox from the memory but does + * not remove it from the dictionary. + * + * \param mailbox The mailbox to release. + * + * \see MSG_mailbox_destroy. + */ +void +MSG_mailbox_free(void* mailbox); + +/* \brief MSG_mailbox_get_by_alias - get a mailbox from its alias. + * + * The function MSG_mailbox_get_by_alias returns the mailbox associated with + * the key specified by the parameter alias. If the mailbox does not exists, + * the function create it. + * + * \param alias The alias of the mailbox to return. + * + * \return The mailbox associated with the alias specified as parameter + * or a new mailbox if the key does not match. + */ +msg_mailbox_t +MSG_mailbox_get_by_alias(const char* alias); + +/*! \brief MSG_mailbox_get_alias - get the alias associated with the mailbox. + * + * The function MSG_mailbox_get_alias returns the alias of the mailbox specified + * by the parameter mailbox. + * + * \param mailbox The mailbox to get the alias. + * + * \return The alias of the mailbox specified by the parameter mailbox. + */ +const char* +MSG_mailbox_get_alias(msg_mailbox_t mailbox); + +/*! \brief MSG_mailbox_get_cond - get the simix condition of a mailbox. + * + * The function MSG_mailbox_get_cond returns the condition of the mailbox specified + * by the parameter mailbox. + * + * \param mailbox The mailbox to get the condition. + * + * \return The simix condition of the mailbox specified by the parameter mailbox. + */ +smx_cond_t +MSG_mailbox_get_cond(msg_mailbox_t mailbox); + +/*! \brief MSG_mailbox_set_cond - set the simix condition of a mailbox. + * + * The function MSG_mailbox_set_cond set the condition of the mailbox specified + * by the parameter mailbox. + * + * \param mailbox The mailbox to set the condition. + * \param cond The new simix condition of the mailbox. + * + */ +void +MSG_mailbox_set_cond(msg_mailbox_t mailbox, smx_cond_t cond); + +/*! \brief MSG_mailbox_get_hostname - get the name of the host owned a mailbox. + * + * The function MSG_mailbox_get_hostname returns name of the host owned the mailbox specified + * by the parameter mailbox. + * + * \param mailbox The mailbox to get the name of the host. + * + * \return The name of the host owned the mailbox specified by the parameter mailbox. + */ +const char* +MSG_mailbox_get_hostname(msg_mailbox_t mailbox); + +/*! \brief MSG_mailbox_set_hostname - set the name of the host owned a mailbox. + * + * The function MSG_mailbox_set_hostname sets the name of the host owned the mailbox specified + * by the parameter mailbox. + * + * \param mailbox The mailbox to set the name of the host. + * \param hostname The name of the owner of the mailbox. + * + */ +void +MSG_mailbox_set_hostname(msg_mailbox_t mailbox, const char* hostname); + + +/*! \brief MSG_mailbox_is_empty - test if a mailbox is empty. + * + * The function MSG_mailbox_is_empty tests if a mailbox is empty (contains no msg task). + * + * \param mailbox The mailbox to get test. + * + * \return The function returns 1 if the mailbox is empty. Otherwise the function + * returns 0. + */ +int +MSG_mailbox_is_empty(msg_mailbox_t mailbox); + +/*! \brief MSG_mailbox_put - put a task in a mailbox. + * + * The MSG_mailbox_put puts a task in a specified mailbox. + * + * \param mailbox The mailbox where put the task. + * \param task The task to put in the mailbox. + */ +void +MSG_mailbox_put(msg_mailbox_t mailbox, m_task_t task); + +/*! \brief MSG_mailbox_remove - remove a task from a mailbox. + * + * The MSG_mailbox_remove removes a task from a specified mailbox. + * + * \param mailbox The mailbox concerned by this operation. + * \param task The task to remove from the mailbox. + */ +void +MSG_mailbox_remove(msg_mailbox_t mailbox, m_task_t task); + +/*! \brief MSG_mailbox_get_head - get the task at the head of a mailbox. + * + * The MSG_mailbox_get_head returns the task at the head of the mailbox. + * This function does not remove the task from the mailbox (contrary to + * the function MSG_mailbox_pop_head). + * + * \param mailbox The mailbox concerned by the operation. + * + * \return The task at the head of the mailbox. + */ +m_task_t +MSG_mailbox_get_head(msg_mailbox_t mailbox); + +/*! \brief MSG_mailbox_pop_head - get the task at the head of a mailbox + * and remove it from it. + * + * The MSG_mailbox_pop_head returns the task at the head of the mailbox + * and remove it from it. + * + * \param mailbox The mailbox concerned by the operation. + * + * \return The task at the head of the mailbox. + */ +m_task_t +MSG_mailbox_pop_head(msg_mailbox_t mailbox); + +/*! \brief MSG_mailbox_get_first_host_task - get the first msg task + * of a specified mailbox, sended by a process of a specified host. + * + * \param mailbox The mailbox concerned by the operation. + * \param host The msg host of the process that has sended the + * task. + * + * \return The first task in the mailbox specified by the + * parameter mailbox and sended by a process located + * on the host specified by the parameter host. + */ +m_task_t +MSG_mailbox_get_first_host_task(msg_mailbox_t mailbox, m_host_t host); + +/*! \brief MSG_mailbox_get_count_host_tasks - get the number of msg tasks + * of a specified mailbox, sended by all the process of a specified host. + * + * \param mailbox The mailbox concerned by the operation. + * \param host The msg host containing the processes that have sended the + * tasks. + * + * \return The number of tasks in the mailbox specified by the + * parameter mailbox and sended by all the processes located + * on the host specified by the parameter host. + */ +int +MSG_mailbox_get_count_host_tasks(msg_mailbox_t mailbox, m_host_t host); + + +#ifdef __cplusplus +} +#endif + +#endif /* !SMX_MAILBOX_H */ \ No newline at end of file -- 2.20.1