Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
63d259d7fd2f8775658b18c9d53ef7111c666a23
[simgrid.git] / src / gras / Msg / gras_msg_mod.c
1 /* $Id$ */
2
3 /* gras message types handling                                              */
4
5 /* Copyright (c) 2003, 2004, 2005, 2006, 2007 Martin Quinson.               */
6 /* All rights reserved.                                                     */
7
8 /* This program is free software; you can redistribute it and/or modify it
9  * under the terms of the license (GNU LGPL) which comes with this package. */
10
11 #include "xbt/ex.h"
12 #include "gras/Msg/msg_private.h"
13 #include "gras/Virtu/virtu_interface.h"
14
15 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_msg);
16
17 extern xbt_set_t _gras_msgtype_set;
18
19 /*
20  * Creating procdata for this module
21  */
22 static void *gras_msg_procdata_new(void)
23 {
24   gras_msg_procdata_t res = xbt_new(s_gras_msg_procdata_t, 1);
25
26   res->name = xbt_strdup("gras_msg");
27   res->name_len = 0;
28   res->msg_queue = xbt_dynar_new(sizeof(s_gras_msg_t), NULL);
29   res->msg_waitqueue = xbt_dynar_new(sizeof(s_gras_msg_t), NULL);
30   res->cbl_list = xbt_dynar_new(sizeof(gras_cblist_t *), gras_cbl_free);
31   res->timers = xbt_dynar_new(sizeof(s_gras_timer_t), NULL);
32   res->msg_to_receive_queue = xbt_fifo_new();
33   res->msg_to_receive_queue_meas = xbt_fifo_new();
34   res->msg_received = xbt_queue_new(0, sizeof(s_gras_msg_t));
35
36   return (void *) res;
37 }
38
39 /*
40  * Freeing procdata for this module
41  */
42 static void gras_msg_procdata_free(void *data)
43 {
44   gras_msg_procdata_t res = (gras_msg_procdata_t) data;
45
46   xbt_dynar_free(&(res->msg_queue));
47   xbt_dynar_free(&(res->msg_waitqueue));
48   xbt_dynar_free(&(res->cbl_list));
49   xbt_dynar_free(&(res->timers));
50   xbt_fifo_free(res->msg_to_receive_queue);
51   xbt_fifo_free(res->msg_to_receive_queue_meas);
52
53   free(res->name);
54   free(res);
55 }
56
57 /*
58  * Module registration
59  */
60 int gras_msg_libdata_id;
61 void gras_msg_register()
62 {
63   gras_msg_libdata_id =
64     gras_procdata_add("gras_msg", gras_msg_procdata_new,
65                       gras_msg_procdata_free);
66 }
67
68 /*
69  * Initialize this submodule.
70  */
71 void gras_msg_init(void)
72 {
73   /* only initialize once */
74   if (_gras_msgtype_set != NULL)
75     return;
76
77   VERB0("Initializing Msg");
78
79   _gras_msgtype_set = xbt_set_new();
80
81   memcpy(_GRAS_header, "GRAS", 4);
82   _GRAS_header[4] = GRAS_PROTOCOL_VERSION;
83   _GRAS_header[5] = (char) GRAS_THISARCH;
84
85   gras_msg_ctx_mallocator =
86     xbt_mallocator_new(1000,
87                        gras_msg_ctx_mallocator_new_f,
88                        gras_msg_ctx_mallocator_free_f,
89                        gras_msg_ctx_mallocator_reset_f);
90 }
91
92 /*
93  * Finalize the msg module
94  */
95 void gras_msg_exit(void)
96 {
97   VERB0("Exiting Msg");
98   xbt_set_free(&_gras_msgtype_set);
99
100   xbt_mallocator_free(gras_msg_ctx_mallocator);
101 }