Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add the mailbox source file and header.
authorcherierm <cherierm@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 7 Jan 2008 16:39:40 +0000 (16:39 +0000)
committercherierm <cherierm@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 7 Jan 2008 16:39:40 +0000 (16:39 +0000)
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 [new file with mode: 0644]
src/msg/msg_mailbox.h [new file with mode: 0644]

diff --git a/src/msg/msg_mailbox.c b/src/msg/msg_mailbox.c
new file mode 100644 (file)
index 0000000..d27bdc9
--- /dev/null
@@ -0,0 +1,200 @@
+#include "msg_mailbox.h"\r
+#include "msg/private.h"\r
+\r
+static xbt_dict_t \r
+msg_mailboxes = NULL;\r
+\r
+xbt_dict_t\r
+MSG_get_mailboxes(void)\r
+{\r
+       return msg_mailboxes;\r
+}\r
+\r
+void\r
+MSG_mailbox_mod_init(void)\r
+{\r
+       msg_mailboxes = xbt_dict_new(); \r
+}\r
+\r
+void\r
+MSG_mailbox_mod_exit(void)\r
+{\r
+       xbt_dict_free(&msg_mailboxes);\r
+}\r
+\r
+msg_mailbox_t\r
+MSG_mailbox_new(const char *alias)\r
+{\r
+       msg_mailbox_t mailbox = xbt_new0(s_msg_mailbox_t,1);\r
+       \r
+       mailbox->tasks = xbt_fifo_new();\r
+       mailbox->cond = NULL;\r
+       mailbox->alias = xbt_strdup(alias);\r
+       mailbox->hostname = NULL;\r
+       \r
+       /* add the mbox in the dictionary */\r
+       xbt_dict_set(msg_mailboxes, alias, mailbox, MSG_mailbox_free);\r
+       \r
+       return mailbox;\r
+}\r
+\r
+void\r
+MSG_mailbox_destroy(msg_mailbox_t* mailbox)\r
+{\r
+       xbt_dict_remove(msg_mailboxes,(*mailbox)->alias);\r
+\r
+       if(NULL != ((*mailbox)->hostname))\r
+               free((*mailbox)->hostname);\r
+\r
+       \r
+       free((*mailbox)->alias);\r
+       \r
+       free(*mailbox);\r
+       \r
+       *mailbox = NULL;        \r
+}\r
+\r
+void\r
+MSG_mailbox_put(msg_mailbox_t mailbox, m_task_t task)\r
+{\r
+       xbt_fifo_push(mailbox->tasks, task);\r
+}\r
+\r
+smx_cond_t\r
+MSG_mailbox_get_cond(msg_mailbox_t mailbox)\r
+{\r
+       return mailbox->cond;\r
+}\r
+\r
+void\r
+MSG_mailbox_remove(msg_mailbox_t mailbox, m_task_t task)\r
+{\r
+       xbt_fifo_remove(mailbox->tasks,task);\r
+}\r
+\r
+int\r
+MSG_mailbox_is_empty(msg_mailbox_t mailbox)\r
+{\r
+       return (NULL == xbt_fifo_get_first_item(mailbox->tasks));\r
+}\r
+\r
+m_task_t\r
+MSG_mailbox_pop_head(msg_mailbox_t mailbox)\r
+{\r
+       return (m_task_t)xbt_fifo_shift(mailbox->tasks);\r
+}\r
+\r
+m_task_t\r
+MSG_mailbox_get_head(msg_mailbox_t mailbox)\r
+{\r
+       xbt_fifo_item_t item;\r
+       \r
+       if(NULL == (item = xbt_fifo_get_first_item(mailbox->tasks)))\r
+               return NULL;\r
+               \r
+       return (m_task_t)xbt_fifo_get_item_content(item);\r
+}\r
+\r
+m_task_t\r
+MSG_mailbox_get_first_host_task(msg_mailbox_t mailbox, m_host_t host)\r
+{\r
+       m_task_t task = NULL;\r
+       xbt_fifo_item_t item = NULL;\r
+       \r
+       xbt_fifo_foreach(mailbox->tasks, item, task, m_task_t) \r
+       {\r
+               if (task->simdata->source == host)\r
+                       break;\r
+       }\r
+       \r
+       if(item) \r
+               xbt_fifo_remove_item(mailbox->tasks, item);\r
+               \r
+       return task;\r
+}\r
+\r
+int\r
+MSG_mailbox_get_count_host_tasks(msg_mailbox_t mailbox, m_host_t host)\r
+{\r
+       m_task_t task = NULL;\r
+       xbt_fifo_item_t item = NULL;\r
+       int count = 0;\r
+       \r
+       xbt_fifo_foreach(mailbox->tasks, item, task, m_task_t) \r
+       {\r
+               if (task->simdata->source == host)\r
+                       count++;\r
+       }\r
+               \r
+       return count;\r
+}\r
+\r
+void\r
+MSG_mailbox_set_cond(msg_mailbox_t mailbox, smx_cond_t cond)\r
+{\r
+       mailbox->cond = cond;\r
+}\r
+\r
+const char*\r
+MSG_mailbox_get_alias(msg_mailbox_t mailbox)\r
+{\r
+       return mailbox->alias;\r
+}\r
+\r
+const char*\r
+MSG_mailbox_get_hostname(msg_mailbox_t mailbox)\r
+{\r
+       return mailbox->hostname;\r
+}\r
+\r
+void\r
+MSG_mailbox_set_hostname(msg_mailbox_t mailbox, const char* hostname)\r
+{\r
+       mailbox->hostname = xbt_strdup(hostname);\r
+}\r
+\r
+void\r
+MSG_mailbox_free(void* mailbox)\r
+{\r
+       msg_mailbox_t __mailbox = (msg_mailbox_t)mailbox;\r
+\r
+       if(NULL != (__mailbox->hostname))\r
+               free(__mailbox->hostname);\r
+\r
+       free(__mailbox->alias);\r
+       \r
+       free(__mailbox);\r
+}\r
+\r
+msg_mailbox_t\r
+MSG_mailbox_get_by_alias(const char* alias)\r
+{\r
+       xbt_ex_t e;\r
+       int found = 1;\r
+       msg_mailbox_t mailbox;\r
+\r
+       TRY \r
+       {\r
+               mailbox = xbt_dict_get(msg_mailboxes,alias);\r
+       } \r
+       CATCH(e) \r
+       {\r
+               if (e.category == not_found_error) \r
+               {\r
+                       found = 0;\r
+                       xbt_ex_free(e);\r
+               } \r
+               else \r
+               {\r
+                       RETHROW;\r
+               }\r
+       }\r
+\r
+       if(!found)\r
+       {\r
+               mailbox = MSG_mailbox_new(alias);\r
+               MSG_mailbox_set_hostname(mailbox,MSG_host_self()->name);\r
+       }\r
+       \r
+       return mailbox; \r
+}
\ No newline at end of file
diff --git a/src/msg/msg_mailbox.h b/src/msg/msg_mailbox.h
new file mode 100644 (file)
index 0000000..9a4ebdd
--- /dev/null
@@ -0,0 +1,250 @@
+#ifndef SMX_MAILBOX_H\r
+#define SMX_MAILBOX_H\r
+\r
+#include "xbt/fifo.h"\r
+#include "simix/private.h"\r
+#include "msg/datatypes.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#define MAX_ALIAS_NAME ((size_t)260)\r
+\r
+/* this structure represents a mailbox */\r
+typedef struct s_msg_mailbox\r
+{\r
+       char* alias;                    /* the key of the mailbox in the dictionary                             */\r
+       xbt_fifo_t tasks;               /* the list of the tasks in the mailbox                                 */\r
+       smx_cond_t cond;                /* the condition on the mailbox                                                 */\r
+       char* hostname;                 /* the name of the host containing the mailbox                  */\r
+}s_msg_mailbox_t, * msg_mailbox_t;\r
+\r
+/*\r
+ * Initialization of the mailbox module.\r
+ */\r
+void\r
+MSG_mailbox_mod_init(void);\r
+\r
+/*\r
+ * Terminaison of the mailbox module.\r
+ */\r
+void\r
+MSG_mailbox_mod_exit(void);\r
+\r
+/*! \brief MSG_get_mailboxes - get the dictionary containing all the mailboxes.\r
+ * \r
+ * The function MSG_get_mailboxes returns the dictionary containing all the mailboxes\r
+ * of the simulation. A mailbox allow different processes to communicate using msg tasks.\r
+ * It is identified by an alias which is a key of the dictionary containing all of them.\r
+ * \r
+ * \return     The dictionary containing all the mailboxes of the simulation.\r
+ */\r
+xbt_dict_t\r
+MSG_get_mailboxes(void);\r
+\r
+/*! \brief MSG_mailbox_new - create a new mailbox.\r
+ *\r
+ * The function MSG_mailbox_new creates a new mailbox identified by the key specified\r
+ * by the parameter alias.\r
+ *\r
+ * \param alias                The alias of the mailbox to create.\r
+ * \r
+ * \return                     The newly created mailbox.\r
+ */\r
+msg_mailbox_t\r
+MSG_mailbox_new(const char *alias);\r
+\r
+/* \brief MSG_mailbox_destroy - destroy a mailbox.\r
+ *\r
+ * The function MSG_mailbox_destroy removes a mailbox from the dictionary containing\r
+ * all the mailbox of the simulation an release it from the memory. This function is\r
+ * different to the MSG_mailbox_free which only release a mailbox from the memory but\r
+ does not remove it from the dictionary.\r
+ *\r
+ * \param mailbox      The mailbox to destroy.\r
+ *\r
+ * \see                                MSG_mailbox_free.\r
+ */\r
+void\r
+MSG_mailbox_destroy(msg_mailbox_t* mailbox);\r
+\r
+/* \brief MSG_mailbox_free - release a mailbox from the memory.\r
+ *\r
+ * The function MSG_mailbox_free release a mailbox from the memory but does\r
+ * not remove it from the dictionary.\r
+ *\r
+ * \param mailbox      The mailbox to release.\r
+ *\r
+ * \see                                MSG_mailbox_destroy.\r
+ */\r
+void\r
+MSG_mailbox_free(void* mailbox);\r
+\r
+/* \brief MSG_mailbox_get_by_alias - get a mailbox from its alias.\r
+ *\r
+ * The function MSG_mailbox_get_by_alias returns the mailbox associated with\r
+ * the key specified by the parameter alias. If the mailbox does not exists,\r
+ * the function create it.\r
+ *\r
+ * \param alias                The alias of the mailbox to return.\r
+ *\r
+ * \return                     The mailbox associated with the alias specified as parameter\r
+ *                                     or a new mailbox if the key does not match.\r
+ */\r
+msg_mailbox_t\r
+MSG_mailbox_get_by_alias(const char* alias);\r
+\r
+/*! \brief MSG_mailbox_get_alias - get the alias associated with the mailbox.\r
+ *\r
+ * The function MSG_mailbox_get_alias returns the alias of the mailbox specified\r
+ * by the parameter mailbox.\r
+ *\r
+ * \param mailbox      The mailbox to get the alias.\r
+ *\r
+ * \return                     The alias of the mailbox specified by the parameter mailbox.\r
+ */\r
+const char*\r
+MSG_mailbox_get_alias(msg_mailbox_t mailbox);\r
+\r
+/*! \brief MSG_mailbox_get_cond - get the simix condition of a mailbox.\r
+ *\r
+ * The function MSG_mailbox_get_cond returns the condition of the mailbox specified\r
+ * by the parameter mailbox.\r
+ *\r
+ * \param mailbox      The mailbox to get the condition.\r
+ *\r
+ * \return                     The simix condition of the mailbox specified by the parameter mailbox.\r
+ */\r
+smx_cond_t\r
+MSG_mailbox_get_cond(msg_mailbox_t mailbox);\r
+\r
+/*! \brief MSG_mailbox_set_cond - set the simix condition of a mailbox.\r
+ *\r
+ * The function MSG_mailbox_set_cond set the condition of the mailbox specified\r
+ * by the parameter mailbox.\r
+ *\r
+ * \param mailbox      The mailbox to set the condition.\r
+ * \param cond         The new simix condition of the mailbox.\r
+ *\r
+ */\r
+void\r
+MSG_mailbox_set_cond(msg_mailbox_t mailbox, smx_cond_t cond);\r
+\r
+/*! \brief MSG_mailbox_get_hostname - get the name of the host owned a mailbox.\r
+ *\r
+ * The function MSG_mailbox_get_hostname returns name of the host owned the mailbox specified\r
+ * by the parameter mailbox.\r
+ *\r
+ * \param mailbox      The mailbox to get the name of the host.\r
+ *\r
+ * \return                     The name of the host owned the mailbox specified by the parameter mailbox.\r
+ */\r
+const char*\r
+MSG_mailbox_get_hostname(msg_mailbox_t mailbox);\r
+\r
+/*! \brief MSG_mailbox_set_hostname - set the name of the host owned a mailbox.\r
+ *\r
+ * The function MSG_mailbox_set_hostname sets the name of the host owned the mailbox specified\r
+ * by the parameter mailbox.\r
+ *\r
+ * \param mailbox      The mailbox to set the name of the host.\r
+ * \param hostname     The name of the owner of the mailbox.\r
+ *\r
+ */\r
+void\r
+MSG_mailbox_set_hostname(msg_mailbox_t mailbox, const char* hostname);\r
+\r
+\r
+/*! \brief MSG_mailbox_is_empty - test if a mailbox is empty.\r
+ *\r
+ * The function MSG_mailbox_is_empty tests if a mailbox is empty (contains no msg task). \r
+ *\r
+ * \param mailbox      The mailbox to get test.\r
+ *\r
+ * \return                     The function returns 1 if the mailbox is empty. Otherwise the function\r
+ *                                     returns 0.\r
+ */\r
+int\r
+MSG_mailbox_is_empty(msg_mailbox_t mailbox);\r
+\r
+/*! \brief MSG_mailbox_put - put a task in a mailbox.\r
+ *\r
+ * The MSG_mailbox_put puts a task in a specified mailbox.\r
+ *\r
+ * \param mailbox      The mailbox where put the task.\r
+ * \param task         The task to put in the mailbox.\r
+ */\r
+void\r
+MSG_mailbox_put(msg_mailbox_t mailbox, m_task_t task);\r
+\r
+/*! \brief MSG_mailbox_remove - remove a task from a mailbox.\r
+ *\r
+ * The MSG_mailbox_remove removes a task from a specified mailbox.\r
+ *\r
+ * \param mailbox      The mailbox concerned by this operation.\r
+ * \param task         The task to remove from the mailbox.\r
+ */\r
+void\r
+MSG_mailbox_remove(msg_mailbox_t mailbox, m_task_t task);\r
+\r
+/*! \brief MSG_mailbox_get_head - get the task at the head of a mailbox.\r
+ *\r
+ * The MSG_mailbox_get_head returns the task at the head of the mailbox.\r
+ * This function does not remove the task from the mailbox (contrary to\r
+ * the function MSG_mailbox_pop_head).\r
+ *\r
+ * \param mailbox      The mailbox concerned by the operation.\r
+ *\r
+ * \return                     The task at the head of the mailbox.\r
+ */\r
+m_task_t\r
+MSG_mailbox_get_head(msg_mailbox_t mailbox);\r
+\r
+/*! \brief MSG_mailbox_pop_head - get the task at the head of a mailbox\r
+ * and remove it from it.\r
+ *\r
+ * The MSG_mailbox_pop_head returns the task at the head of the mailbox\r
+ * and remove it from it.\r
+ *\r
+ * \param mailbox      The mailbox concerned by the operation.\r
+ *\r
+ * \return                     The task at the head of the mailbox.\r
+ */\r
+m_task_t\r
+MSG_mailbox_pop_head(msg_mailbox_t mailbox);\r
+\r
+/*! \brief MSG_mailbox_get_first_host_task - get the first msg task\r
+ * of a specified mailbox, sended by a process of a specified host.\r
+ *\r
+ * \param mailbox      The mailbox concerned by the operation.\r
+ * \param host         The msg host of the process that has sended the\r
+ *                                     task.\r
+ *\r
+ * \return                     The first task in the mailbox specified by the\r
+ *                                     parameter mailbox and sended by a process located\r
+ *                                     on the host specified by the parameter host.\r
+ */\r
+m_task_t\r
+MSG_mailbox_get_first_host_task(msg_mailbox_t mailbox, m_host_t host);\r
+\r
+/*! \brief MSG_mailbox_get_count_host_tasks - get the number of msg tasks\r
+ * of a specified mailbox, sended by all the process of a specified host.\r
+ *\r
+ * \param mailbox      The mailbox concerned by the operation.\r
+ * \param host         The msg host containing the processes that have sended the\r
+ *                                     tasks.\r
+ *\r
+ * \return                     The number of tasks in the mailbox specified by the\r
+ *                                     parameter mailbox and sended by all the processes located\r
+ *                                     on the host specified by the parameter host.\r
+ */\r
+int\r
+MSG_mailbox_get_count_host_tasks(msg_mailbox_t mailbox, m_host_t host);\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* !SMX_MAILBOX_H */
\ No newline at end of file