Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : new cfg command line flag (model-check/max_depth) for max depth of...
[simgrid.git] / src / xbt / datadesc / datadesc.c
1 /* datadesc - data description in order to send/recv it in XBT             */
2
3 /* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
4  * All rights reserved.                                                     */
5
6 /* This program is free software; you can redistribute it and/or modify it
7  * under the terms of the license (GNU LGPL) which comes with this package. */
8
9 #include "datadesc_private.h"
10 #include "portable.h"
11
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ddt, xbt, "Data description");
13 /* FIXME: make this host-dependent using a trick such as UserData*/
14 /*@null@*/ xbt_set_t xbt_datadesc_set_local = NULL;
15
16
17 /* callback for array size when sending strings */
18 static int _strlen_cb( /*@unused@ */ xbt_datadesc_type_t type, /*@unused@ */
19                       xbt_cbps_t vars, void *data)
20 {
21
22   return 1 + (int) strlen(data);
23 }
24
25
26 /**
27  * xbt_datadesc_init:
28  *
29  * Initialize the datadesc module.
30  * FIXME: We assume that when neither signed nor unsigned is given,
31  *    that means signed. To be checked by configure.
32  **/
33 void xbt_datadesc_preinit(void)
34 {
35   xbt_datadesc_type_t ddt;     /* What to add */
36
37   /* only initialize once */
38   if (xbt_datadesc_set_local != NULL)
39     return;
40
41   XBT_VERB("Initializing DataDesc");
42
43   xbt_datadesc_set_local = xbt_set_new();
44
45
46   /* all known datatypes */
47
48   ddt = xbt_datadesc_scalar("signed char",
49                              xbt_ddt_scalar_char,
50                              e_xbt_dd_scalar_encoding_sint);
51   ddt = xbt_datadesc_scalar("char",
52                              xbt_ddt_scalar_char,
53                              e_xbt_dd_scalar_encoding_sint);
54   ddt = xbt_datadesc_scalar("unsigned char",
55                              xbt_ddt_scalar_char,
56                              e_xbt_dd_scalar_encoding_uint);
57
58   ddt = xbt_datadesc_scalar("signed short int",
59                              xbt_ddt_scalar_short,
60                              e_xbt_dd_scalar_encoding_sint);
61   ddt = xbt_datadesc_scalar("short int",
62                              xbt_ddt_scalar_short,
63                              e_xbt_dd_scalar_encoding_sint);
64   ddt = xbt_datadesc_scalar("short",
65                              xbt_ddt_scalar_short,
66                              e_xbt_dd_scalar_encoding_sint);
67   ddt = xbt_datadesc_scalar("unsigned short int",
68                              xbt_ddt_scalar_short,
69                              e_xbt_dd_scalar_encoding_uint);
70
71   ddt = xbt_datadesc_scalar("signed int",
72                              xbt_ddt_scalar_int,
73                              e_xbt_dd_scalar_encoding_sint);
74   ddt = xbt_datadesc_scalar("int",
75                              xbt_ddt_scalar_int,
76                              e_xbt_dd_scalar_encoding_sint);
77   ddt = xbt_datadesc_scalar("unsigned int",
78                              xbt_ddt_scalar_int,
79                              e_xbt_dd_scalar_encoding_uint);
80
81   ddt = xbt_datadesc_scalar("signed long int",
82                              xbt_ddt_scalar_long,
83                              e_xbt_dd_scalar_encoding_sint);
84   ddt = xbt_datadesc_scalar("long int",
85                              xbt_ddt_scalar_long,
86                              e_xbt_dd_scalar_encoding_sint);
87   ddt = xbt_datadesc_scalar("long",
88                              xbt_ddt_scalar_long,
89                              e_xbt_dd_scalar_encoding_sint);
90   ddt = xbt_datadesc_scalar("unsigned long int",
91                              xbt_ddt_scalar_long,
92                              e_xbt_dd_scalar_encoding_uint);
93
94   ddt = xbt_datadesc_scalar("signed long long int",
95                              xbt_ddt_scalar_long_long,
96                              e_xbt_dd_scalar_encoding_sint);
97   ddt = xbt_datadesc_scalar("long long int",
98                              xbt_ddt_scalar_long_long,
99                              e_xbt_dd_scalar_encoding_sint);
100   ddt = xbt_datadesc_scalar("unsigned long long int",
101                              xbt_ddt_scalar_long_long,
102                              e_xbt_dd_scalar_encoding_uint);
103
104   ddt = xbt_datadesc_scalar("data pointer",
105                              xbt_ddt_scalar_pdata,
106                              e_xbt_dd_scalar_encoding_uint);
107   ddt = xbt_datadesc_scalar("function pointer",
108                              xbt_ddt_scalar_pfunc,
109                              e_xbt_dd_scalar_encoding_uint);
110
111   ddt = xbt_datadesc_scalar("float",
112                              xbt_ddt_scalar_float,
113                              e_xbt_dd_scalar_encoding_float);
114   ddt = xbt_datadesc_scalar("double",
115                              xbt_ddt_scalar_double,
116                              e_xbt_dd_scalar_encoding_float);
117
118   ddt = xbt_datadesc_array_dyn("char[]",
119                                 xbt_datadesc_by_name("char"), _strlen_cb);
120   xbt_datadesc_ref("string", ddt);
121   xbt_datadesc_ref("xbt_string_t", ddt);
122
123   /* specific datatype: the exception type (for RPC) */
124   ddt = xbt_datadesc_struct("ex_t");
125   xbt_datadesc_struct_append(ddt, "msg", xbt_datadesc_by_name("string"));
126   xbt_datadesc_struct_append(ddt, "category",
127                               xbt_datadesc_by_name("int"));
128   xbt_datadesc_struct_append(ddt, "value", xbt_datadesc_by_name("int"));
129
130   xbt_datadesc_struct_append(ddt, "remote",
131                               xbt_datadesc_by_name("short int"));
132
133   xbt_datadesc_struct_append(ddt, "host",
134                               xbt_datadesc_by_name("string"));
135   xbt_datadesc_struct_append(ddt, "procname",
136                               xbt_datadesc_by_name("string"));
137   xbt_datadesc_struct_append(ddt, "pid",
138                               xbt_datadesc_by_name("long int"));
139   xbt_datadesc_struct_append(ddt, "file",
140                               xbt_datadesc_by_name("string"));
141   xbt_datadesc_struct_append(ddt, "line", xbt_datadesc_by_name("int"));
142   xbt_datadesc_struct_append(ddt, "func",
143                               xbt_datadesc_by_name("string"));
144   xbt_datadesc_struct_append(ddt, "used", xbt_datadesc_by_name("int"));
145   xbt_datadesc_cb_field_push(ddt, "used");
146   xbt_datadesc_struct_append(ddt, "bt_strings",
147                               xbt_datadesc_ref_pop_arr
148                               (xbt_datadesc_by_name("string")));
149
150   xbt_datadesc_struct_close(ddt);
151
152   /* specific datatype: xbt_peer_t */
153   ddt = xbt_datadesc_struct("s_xbt_peer_t");
154   xbt_datadesc_struct_append(ddt, "name",
155                               xbt_datadesc_by_name("string"));
156   xbt_datadesc_struct_append(ddt, "port", xbt_datadesc_by_name("int"));
157   xbt_datadesc_struct_close(ddt);
158
159   ddt = xbt_datadesc_ref("xbt_peer_t", ddt);
160
161   /* Dict containing the constant value (for the parsing macro) */
162   xbt_dd_constants = xbt_dict_new_homogeneous(xbt_free_f);
163
164 }
165
166 /**
167  * xbt_datadesc_exit:
168  *
169  * Finalize the datadesc module
170  **/
171 void xbt_datadesc_postexit(void)
172 {
173   xbt_set_free(&xbt_datadesc_set_local);
174   xbt_dict_free(&xbt_dd_constants);
175 }
176
177 /** This is mainly to debug */
178 const char *xbt_datadesc_get_name(xbt_datadesc_type_t ddt)
179 {
180   return ddt ? (const char *) ddt->name : "(null)";
181 }
182
183 /** This is mainly to debug */
184 int xbt_datadesc_get_id(xbt_datadesc_type_t ddt)
185 {
186   return ddt->code;
187 }
188
189 /**
190  * xbt_datadesc_size:
191  *
192  * Returns the size occuped by data of this type (on the current arch).
193  *
194  */
195 int xbt_datadesc_size(xbt_datadesc_type_t type)
196 {
197   return type ? type->size[GRAS_THISARCH] : 0;
198 }
199
200 /**
201  * xbt_datadesc_type_dump:
202  *
203  * For debugging purpose
204  */
205 void xbt_datadesc_type_dump(const xbt_datadesc_type_t ddt)
206 {
207   unsigned int cpt;
208
209   printf("DataDesc dump:");
210   if (!ddt) {
211     printf("(null)\n");
212     return;
213   }
214   printf("%s (ID:%d)\n", ddt->name, ddt->code);
215   printf("  category: %s\n", xbt_datadesc_cat_names[ddt->category_code]);
216
217   printf("  size[");
218   for (cpt = 0; cpt < xbt_arch_count; cpt++) {
219     printf("%s%s%ld%s",
220            cpt > 0 ? ", " : "",
221            cpt == GRAS_THISARCH ? ">" : "",
222            ddt->size[cpt], cpt == GRAS_THISARCH ? "<" : "");
223   }
224   printf("]\n");
225
226   printf("  alignment[");
227   for (cpt = 0; cpt < xbt_arch_count; cpt++) {
228     printf("%s%s%lu%s",
229            cpt > 0 ? ", " : "",
230            cpt == GRAS_THISARCH ? ">" : "",
231            ddt->alignment[cpt], cpt == GRAS_THISARCH ? "<" : "");
232   }
233   printf("]\n");
234
235   printf("  aligned_size[");
236   for (cpt = 0; cpt < xbt_arch_count; cpt++) {
237     printf("%s%s%lu%s",
238            cpt > 0 ? ", " : "",
239            cpt == GRAS_THISARCH ? ">" : "",
240            ddt->aligned_size[cpt], cpt == GRAS_THISARCH ? "<" : "");
241   }
242   printf("]\n");
243   if (ddt->category_code == e_xbt_datadesc_type_cat_struct) {
244     xbt_dd_cat_struct_t struct_data;
245     xbt_dd_cat_field_t field;
246
247     struct_data = ddt->category.struct_data;
248     xbt_dynar_foreach(struct_data.fields, cpt, field) {
249       printf(">>> Dump field #%u (%s) (offset=%ld)\n",
250              cpt, field->name, field->offset[GRAS_THISARCH]);
251       xbt_datadesc_type_dump(field->type);
252       printf("<<< end dump field #%u (%s)\n", cpt, field->name);
253     }
254   }
255   fflush(stdout);
256 }