Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fixed licence and copyright. No more reference to da GRAS possee or the
[simgrid.git] / src / gras / DataDesc / datadesc.c
1 /* $Id$ */
2
3 /* datadesc - data description in order to send/recv it in GRAS             */
4
5 /* Copyright (c) 2004 Olivier Aumage, Martin Quinson. All rights reserved.  */
6
7 /* This program is free software; you can redistribute it and/or modify it
8  * under the terms of the license (GNU LGPL) which comes with this package. */
9
10 #include "gras/DataDesc/datadesc_private.h"
11
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(datadesc,gras,"Data description");
13 /* FIXME: make this host-dependent using a trick such as UserData*/
14 xbt_set_t gras_datadesc_set_local=NULL;
15
16
17 /* callback for array size when sending strings */
18 static int
19 _strlen_cb(gras_cbps_t vars, void *data) {
20
21   return 1+(long int)strlen(data);
22 }
23
24
25 /**
26  * gras_datadesc_init:
27  *
28  * Initialize the datadesc module.
29  * FIXME: We assume that when neither signed nor unsigned is given, 
30  *    that means signed. To be checked by configure.
31  **/
32 void
33 gras_datadesc_init(void) {
34   gras_datadesc_type_t ddt; /* What to add */
35
36   /* only initialize once */
37   if (gras_datadesc_set_local != NULL)
38     return;
39   
40   VERB0("Initializing DataDesc");
41   
42   gras_datadesc_set_local = xbt_set_new();
43   
44   ddt = gras_datadesc_scalar("signed char", 
45                              gras_ddt_scalar_char, 
46                              e_gras_dd_scalar_encoding_sint);
47   ddt = gras_datadesc_scalar("char", 
48                              gras_ddt_scalar_char, 
49                              e_gras_dd_scalar_encoding_sint);
50   ddt = gras_datadesc_scalar("unsigned char", 
51                              gras_ddt_scalar_char, 
52                              e_gras_dd_scalar_encoding_uint);
53   
54   ddt = gras_datadesc_scalar("signed short int", 
55                              gras_ddt_scalar_short, 
56                              e_gras_dd_scalar_encoding_sint);
57   ddt = gras_datadesc_scalar("short int", 
58                              gras_ddt_scalar_short, 
59                              e_gras_dd_scalar_encoding_sint);
60   ddt = gras_datadesc_scalar("unsigned short int", 
61                              gras_ddt_scalar_short, 
62                              e_gras_dd_scalar_encoding_uint);
63   
64   ddt = gras_datadesc_scalar("signed int", 
65                              gras_ddt_scalar_int, 
66                              e_gras_dd_scalar_encoding_sint);
67   ddt = gras_datadesc_scalar("int", 
68                              gras_ddt_scalar_int, 
69                              e_gras_dd_scalar_encoding_sint);
70   ddt = gras_datadesc_scalar("unsigned int", 
71                              gras_ddt_scalar_int, 
72                              e_gras_dd_scalar_encoding_uint);
73   
74   ddt = gras_datadesc_scalar("signed long int", 
75                              gras_ddt_scalar_long, 
76                              e_gras_dd_scalar_encoding_sint);
77   ddt = gras_datadesc_scalar("long int", 
78                              gras_ddt_scalar_long, 
79                              e_gras_dd_scalar_encoding_sint);
80   ddt = gras_datadesc_scalar("unsigned long int", 
81                              gras_ddt_scalar_long, 
82                              e_gras_dd_scalar_encoding_uint);
83   
84   ddt = gras_datadesc_scalar("signed long long int",
85                              gras_ddt_scalar_long_long, 
86                              e_gras_dd_scalar_encoding_sint);
87   ddt = gras_datadesc_scalar("long long int", 
88                              gras_ddt_scalar_long_long, 
89                              e_gras_dd_scalar_encoding_sint);
90   ddt = gras_datadesc_scalar("unsigned long long int", 
91                              gras_ddt_scalar_long_long, 
92                              e_gras_dd_scalar_encoding_uint);
93   
94   ddt = gras_datadesc_scalar("data pointer", 
95                              gras_ddt_scalar_pdata, 
96                              e_gras_dd_scalar_encoding_uint);
97   ddt = gras_datadesc_scalar("function pointer", 
98                              gras_ddt_scalar_pfunc, 
99                              e_gras_dd_scalar_encoding_uint);
100   
101   ddt = gras_datadesc_scalar("float", 
102                              gras_ddt_scalar_float, 
103                              e_gras_dd_scalar_encoding_float);
104   ddt = gras_datadesc_scalar("double", 
105                              gras_ddt_scalar_double, 
106                              e_gras_dd_scalar_encoding_float);
107
108   ddt = gras_datadesc_array_dyn("char[]", 
109                                 gras_datadesc_by_name("char"),
110                                 _strlen_cb);
111   ddt = gras_datadesc_ref("string",ddt);
112
113 }
114
115 /**
116  * gras_datadesc_exit:
117  *
118  * Finalize the datadesc module
119  **/
120 void
121 gras_datadesc_exit(void) {
122   VERB0("Exiting DataDesc");
123   xbt_set_free(&gras_datadesc_set_local);
124   DEBUG0("Exited DataDesc");
125 }
126
127 /**
128  * gras_datadesc_get_name:
129  *
130  * Returns the name of a datadescription (to ease the debug)
131  */
132 char *
133 gras_datadesc_get_name(gras_datadesc_type_t ddt) {
134   return ddt->name;
135 }
136 /**
137  * gras_datadesc_get_id:
138  *
139  * Returns the name of a datadescription (to ease the debug)
140  */
141 int
142 gras_datadesc_get_id(gras_datadesc_type_t ddt) {
143   return ddt->code;
144 }
145
146 /**
147  * gras_datadesc_size: 
148  *
149  * Returns the size occuped by data of this type (on the current arch).
150  *
151  */
152 int gras_datadesc_size(gras_datadesc_type_t type) {
153   return type->size[GRAS_THISARCH];
154 }
155
156 /**
157  * gras_datadesc_type_dump:
158  *
159  * For debugging purpose
160  */
161 void gras_datadesc_type_dump(const gras_datadesc_type_t ddt){
162   int cpt;
163
164   printf("DataDesc dump:");
165   if(!ddt) {
166     printf("(null)\n");
167     return;
168   }
169   printf ("%s (ID:%d)\n",ddt->name,ddt->code);
170   printf ("  category: %s\n",gras_datadesc_cat_names[ddt->category_code]);
171
172   printf ("  size[");
173   for (cpt=0; cpt<gras_arch_count; cpt++) {
174     printf("%s%s%ld%s",
175            cpt>0?", ":"",
176            cpt == GRAS_THISARCH ? ">":"",
177            ddt->size[cpt],
178            cpt == GRAS_THISARCH ? "<":"");
179   }
180   printf ("]\n");
181
182   printf ("  alignment[");
183   for (cpt=0; cpt<gras_arch_count; cpt++) {
184     printf("%s%s%ld%s",
185            cpt>0?", ":"",
186            cpt == GRAS_THISARCH ? ">":"",
187            ddt->alignment[cpt],
188            cpt == GRAS_THISARCH ? "<":"");
189   }
190   printf ("]\n");
191
192   printf ("  aligned_size[");
193   for (cpt=0; cpt<gras_arch_count; cpt++) {
194     printf("%s%s%ld%s",
195            cpt>0?", ":"",
196            cpt == GRAS_THISARCH ? ">":"",
197            ddt->aligned_size[cpt],
198            cpt == GRAS_THISARCH ? "<":"");
199   }
200   printf ("]\n");
201   if (ddt->category_code == e_gras_datadesc_type_cat_struct) {
202     gras_dd_cat_struct_t struct_data;
203     gras_dd_cat_field_t  field;
204
205     struct_data = ddt->category.struct_data;
206     xbt_dynar_foreach(struct_data.fields, cpt, field) {
207     printf(">>> Dump field #%d (%s) (offset=%ld)\n",
208            cpt,field->name,field->offset[GRAS_THISARCH]);
209     gras_datadesc_type_dump(field->type);
210     printf("<<< end dump field #%d (%s)\n",cpt,field->name);
211     }
212  }
213   fflush(stdout);
214 }