Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Version 0.5 (protocol not changed; ABI changed)
[simgrid.git] / src / gras / DataDesc / datadesc.c
1 /* $Id$ */
2
3 /* datadesc - data description in order to send/recv it in GRAS             */
4
5 /* Authors: Olivier Aumage, Martin Quinson                                  */
6 /* Copyright (C) 2003, 2004 the GRAS posse.                                 */
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 "DataDesc/datadesc_private.h"
12
13 GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(datadesc,GRAS);
14 /* FIXME: make this host-dependent using a trick such as UserData*/
15 gras_set_t *gras_datadesc_set_local=NULL;
16
17
18 /* callback for array size when sending strings */
19 static int
20 _strlen_cb(gras_cbps_t *vars, void *data) {
21
22   return 1+(long int)strlen(data);
23 }
24
25
26 /**
27  * gras_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
34 gras_datadesc_init(void) {
35   gras_error_t errcode;
36   gras_datadesc_type_t *ddt; /* What to add */
37
38   /* only initialize once */
39   if (gras_datadesc_set_local != NULL)
40     return;
41   
42   VERB0("Initializing DataDesc");
43   
44   TRYFAIL(gras_set_new(&gras_datadesc_set_local));
45   
46   TRYFAIL(gras_datadesc_scalar("signed char", 
47                                gras_ddt_scalar_char, 
48                                e_gras_dd_scalar_encoding_sint, 
49                                &ddt));
50   TRYFAIL(gras_datadesc_scalar("char", 
51                                gras_ddt_scalar_char, 
52                                e_gras_dd_scalar_encoding_sint, 
53                                &ddt));
54   TRYFAIL(gras_datadesc_scalar("unsigned char", 
55                                gras_ddt_scalar_char, 
56                                e_gras_dd_scalar_encoding_uint, 
57                                &ddt));
58   
59   TRYFAIL(gras_datadesc_scalar("signed short int", 
60                                gras_ddt_scalar_short, 
61                                e_gras_dd_scalar_encoding_sint, 
62                                &ddt));
63   TRYFAIL(gras_datadesc_scalar("short int", 
64                                gras_ddt_scalar_short, 
65                                e_gras_dd_scalar_encoding_sint, 
66                                &ddt));
67   TRYFAIL(gras_datadesc_scalar("unsigned short int", 
68                                gras_ddt_scalar_short, 
69                                e_gras_dd_scalar_encoding_uint, 
70                                &ddt));
71   
72   TRYFAIL(gras_datadesc_scalar("signed int", 
73                                gras_ddt_scalar_int, 
74                                e_gras_dd_scalar_encoding_sint, 
75                                &ddt));
76   TRYFAIL(gras_datadesc_scalar("int", 
77                                gras_ddt_scalar_int, 
78                                e_gras_dd_scalar_encoding_sint, 
79                                &ddt));
80   TRYFAIL(gras_datadesc_scalar("unsigned int", 
81                                gras_ddt_scalar_int, 
82                                e_gras_dd_scalar_encoding_uint, 
83                                &ddt));
84   
85   TRYFAIL(gras_datadesc_scalar("signed long int", 
86                                gras_ddt_scalar_long, 
87                                e_gras_dd_scalar_encoding_sint, 
88                                &ddt));
89   TRYFAIL(gras_datadesc_scalar("long int", 
90                                gras_ddt_scalar_long, 
91                                e_gras_dd_scalar_encoding_sint, 
92                                &ddt));
93   TRYFAIL(gras_datadesc_scalar("unsigned long int", 
94                                gras_ddt_scalar_long, 
95                                e_gras_dd_scalar_encoding_uint, 
96                                &ddt));
97   
98   TRYFAIL(gras_datadesc_scalar("signed long long int", 
99                                gras_ddt_scalar_long_long, 
100                                e_gras_dd_scalar_encoding_sint, 
101                                &ddt));
102   TRYFAIL(gras_datadesc_scalar("long long int", 
103                                gras_ddt_scalar_long_long, 
104                                e_gras_dd_scalar_encoding_sint, 
105                                &ddt));
106   TRYFAIL(gras_datadesc_scalar("unsigned long long int", 
107                                gras_ddt_scalar_long_long, 
108                                e_gras_dd_scalar_encoding_uint, 
109                                &ddt));
110   
111   TRYFAIL(gras_datadesc_scalar("data pointer", 
112                                gras_ddt_scalar_pdata, 
113                                e_gras_dd_scalar_encoding_uint, 
114                                &ddt));
115   TRYFAIL(gras_datadesc_scalar("function pointer", 
116                                gras_ddt_scalar_pfunc, 
117                                e_gras_dd_scalar_encoding_uint, 
118                                &ddt));
119   
120   TRYFAIL(gras_datadesc_scalar("float", 
121                                gras_ddt_scalar_float, 
122                                e_gras_dd_scalar_encoding_float, 
123                                &ddt));
124   TRYFAIL(gras_datadesc_scalar("double", 
125                                gras_ddt_scalar_double, 
126                                e_gras_dd_scalar_encoding_float, 
127                                &ddt));
128
129   TRYFAIL(gras_datadesc_array_dyn("char[]", 
130                                   gras_datadesc_by_name("char"), 
131                                   _strlen_cb,&ddt));
132   TRYFAIL(gras_datadesc_ref("string", 
133                             gras_datadesc_by_name("char[]"), 
134                             &ddt));
135
136 }
137
138 /**
139  * gras_datadesc_exit:
140  *
141  * Finalize the datadesc module
142  **/
143 void
144 gras_datadesc_exit(void) {
145   VERB0("Exiting DataDesc");
146   gras_set_free(&gras_datadesc_set_local);
147   gras_datadesc_set_local = NULL;
148   DEBUG0("Exited DataDesc");
149 }
150
151 /**
152  * gras_datadesc_get_name:
153  *
154  * Returns the name of a datadescription (to ease the debug)
155  */
156 char *
157 gras_datadesc_get_name(gras_datadesc_type_t *ddt) {
158   return ddt->name;
159 }
160 /**
161  * gras_datadesc_get_id:
162  *
163  * Returns the name of a datadescription (to ease the debug)
164  */
165 int
166 gras_datadesc_get_id(gras_datadesc_type_t *ddt) {
167   return ddt->code;
168 }
169
170 /**
171  * gras_datadesc_size: 
172  *
173  * Returns the size occuped by data of this type (on the current arch).
174  *
175  */
176 int gras_datadesc_size(gras_datadesc_type_t *type) {
177   return type->size[GRAS_THISARCH];
178 }
179
180 /**
181  * gras_datadesc_type_dump:
182  *
183  * For debugging purpose
184  */
185 void gras_datadesc_type_dump(const gras_datadesc_type_t *ddt){
186   int cpt;
187
188   printf("DataDesc dump:");
189   if(!ddt) {
190     printf("(null)\n");
191     return;
192   }
193   printf ("%s (ID:%d)\n",ddt->name,ddt->code);
194   printf ("  category: %s\n",gras_datadesc_cat_names[ddt->category_code]);
195
196   printf ("  size[");
197   for (cpt=0; cpt<gras_arch_count; cpt++) {
198     printf("%s%s%ld%s",
199            cpt>0?", ":"",
200            cpt == GRAS_THISARCH ? "*":"",
201            ddt->size[cpt],
202            cpt == GRAS_THISARCH ? "*":"");
203   }
204   printf ("]\n");
205
206   printf ("  alignment[");
207   for (cpt=0; cpt<gras_arch_count; cpt++) {
208     printf("%s%s%ld%s",
209            cpt>0?", ":"",
210            cpt == GRAS_THISARCH ? "*":"",
211            ddt->alignment[cpt],
212            cpt == GRAS_THISARCH ? "*":"");
213   }
214   printf ("]\n");
215
216   printf ("  aligned_size[");
217   for (cpt=0; cpt<gras_arch_count; cpt++) {
218     printf("%s%s%ld%s",
219            cpt>0?", ":"",
220            cpt == GRAS_THISARCH ? "*":"",
221            ddt->aligned_size[cpt],
222            cpt == GRAS_THISARCH ? "*":"");
223   }
224   printf ("]\n");
225   if (ddt->category_code == e_gras_datadesc_type_cat_struct) {
226     gras_dd_cat_struct_t  struct_data;
227     gras_dd_cat_field_t  *field;
228
229     struct_data = ddt->category.struct_data;
230     gras_dynar_foreach(struct_data.fields, cpt, field) {
231     printf(">>> Dump field #%d (%s) (offset=%ld)\n",
232            cpt,field->name,field->offset[GRAS_THISARCH]);
233     gras_datadesc_type_dump(field->type);
234     printf("<<< end dump field #%d (%s)\n",cpt,field->name);
235     }
236  }
237   fflush(stdout);
238 }