1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #ifndef OPAL_DSS_INTERNAL_H_
26 #define OPAL_DSS_INTERNAL_H_
27
28 #include "opal_config.h"
29 #include "opal/constants.h"
30
31 #ifdef HAVE_SYS_TIME_H
32 #include <sys/time.h>
33 #endif
34
35 #include "opal/class/opal_pointer_array.h"
36
37 #include "opal/dss/dss.h"
38 #include "opal/util/proc.h"
39
40 #if !defined(STDC_HEADERS) && HAVE_MEMORY_H
41 # include <memory.h>
42 #endif
43 #include <string.h>
44
45 BEGIN_C_DECLS
46
47
48
49
50 #define OPAL_DSS_DEFAULT_INITIAL_SIZE 2048
51
52
53
54
55 #define OPAL_DSS_DEFAULT_THRESHOLD_SIZE 4096
56
57
58
59
60
61 #if SIZEOF_SIZE_T == 1
62 #define DSS_TYPE_SIZE_T OPAL_UINT8
63 #elif SIZEOF_SIZE_T == 2
64 #define DSS_TYPE_SIZE_T OPAL_UINT16
65 #elif SIZEOF_SIZE_T == 4
66 #define DSS_TYPE_SIZE_T OPAL_UINT32
67 #elif SIZEOF_SIZE_T == 8
68 #define DSS_TYPE_SIZE_T OPAL_UINT64
69 #else
70 #error Unsupported size_t size!
71 #endif
72
73
74
75
76
77 #if SIZEOF__BOOL == 1
78 #define DSS_TYPE_BOOL OPAL_UINT8
79 #elif SIZEOF__BOOL == 2
80 #define DSS_TYPE_BOOL OPAL_UINT16
81 #elif SIZEOF__BOOL == 4
82 #define DSS_TYPE_BOOL OPAL_UINT32
83 #elif SIZEOF__BOOL == 8
84 #define DSS_TYPE_BOOL OPAL_UINT64
85 #else
86 #error Unsupported bool size!
87 #endif
88
89
90
91
92
93 #if SIZEOF_INT == 1
94 #define DSS_TYPE_INT OPAL_INT8
95 #define DSS_TYPE_UINT OPAL_UINT8
96 #elif SIZEOF_INT == 2
97 #define DSS_TYPE_INT OPAL_INT16
98 #define DSS_TYPE_UINT OPAL_UINT16
99 #elif SIZEOF_INT == 4
100 #define DSS_TYPE_INT OPAL_INT32
101 #define DSS_TYPE_UINT OPAL_UINT32
102 #elif SIZEOF_INT == 8
103 #define DSS_TYPE_INT OPAL_INT64
104 #define DSS_TYPE_UINT OPAL_UINT64
105 #else
106 #error Unsupported int size!
107 #endif
108
109
110
111
112
113 #if SIZEOF_PID_T == 1
114 #define DSS_TYPE_PID_T OPAL_UINT8
115 #elif SIZEOF_PID_T == 2
116 #define DSS_TYPE_PID_T OPAL_UINT16
117 #elif SIZEOF_PID_T == 4
118 #define DSS_TYPE_PID_T OPAL_UINT32
119 #elif SIZEOF_PID_T == 8
120 #define DSS_TYPE_PID_T OPAL_UINT64
121 #else
122 #error Unsupported pid_t size!
123 #endif
124
125
126 #define UNPACK_SIZE_MISMATCH(unpack_type, remote_type, ret) \
127 do { \
128 switch(remote_type) { \
129 case OPAL_UINT8: \
130 UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint8_t, remote_type); \
131 break; \
132 case OPAL_INT8: \
133 UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int8_t, remote_type); \
134 break; \
135 case OPAL_UINT16: \
136 UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint16_t, remote_type); \
137 break; \
138 case OPAL_INT16: \
139 UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int16_t, remote_type); \
140 break; \
141 case OPAL_UINT32: \
142 UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint32_t, remote_type); \
143 break; \
144 case OPAL_INT32: \
145 UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int32_t, remote_type); \
146 break; \
147 case OPAL_UINT64: \
148 UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint64_t, remote_type); \
149 break; \
150 case OPAL_INT64: \
151 UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int64_t, remote_type); \
152 break; \
153 default: \
154 ret = OPAL_ERR_NOT_FOUND; \
155 } \
156 } while (0)
157
158
159
160
161 #define UNPACK_SIZE_MISMATCH_FOUND(unpack_type, tmptype, tmpdsstype) \
162 do { \
163 int32_t i; \
164 tmptype *tmpbuf = (tmptype*)malloc(sizeof(tmptype) * (*num_vals)); \
165 ret = opal_dss_unpack_buffer(buffer, tmpbuf, num_vals, tmpdsstype); \
166 for (i = 0 ; i < *num_vals ; ++i) { \
167 ((unpack_type*) dest)[i] = (unpack_type)(tmpbuf[i]); \
168 } \
169 free(tmpbuf); \
170 } while (0)
171
172
173
174
175
176 struct opal_dss_type_info_t {
177 opal_object_t super;
178
179 opal_data_type_t odti_type;
180
181 char *odti_name;
182
183 opal_dss_pack_fn_t odti_pack_fn;
184
185 opal_dss_unpack_fn_t odti_unpack_fn;
186
187 opal_dss_copy_fn_t odti_copy_fn;
188
189 opal_dss_compare_fn_t odti_compare_fn;
190
191 opal_dss_print_fn_t odti_print_fn;
192
193 bool odti_structured;
194 };
195
196
197
198 typedef struct opal_dss_type_info_t opal_dss_type_info_t;
199 OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_dss_type_info_t);
200
201
202
203
204 extern bool opal_dss_initialized;
205 extern bool opal_dss_debug;
206 extern int opal_dss_verbose;
207 extern int opal_dss_initial_size;
208 extern int opal_dss_threshold_size;
209 extern opal_pointer_array_t opal_dss_types;
210 extern opal_data_type_t opal_dss_num_reg_types;
211
212
213
214
215
216 int opal_dss_pack(opal_buffer_t *buffer, const void *src,
217 int32_t num_vals,
218 opal_data_type_t type);
219 int opal_dss_unpack(opal_buffer_t *buffer, void *dest,
220 int32_t *max_num_vals,
221 opal_data_type_t type);
222
223 int opal_dss_copy(void **dest, void *src, opal_data_type_t type);
224
225 int opal_dss_compare(const void *value1, const void *value2,
226 opal_data_type_t type);
227
228 int opal_dss_print(char **output, char *prefix, void *src, opal_data_type_t type);
229
230 int opal_dss_dump(int output_stream, void *src, opal_data_type_t type);
231
232 int opal_dss_peek(opal_buffer_t *buffer, opal_data_type_t *type,
233 int32_t *number);
234
235 int opal_dss_peek_type(opal_buffer_t *buffer, opal_data_type_t *type);
236
237 int opal_dss_unload(opal_buffer_t *buffer, void **payload,
238 int32_t *bytes_used);
239 int opal_dss_load(opal_buffer_t *buffer, void *payload, int32_t bytes_used);
240
241 int opal_dss_copy_payload(opal_buffer_t *dest, opal_buffer_t *src);
242
243 int opal_dss_register(opal_dss_pack_fn_t pack_fn,
244 opal_dss_unpack_fn_t unpack_fn,
245 opal_dss_copy_fn_t copy_fn,
246 opal_dss_compare_fn_t compare_fn,
247 opal_dss_print_fn_t print_fn,
248 bool structured,
249 const char *name, opal_data_type_t *type);
250
251 bool opal_dss_structured(opal_data_type_t type);
252
253 char *opal_dss_lookup_data_type(opal_data_type_t type);
254
255 void opal_dss_dump_data_types(int output);
256
257
258
259
260 OPAL_DECLSPEC int opal_dss_pack_buffer(opal_buffer_t *buffer, const void *src,
261 int32_t num_vals, opal_data_type_t type);
262
263 OPAL_DECLSPEC int opal_dss_unpack_buffer(opal_buffer_t *buffer, void *dst,
264 int32_t *num_vals, opal_data_type_t type);
265
266
267
268
269
270 int opal_dss_pack_null(opal_buffer_t *buffer, const void *src,
271 int32_t num_vals, opal_data_type_t type);
272 int opal_dss_pack_byte(opal_buffer_t *buffer, const void *src,
273 int32_t num_vals, opal_data_type_t type);
274
275 int opal_dss_pack_bool(opal_buffer_t *buffer, const void *src,
276 int32_t num_vals, opal_data_type_t type);
277
278 int opal_dss_pack_int(opal_buffer_t *buffer, const void *src,
279 int32_t num_vals, opal_data_type_t type);
280 int opal_dss_pack_int16(opal_buffer_t *buffer, const void *src,
281 int32_t num_vals, opal_data_type_t type);
282 int opal_dss_pack_int32(opal_buffer_t *buffer, const void *src,
283 int32_t num_vals, opal_data_type_t type);
284 int opal_dss_pack_int64(opal_buffer_t *buffer, const void *src,
285 int32_t num_vals, opal_data_type_t type);
286
287 int opal_dss_pack_sizet(opal_buffer_t *buffer, const void *src,
288 int32_t num_vals, opal_data_type_t type);
289
290 int opal_dss_pack_pid(opal_buffer_t *buffer, const void *src,
291 int32_t num_vals, opal_data_type_t type);
292
293 int opal_dss_pack_string(opal_buffer_t *buffer, const void *src,
294 int32_t num_vals, opal_data_type_t type);
295
296 int opal_dss_pack_data_type(opal_buffer_t *buffer, const void *src,
297 int32_t num_vals, opal_data_type_t type);
298
299 int opal_dss_pack_byte_object(opal_buffer_t *buffer, const void *src,
300 int32_t num_vals, opal_data_type_t type);
301
302 int opal_dss_pack_pstat(opal_buffer_t *buffer, const void *src,
303 int32_t num_vals, opal_data_type_t type);
304
305 int opal_dss_pack_node_stat(opal_buffer_t *buffer, const void *src,
306 int32_t num_vals, opal_data_type_t type);
307
308 int opal_dss_pack_value(opal_buffer_t *buffer, const void *src,
309 int32_t num_vals, opal_data_type_t type);
310
311 int opal_dss_pack_buffer_contents(opal_buffer_t *buffer, const void *src,
312 int32_t num_vals, opal_data_type_t type);
313
314 int opal_dss_pack_float(opal_buffer_t *buffer, const void *src,
315 int32_t num_vals, opal_data_type_t type);
316
317 int opal_dss_pack_double(opal_buffer_t *buffer, const void *src,
318 int32_t num_vals, opal_data_type_t type);
319
320 int opal_dss_pack_timeval(opal_buffer_t *buffer, const void *src,
321 int32_t num_vals, opal_data_type_t type);
322
323 int opal_dss_pack_time(opal_buffer_t *buffer, const void *src,
324 int32_t num_vals, opal_data_type_t type);
325
326 int opal_dss_pack_name(opal_buffer_t *buffer, const void *src,
327 int32_t num_vals, opal_data_type_t type);
328
329 int opal_dss_pack_jobid(opal_buffer_t *buffer, const void *src,
330 int32_t num_vals, opal_data_type_t type);
331
332 int opal_dss_pack_vpid(opal_buffer_t *buffer, const void *src,
333 int32_t num_vals, opal_data_type_t type);
334
335 int opal_dss_pack_status(opal_buffer_t *buffer, const void *src,
336 int32_t num_vals, opal_data_type_t type);
337 int opal_dss_pack_envar(opal_buffer_t *buffer, const void *src,
338 int32_t num_vals, opal_data_type_t type);
339
340
341
342
343
344 int opal_dss_unpack_null(opal_buffer_t *buffer, void *dest,
345 int32_t *num_vals, opal_data_type_t type);
346 int opal_dss_unpack_byte(opal_buffer_t *buffer, void *dest,
347 int32_t *num_vals, opal_data_type_t type);
348
349 int opal_dss_unpack_bool(opal_buffer_t *buffer, void *dest,
350 int32_t *num_vals, opal_data_type_t type);
351
352 int opal_dss_unpack_int(opal_buffer_t *buffer, void *dest,
353 int32_t *num_vals, opal_data_type_t type);
354 int opal_dss_unpack_int16(opal_buffer_t *buffer, void *dest,
355 int32_t *num_vals, opal_data_type_t type);
356 int opal_dss_unpack_int32(opal_buffer_t *buffer, void *dest,
357 int32_t *num_vals, opal_data_type_t type);
358 int opal_dss_unpack_int64(opal_buffer_t *buffer, void *dest,
359 int32_t *num_vals, opal_data_type_t type);
360
361 int opal_dss_unpack_sizet(opal_buffer_t *buffer, void *dest,
362 int32_t *num_vals, opal_data_type_t type);
363
364 int opal_dss_unpack_pid(opal_buffer_t *buffer, void *dest,
365 int32_t *num_vals, opal_data_type_t type);
366
367 int opal_dss_unpack_string(opal_buffer_t *buffer, void *dest,
368 int32_t *num_vals, opal_data_type_t type);
369
370 int opal_dss_unpack_data_type(opal_buffer_t *buffer, void *dest,
371 int32_t *num_vals, opal_data_type_t type);
372
373 int opal_dss_unpack_byte_object(opal_buffer_t *buffer, void *dest,
374 int32_t *num_vals, opal_data_type_t type);
375
376 int opal_dss_unpack_pstat(opal_buffer_t *buffer, void *dest,
377 int32_t *num_vals, opal_data_type_t type);
378
379 int opal_dss_unpack_node_stat(opal_buffer_t *buffer, void *dest,
380 int32_t *num_vals, opal_data_type_t type);
381
382 int opal_dss_unpack_value(opal_buffer_t *buffer, void *dest,
383 int32_t *num_vals, opal_data_type_t type);
384
385 int opal_dss_unpack_buffer_contents(opal_buffer_t *buffer, void *dest,
386 int32_t *num_vals, opal_data_type_t type);
387
388 int opal_dss_unpack_float(opal_buffer_t *buffer, void *dest,
389 int32_t *num_vals, opal_data_type_t type);
390
391 int opal_dss_unpack_double(opal_buffer_t *buffer, void *dest,
392 int32_t *num_vals, opal_data_type_t type);
393
394 int opal_dss_unpack_timeval(opal_buffer_t *buffer, void *dest,
395 int32_t *num_vals, opal_data_type_t type);
396
397 int opal_dss_unpack_time(opal_buffer_t *buffer, void *dest,
398 int32_t *num_vals, opal_data_type_t type);
399
400 int opal_dss_unpack_name(opal_buffer_t *buffer, void *dest,
401 int32_t *num_vals, opal_data_type_t type);
402
403 int opal_dss_unpack_jobid(opal_buffer_t *buffer, void *dest,
404 int32_t *num_vals, opal_data_type_t type);
405
406 int opal_dss_unpack_vpid(opal_buffer_t *buffer, void *dest,
407 int32_t *num_vals, opal_data_type_t type);
408
409 int opal_dss_unpack_status(opal_buffer_t *buffer, void *dest,
410 int32_t *num_vals, opal_data_type_t type);
411
412 int opal_dss_unpack_envar(opal_buffer_t *buffer, void *dest,
413 int32_t *num_vals, opal_data_type_t type);
414
415
416
417
418
419 int opal_dss_std_copy(void **dest, void *src, opal_data_type_t type);
420
421 int opal_dss_copy_null(char **dest, char *src, opal_data_type_t type);
422
423 int opal_dss_copy_string(char **dest, char *src, opal_data_type_t type);
424
425 int opal_dss_copy_byte_object(opal_byte_object_t **dest, opal_byte_object_t *src,
426 opal_data_type_t type);
427
428 int opal_dss_copy_pstat(opal_pstats_t **dest, opal_pstats_t *src,
429 opal_data_type_t type);
430
431 int opal_dss_copy_node_stat(opal_node_stats_t **dest, opal_node_stats_t *src,
432 opal_data_type_t type);
433
434 int opal_dss_copy_value(opal_value_t **dest, opal_value_t *src,
435 opal_data_type_t type);
436
437 int opal_dss_copy_buffer_contents(opal_buffer_t **dest, opal_buffer_t *src,
438 opal_data_type_t type);
439
440 int opal_dss_copy_name(opal_process_name_t **dest, opal_process_name_t *src, opal_data_type_t type);
441
442 int opal_dss_copy_jobid(opal_jobid_t **dest, opal_jobid_t *src, opal_data_type_t type);
443
444 int opal_dss_copy_vpid(opal_vpid_t **dest, opal_vpid_t *src, opal_data_type_t type);
445
446 int opal_dss_copy_envar(opal_envar_t **dest, opal_envar_t *src, opal_data_type_t type);
447
448
449
450
451
452
453 int opal_dss_compare_bool(bool *value1, bool *value2, opal_data_type_t type);
454
455 int opal_dss_compare_int(int *value1, int *value2, opal_data_type_t type);
456 int opal_dss_compare_uint(unsigned int *value1, unsigned int *value2, opal_data_type_t type);
457
458 int opal_dss_compare_size(size_t *value1, size_t *value2, opal_data_type_t type);
459
460 int opal_dss_compare_pid(pid_t *value1, pid_t *value2, opal_data_type_t type);
461
462 int opal_dss_compare_byte(char *value1, char *value2, opal_data_type_t type);
463 int opal_dss_compare_char(char *value1, char *value2, opal_data_type_t type);
464 int opal_dss_compare_int8(int8_t *value1, int8_t *value2, opal_data_type_t type);
465 int opal_dss_compare_uint8(uint8_t *value1, uint8_t *value2, opal_data_type_t type);
466
467 int opal_dss_compare_int16(int16_t *value1, int16_t *value2, opal_data_type_t type);
468 int opal_dss_compare_uint16(uint16_t *value1, uint16_t *value2, opal_data_type_t type);
469
470 int opal_dss_compare_int32(int32_t *value1, int32_t *value2, opal_data_type_t type);
471 int opal_dss_compare_uint32(uint32_t *value1, uint32_t *value2, opal_data_type_t type);
472
473 int opal_dss_compare_int64(int64_t *value1, int64_t *value2, opal_data_type_t type);
474 int opal_dss_compare_uint64(uint64_t *value1, uint64_t *value2, opal_data_type_t type);
475
476 int opal_dss_compare_null(char *value1, char *value2, opal_data_type_t type);
477
478 int opal_dss_compare_string(char *value1, char *value2, opal_data_type_t type);
479
480 int opal_dss_compare_dt(opal_data_type_t *value1, opal_data_type_t *value2, opal_data_type_t type);
481
482 int opal_dss_compare_byte_object(opal_byte_object_t *value1, opal_byte_object_t *value2, opal_data_type_t type);
483
484 int opal_dss_compare_pstat(opal_pstats_t *value1, opal_pstats_t *value2, opal_data_type_t type);
485
486 int opal_dss_compare_node_stat(opal_node_stats_t *value1, opal_node_stats_t *value2, opal_data_type_t type);
487
488 int opal_dss_compare_value(opal_value_t *value1, opal_value_t *value2, opal_data_type_t type);
489
490 int opal_dss_compare_buffer_contents(opal_buffer_t *value1, opal_buffer_t *value2, opal_data_type_t type);
491
492 int opal_dss_compare_float(float *value1, float *value2, opal_data_type_t type);
493
494 int opal_dss_compare_double(double *value1, double *value2, opal_data_type_t type);
495
496 int opal_dss_compare_timeval(struct timeval *value1, struct timeval *value2, opal_data_type_t type);
497
498 int opal_dss_compare_time(time_t *value1, time_t *value2, opal_data_type_t type);
499
500 int opal_dss_compare_name(opal_process_name_t *value1,
501 opal_process_name_t *value2,
502 opal_data_type_t type);
503
504 int opal_dss_compare_vpid(opal_vpid_t *value1,
505 opal_vpid_t *value2,
506 opal_data_type_t type);
507
508 int opal_dss_compare_jobid(opal_jobid_t *value1,
509 opal_jobid_t *value2,
510 opal_data_type_t type);
511
512 int opal_dss_compare_status(int *value1, int *value2, opal_data_type_t type);
513 int opal_dss_compare_envar(opal_envar_t *value1, opal_envar_t *value2, opal_data_type_t type);
514
515
516
517
518 int opal_dss_print_byte(char **output, char *prefix, uint8_t *src, opal_data_type_t type);
519
520 int opal_dss_print_string(char **output, char *prefix, char *src, opal_data_type_t type);
521
522 int opal_dss_print_size(char **output, char *prefix, size_t *src, opal_data_type_t type);
523 int opal_dss_print_pid(char **output, char *prefix, pid_t *src, opal_data_type_t type);
524 int opal_dss_print_bool(char **output, char *prefix, bool *src, opal_data_type_t type);
525 int opal_dss_print_int(char **output, char *prefix, int *src, opal_data_type_t type);
526 int opal_dss_print_uint(char **output, char *prefix, int *src, opal_data_type_t type);
527 int opal_dss_print_uint8(char **output, char *prefix, uint8_t *src, opal_data_type_t type);
528 int opal_dss_print_uint16(char **output, char *prefix, uint16_t *src, opal_data_type_t type);
529 int opal_dss_print_uint32(char **output, char *prefix, uint32_t *src, opal_data_type_t type);
530 int opal_dss_print_int8(char **output, char *prefix, int8_t *src, opal_data_type_t type);
531 int opal_dss_print_int16(char **output, char *prefix, int16_t *src, opal_data_type_t type);
532 int opal_dss_print_int32(char **output, char *prefix, int32_t *src, opal_data_type_t type);
533 #ifdef HAVE_INT64_T
534 int opal_dss_print_uint64(char **output, char *prefix, uint64_t *src, opal_data_type_t type);
535 int opal_dss_print_int64(char **output, char *prefix, int64_t *src, opal_data_type_t type);
536 #else
537 int opal_dss_print_uint64(char **output, char *prefix, void *src, opal_data_type_t type);
538 int opal_dss_print_int64(char **output, char *prefix, void *src, opal_data_type_t type);
539 #endif
540 int opal_dss_print_null(char **output, char *prefix, void *src, opal_data_type_t type);
541 int opal_dss_print_data_type(char **output, char *prefix, opal_data_type_t *src, opal_data_type_t type);
542 int opal_dss_print_byte_object(char **output, char *prefix, opal_byte_object_t *src, opal_data_type_t type);
543 int opal_dss_print_pstat(char **output, char *prefix, opal_pstats_t *src, opal_data_type_t type);
544 int opal_dss_print_node_stat(char **output, char *prefix, opal_node_stats_t *src, opal_data_type_t type);
545 int opal_dss_print_value(char **output, char *prefix, opal_value_t *src, opal_data_type_t type);
546 int opal_dss_print_buffer_contents(char **output, char *prefix, opal_buffer_t *src, opal_data_type_t type);
547 int opal_dss_print_float(char **output, char *prefix, float *src, opal_data_type_t type);
548 int opal_dss_print_double(char **output, char *prefix, double *src, opal_data_type_t type);
549 int opal_dss_print_timeval(char **output, char *prefix, struct timeval *src, opal_data_type_t type);
550 int opal_dss_print_time(char **output, char *prefix, time_t *src, opal_data_type_t type);
551 int opal_dss_print_name(char **output, char *prefix, opal_process_name_t *name, opal_data_type_t type);
552 int opal_dss_print_jobid(char **output, char *prefix, opal_process_name_t *src, opal_data_type_t type);
553 int opal_dss_print_vpid(char **output, char *prefix, opal_process_name_t *src, opal_data_type_t type);
554 int opal_dss_print_status(char **output, char *prefix, int *src, opal_data_type_t type);
555 int opal_dss_print_envar(char **output, char *prefix,
556 opal_envar_t *src, opal_data_type_t type);
557
558
559
560
561
562
563 char* opal_dss_buffer_extend(opal_buffer_t *bptr, size_t bytes_to_add);
564
565 bool opal_dss_too_small(opal_buffer_t *buffer, size_t bytes_reqd);
566
567 opal_dss_type_info_t* opal_dss_find_type(opal_data_type_t type);
568
569 int opal_dss_store_data_type(opal_buffer_t *buffer, opal_data_type_t type);
570
571 int opal_dss_get_data_type(opal_buffer_t *buffer, opal_data_type_t *type);
572
573 END_C_DECLS
574
575 #endif