1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 /****************************************************************************/
4 /* */
5 /* File: dddi.h */
6 /* */
7 /* Purpose: internal header file for ddd module */
8 /* */
9 /* Author: Klaus Birken */
10 /* Rechenzentrum Uni Stuttgart */
11 /* Universitaet Stuttgart */
12 /* Allmandring 30 */
13 /* 70550 Stuttgart */
14 /* internet: birken@rus.uni-stuttgart.de */
15 /* */
16 /* */
17 /* History: 93/11/22 kb begin */
18 /* 95/10/05 kb added casts to mem-management macros */
19 /* */
20 /* Remarks: */
21 /* */
22 /****************************************************************************/
23
24
25
26 /*
27 #define CheckIFMEM
28 #define CheckPMEM
29 #define CheckCplMEM
30 #define CheckMsgMEM
31 #define CheckTmpMEM
32 #define CheckHeapMem
33 */
34
35
36 /****************************************************************************/
37 /* */
38 /* auto include mechanism and other include files */
39 /* */
40 /****************************************************************************/
41
42 #ifndef __DDDI_H__
43 #define __DDDI_H__
44
45 #include <climits>
46 #include <memory>
47 #include <vector>
48
49 #include <cassert>
50
51 #include <dune/uggrid/parallel/ddd/dddcontext.hh>
52
53 #include <dune/uggrid/low/architecture.h>
54 #include <dune/uggrid/low/ugtypes.h>
55
56 #include <dune/uggrid/parallel/ppif/ppif.h>
57 #include <dune/uggrid/parallel/ddd/ctrl/stat.h>
58 #include <dune/uggrid/parallel/ddd/include/ddd.h>
59 #include <dune/uggrid/parallel/ddd/include/dddio.h>
60 #include <dune/uggrid/parallel/ddd/include/memmgr.h>
61
62 START_UGDIM_NAMESPACE
63
64 using namespace DDD;
65
66 /*
67 macro for exiting program in case of a severe error condition
68 */
69 #define HARD_EXIT assert(0)
70 /* #define HARD_EXIT exit(1) */
71
72
73 /*
74 macros for correct return or premature abort of a procedure
75 */
76 #define RET_ON_OK return (true)
77 #define RET_ON_ERROR return (false)
78 #define IS_OK(p) ((p)==true)
79
80
81 /****************************************************************************/
82 /* */
83 /* defines in the following order */
84 /* */
85 /* compile time constants defining static data size (i.e. arrays) */
86 /* other constants */
87 /* macros */
88 /* */
89 /****************************************************************************/
90
91 /*** DDD internal parameters ***/
92
93 #define MAX_PRIO 32 /* max. number of DDD_PRIO */
94 #define MAX_CPL_START 65536 /* max. number of local objects with coupling */
95
96 #ifdef WithFullObjectTable
97 #define MAX_OBJ_START 262144 /* max. number of locally registered objects */
98 #else
99 #define MAX_OBJ_START MAX_CPL_START
100 #endif
101
102
103
104 #define MAX_TRIES 50000000 /* max. number of tries until timeout in IF-comm */
105
106 #ifdef DDD_MAX_PROCBITS_IN_GID
107 #define MAX_PROCBITS_IN_GID DDD_MAX_PROCBITS_IN_GID
108 #else
109 #define MAX_PROCBITS_IN_GID 24 /* this allows 2^24 procs and 2^40 objects */
110 #endif
111
112 /* use maximum as default, if no Priomerge-matrix is available */
113 #define PRIOMERGE_DEFAULT PRIOMERGE_MAXIMUM
114
115
116
117 /*** DDD internal constants ***/
118
119 /* maximum number of procs allowed (limited by GID construction) */
120 #define MAX_PROCS (1<<MAX_PROCBITS_IN_GID)
121
122
123 #define GID_INVALID -1 /* invalid global id */
124 #define PRIO_INVALID (MAX_PRIO+1) /* invalid priority */
125 #define PROC_INVALID (MAX_PROCS+1) /* invalid processor number */
126 #define ERROR -1 /* standard error indicator */
127
128
129 /* types of virtual channels (for ppif interface) */
130 enum VChanType {
131 VC_IDENT = 15, /* channels used for identification module */
132 VC_IFCOMM = 16, /* channels used for interface module */
133 VC_TOPO = 17 /* channels used for xfer module (topology) */
134 };
135
136
137 /* results of an prio-merge operation. see mgr/prio.c for more details. */
138 enum PrioMergeVals {
139 PRIO_ERROR = -1,
140 PRIO_UNKNOWN,
141 PRIO_FIRST,
142 PRIO_SECOND
143 };
144
145
146
147 /****************************************************************************/
148
149 /* string constants */
150 #define STR_NOMEM "out of memory"
151
152
153 /****************************************************************************/
154 /* */
155 /* data structures exported by the corresponding source file */
156 /* */
157 /****************************************************************************/
158
159 /* macros for accessing COUPLING */
160 #define CPL_NEXT(cpl) ((cpl)->_next)
161 #define CPL_PROC(cpl) ((cpl)->_proc)
162
163 /* macros for accessing ELEM_DESC */
164 #define EDESC_REFTYPE(ed) ((ed)->_reftype)
165 #define EDESC_SET_REFTYPE(ed,rt) (ed)->_reftype=(rt)
166
167 /****************************************************************************/
168 /* */
169 /* definitions previously hold in misc.h */
170 /* */
171 /****************************************************************************/
172
173 #ifndef MIN
174 #define MIN(x,y) (((x)<(y)) ? (x) : (y))
175 #endif
176
177 #ifndef MAX
178 #define MAX(x,y) (((x)>(y)) ? (x) : (y))
179 #endif
180
181
182 /* round up to next alignment border */
183 #ifndef CEIL
184 #define CEIL(n) ((n)+((ALIGNMENT-((n)&(ALIGNMENT-1)))&(ALIGNMENT-1)))
185 #endif
186
187 /* round down to next alignment border */
188 #ifndef FLOOR
189 #define FLOOR(n) ((n)&ALIGNMASK)
190 #endif
191
192 #define YES 1
193 #define ON 1
194
195 #define NO 0
196 #define OFF 0
197
198
199
200 /****************************************************************************/
201 /* */
202 /* macros */
203 /* */
204 /****************************************************************************/
205
206
207 /* internal access of DDD_HEADER members */
208 #define ACCESS_HDR(o,c) ((o)->c)
209
210 /* type of object */
211 #define OBJ_TYPE(o) ACCESS_HDR(o,typ)
212
213 /* priority of object */
214 #define OBJ_PRIO(o) ACCESS_HDR(o,prio)
215
216 /* attr of object */
217 #define OBJ_ATTR(o) ACCESS_HDR(o,attr)
218
219 /* global id of object */
220 #define OBJ_GID(o) ACCESS_HDR(o,gid)
221 #define OBJ_GID_FMT DDD_GID_FMT
222
223 /* get index into global object table */
224 #define OBJ_INDEX(o) ACCESS_HDR(o,myIndex)
225
226 /* internal flags of object */
227 #define OBJ_FLAGS(o) ACCESS_HDR(o,flags)
228
229
230 /****************************************************************************/
231
232 /* usage of flags in DDD_HEADER */
233 #define MASK_OBJ_PRUNED 0x00000001
234 #define OBJ_PRUNED(c) (((int)(OBJ_FLAGS(c)))&MASK_OBJ_PRUNED)
235 #define SET_OBJ_PRUNED(c,d) (OBJ_FLAGS(c)) = ((OBJ_FLAGS(c))&(~MASK_OBJ_PRUNED))|((d)&MASK_OBJ_PRUNED)
236
237 #define MASK_OBJ_RESENT 0x00000002
238 #define SHIFT_OBJ_RESENT 1
239 #define OBJ_RESENT(c) ((((int)(OBJ_FLAGS(c)))&MASK_OBJ_RESENT)>>SHIFT_OBJ_RESENT)
240 #define SET_OBJ_RESENT(c,d) (OBJ_FLAGS(c)) = ((OBJ_FLAGS(c))&(~MASK_OBJ_RESENT))|(((d)<<SHIFT_OBJ_RESENT)&MASK_OBJ_RESENT)
241
242
243 /* usage of flags in COUPLING */
244 /* usage of 0x03 while interface-building, temporarily */
245 #define MASKCPLDIR 0x00000003
246 #define CPLDIR(c) (((int)((c)->_flags))&MASKCPLDIR)
247 #define SETCPLDIR(c,d) ((c)->_flags) = (((c)->_flags)&(~MASKCPLDIR))|((d)&MASKCPLDIR)
248
249 /* usage of 0x10 for remembering the memory origin for the COUPLING struct */
250 #define MASKCPLMEM 0x00000010
251 #define CPLMEM_EXTERNAL 0x00
252 #define CPLMEM_FREELIST 0x10
253 #define CPLMEM(c) (((int)((c)->_flags))&MASKCPLMEM)
254 #define SETCPLMEM_EXTERNAL(c) ((c)->_flags) = (((c)->_flags)&(~MASKCPLMEM))|(CPLMEM_EXTERNAL)
255 #define SETCPLMEM_FREELIST(c) ((c)->_flags) = (((c)->_flags)&(~MASKCPLMEM))|(CPLMEM_FREELIST)
256
257
258
259 /* convert DDD_OBJ to DDD_HDR and vice versa */
260
261 #define OBJ2HDR(obj,desc) ((DDD_HDR)(((char *)obj)+((desc)->offsetHeader)))
262 #define HDR2OBJ(hdr,desc) ((DDD_OBJ)(((char *)hdr)-((desc)->offsetHeader)))
263 #define OBJ_OBJ(context, hdr) ((DDD_OBJ)(((char *)hdr)- \
264 (context.typeDefs()[OBJ_TYPE(hdr)].offsetHeader)))
265
266
267 /****************************************************************************/
268
269 /*
270 macros for access of coupling tables
271 */
272
273 /* get boolean: does object have couplings? */
274 #define ObjHasCpl(context, o) (OBJ_INDEX(o) < context.couplingContext().nCpls)
275
276 /* get #couplings per object */
277 #define ObjNCpl(context, o) (ObjHasCpl(context, o) ? context.couplingContext().nCplTable[OBJ_INDEX(o)] : 0)
278 #define IdxNCpl(context, i) (context.couplingContext().nCplTable[i])
279
280 /* get pointer to object's coupling list */
281 #define ObjCplList(context, o) (ObjHasCpl(context, o) ? context.couplingContext().cplTable[OBJ_INDEX(o)] : nullptr)
282 #define IdxCplList(context, i) (context.couplingContext().cplTable[i])
283
284
285 /* DDD_HDR may be invalid */
286 #define MarkHdrInvalid(hdr) OBJ_INDEX(hdr)=(INT_MAX-1)
287 #define IsHdrInvalid(hdr) OBJ_INDEX(hdr)==(INT_MAX-1)
288
289 #ifndef WithFullObjectTable
290 #define MarkHdrLocal(hdr) OBJ_INDEX(hdr)=(INT_MAX)
291 #define IsHdrLocal(hdr) OBJ_INDEX(hdr)==(INT_MAX)
292 #endif
293
294 /****************************************************************************/
295
296 /** get default VChan to processor p */
297 inline
VCHAN_TO(const DDD::DDDContext & context,DDD_PROC p)298 const VChannelPtr VCHAN_TO(const DDD::DDDContext& context, DDD_PROC p)
299 {
300 return context.topoContext().theTopology[p];
301 }
302
303
304 /****************************************************************************/
305
306 /* types for StdIf-communication functions (see if/ifstd.ct) */
307 typedef int (*ExecProcHdrPtr)(DDD::DDDContext& context, DDD_HDR);
308 typedef int (*ExecProcHdrXPtr)(DDD::DDDContext& context, DDD_HDR, DDD_PROC, DDD_PRIO);
309 typedef int (*ComProcHdrPtr)(DDD::DDDContext& context, DDD_HDR, void *);
310 typedef int (*ComProcHdrXPtr)(DDD::DDDContext& context, DDD_HDR, void *, DDD_PROC, DDD_PRIO);
311
312
313 /****************************************************************************/
314 /* */
315 /* memory management */
316 /* */
317 /****************************************************************************/
318
319
320 #if defined(CheckPMEM) || defined(CheckIFMEM) || defined(CheckCplMEM) || defined(CheckMsgMEM) || defined(CheckTmpMEM) || defined(CheckHeapMem)
321
322 static void *dummy_ptr;
323 static char *mem_ptr;
324
325 #ifndef SST
326 #define SST (CEIL(sizeof(size_t)))
327 #define GET_SSTVAL(adr) *(size_t *)(((char *)adr)-SST)
328 #endif
329
330 #endif
331
332
333 /*** mapping memory allocation calls to memmgr_ calls ***/
334
335 #define AllocObj(s,t,p,a) memmgr_AllocOMEM((size_t)s,(int)t,(int)p,(int)a)
336
337
338 #ifdef CheckPMEM
339 #define AllocFix(s) \
340 (dummy_ptr = (mem_ptr=(char *)memmgr_AllocPMEM(SST+(size_t)s)) != NULL ? \
341 mem_ptr+SST : NULL); \
342 if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s; \
343 printf("MALL PFix adr=%08x size=%ld file=%s line=%d\n", \
344 dummy_ptr,s,__FILE__,__LINE__)
345 #else
346 #define AllocFix(s) memmgr_AllocPMEM((size_t)s)
347 #endif
348
349
350 #ifdef CheckMsgMEM
351 #define AllocMsg(s) \
352 (dummy_ptr = (mem_ptr=(char *)memmgr_AllocTMEM(SST+(size_t)s, TMEM_MSG)) \
353 != NULL ? \
354 mem_ptr+SST : NULL); \
355 if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s; \
356 printf("MALL TMsg adr=%08x size=%ld file=%s line=%d\n", \
357 dummy_ptr,s,__FILE__,__LINE__)
358 #else
359 #define AllocMsg(s) memmgr_AllocTMEM((size_t)s, TMEM_MSG)
360 #endif
361
362
363 #ifdef CheckTmpMEM
364 #define AllocTmp(s) \
365 (dummy_ptr = (mem_ptr=(char *)memmgr_AllocTMEM(SST+(size_t)s, TMEM_ANY)) \
366 != NULL ? \
367 mem_ptr+SST : NULL); \
368 if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s; \
369 printf("MALL TTmp adr=%08x size=%ld file=%s line=%d\n", \
370 dummy_ptr,s,__FILE__,__LINE__)
371
372 #define AllocTmpReq(s,r) \
373 (dummy_ptr = (mem_ptr=(char *)memmgr_AllocTMEM(SST+(size_t)s, r)) \
374 != NULL ? \
375 mem_ptr+SST : NULL); \
376 if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s; \
377 printf("MALL TTmp adr=%08x size=%ld kind=%d file=%s line=%d\n", \
378 dummy_ptr,s,r,__FILE__,__LINE__)
379 #else
380 #define AllocTmp(s) memmgr_AllocTMEM((size_t)s, TMEM_ANY)
381 #define AllocTmpReq(s,r) memmgr_AllocTMEM((size_t)s, r)
382 #endif
383
384
385 #ifdef CheckCplMEM
386 #define AllocCpl(s) \
387 (dummy_ptr = (mem_ptr=(char *)memmgr_AllocAMEM(SST+(size_t)s)) != NULL ? \
388 mem_ptr+SST : NULL); \
389 if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s; \
390 printf("MALL ACpl adr=%08x size=%ld file=%s line=%d\n", \
391 dummy_ptr,s,__FILE__,__LINE__)
392 #else
393 #define AllocCpl(s) memmgr_AllocAMEM((size_t)s)
394 #endif
395
396 #ifdef CheckIFMEM
397 #define AllocIF(s) \
398 (dummy_ptr = (mem_ptr=(char *)memmgr_AllocAMEM(SST+(size_t)s)) != NULL ? \
399 mem_ptr+SST : NULL); \
400 if (mem_ptr!=NULL) GET_SSTVAL(dummy_ptr) = s; \
401 printf("MALL AIF adr=%08x size=%ld file=%s line=%d\n", \
402 dummy_ptr,s,__FILE__,__LINE__)
403 #else
404 #define AllocIF(s) memmgr_AllocAMEM((size_t)s)
405 #endif
406
407
408
409 /*** mapping memory free calls to memmgr calls ***/
410
411 #define FreeObj(mem,s,t) memmgr_FreeOMEM(mem,(size_t)s,(int)t)
412
413
414
415 #ifdef CheckPMEM
416 #define FreeFix(mem) { \
417 size_t s=GET_SSTVAL(mem); \
418 memmgr_FreePMEM(((char *)mem)-SST); \
419 printf("FREE PFix adr=%08x size=%ld file=%s line=%d\n",\
420 mem,s,__FILE__,__LINE__); }
421 #else
422 #define FreeFix(mem) memmgr_FreePMEM(mem)
423 #endif
424
425 #ifdef CheckMsgMEM
426 #define FreeMsg(mem,size) { \
427 size_t s=GET_SSTVAL(mem); \
428 memmgr_FreeTMEM(((char *)mem)-SST, TMEM_MSG); \
429 printf("FREE TMsg adr=%08x size=%ld file=%s line=%d\n",\
430 mem,s,__FILE__,__LINE__); }
431 #else
432 #define FreeMsg(mem,size) memmgr_FreeTMEM(mem, TMEM_MSG)
433 #endif
434
435
436 #ifdef CheckTmpMEM
437 #define FreeTmp(mem,size) { \
438 size_t s=GET_SSTVAL(mem); \
439 memmgr_FreeTMEM(((char *)mem)-SST,TMEM_ANY); \
440 printf("FREE TTmp adr=%08x size=%ld file=%s line=%d\n",\
441 mem,s,__FILE__,__LINE__); }
442 #define FreeTmpReq(mem,size,r) { \
443 size_t s=GET_SSTVAL(mem); \
444 memmgr_FreeTMEM(((char *)mem)-SST,r); \
445 printf("FREE TTmp adr=%08x size=%ld kind=%d file=%s line=%d\n",\
446 mem,s,r,__FILE__,__LINE__); }
447 #else
448 #define FreeTmp(mem,size) memmgr_FreeTMEM(mem,TMEM_ANY)
449 #define FreeTmpReq(mem,size,r) memmgr_FreeTMEM(mem,r)
450 #endif
451
452
453 #ifdef CheckCplMEM
454 #define FreeCpl(mem) { \
455 size_t s=GET_SSTVAL(mem); \
456 memmgr_FreeAMEM(((char *)mem)-SST); \
457 printf("FREE ACpl adr=%08x size=%ld file=%s line=%d\n",\
458 mem,s,__FILE__,__LINE__); }
459 #else
460 #define FreeCpl(mem) memmgr_FreeAMEM(mem)
461 #endif
462
463 #ifdef CheckIFMEM
464 #define FreeIF(mem) { \
465 size_t s=GET_SSTVAL(mem); \
466 memmgr_FreeAMEM(((char *)mem)-SST); \
467 printf("FREE AIF adr=%08x size=%ld file=%s line=%d\n",\
468 mem,s,__FILE__,__LINE__); }
469 #else
470 #define FreeIF(mem) memmgr_FreeAMEM(mem)
471 #endif
472
473
474
475 /****************************************************************************/
476 /* */
477 /* function declarations */
478 /* */
479 /****************************************************************************/
480
481 /* ddd.c */
482 int DDD_GetOption(const DDD::DDDContext& context, DDD_OPTION);
483
484
485 /* typemgr.c */
486 void ddd_TypeMgrInit(DDD::DDDContext& context);
487 void ddd_TypeMgrExit(DDD::DDDContext& context);
488 int ddd_TypeDefined (TYPE_DESC *);
489
490
491 /* objmgr.c */
492 void ddd_ObjMgrInit(DDD::DDDContext& context);
493 void ddd_ObjMgrExit(DDD::DDDContext& context);
494 void ddd_EnsureObjTabSize(DDD::DDDContext& context, int);
495
496
497 /* cplmgr.c */
498 void ddd_CplMgrInit(DDD::DDDContext& context);
499 void ddd_CplMgrExit(DDD::DDDContext& context);
500 COUPLING *AddCoupling(DDD::DDDContext& context, DDD_HDR, DDD_PROC, DDD_PRIO);
501 COUPLING *ModCoupling(DDD::DDDContext& context, DDD_HDR, DDD_PROC, DDD_PRIO);
502 void DelCoupling(DDD::DDDContext& context, DDD_HDR, DDD_PROC);
503 void DisposeCouplingList(DDD::DDDContext& context, COUPLING *);
504 void DDD_InfoCoupling(const DDD::DDDContext& context, DDD_HDR);
505
506
507 /* mgr/prio.c */
508 enum PrioMergeVals PriorityMerge (const TYPE_DESC*, DDD_PRIO, DDD_PRIO, DDD_PRIO *);
509
510
511 /* if/if.c */
512 void ddd_IFInit(DDD::DDDContext& context);
513 void ddd_IFExit(DDD::DDDContext& context);
514 void IFAllFromScratch(DDD::DDDContext&);
515 void DDD_InfoIFImpl(DDD::DDDContext& context, DDD_IF);
516 void IFInvalidateShortcuts(DDD::DDDContext& context, DDD_TYPE);
517 int DDD_CheckInterfaces(DDD::DDDContext& context);
518
519 /* if/ifcmds.c */
520 void ddd_StdIFExchange (DDD::DDDContext& context, size_t, ComProcHdrPtr,ComProcHdrPtr);
521 void ddd_StdIFExecLocal (DDD::DDDContext& context, ExecProcHdrPtr);
522 void ddd_StdIFExchangeX (DDD::DDDContext& context, size_t, ComProcHdrXPtr,ComProcHdrXPtr);
523 void ddd_StdIFExecLocalX (DDD::DDDContext& context, ExecProcHdrXPtr);
524
525
526
527 /* xfer/xfer.c */
528 void ddd_XferInit(DDD::DDDContext& context);
529 void ddd_XferExit(DDD::DDDContext& context);
530 int ddd_XferActive(const DDD::DDDContext& context);
531 void ddd_XferRegisterDelete(DDD::DDDContext& context, DDD_HDR);
532
533
534 /* xfer/cmds.c */
535 void DDD_XferPrioChange(DDD::DDDContext& context, DDD_HDR, DDD_PRIO);
536
537
538 /* prio/pcmds.c */
539 void ddd_PrioInit(DDD::DDDContext& context);
540 void ddd_PrioExit(DDD::DDDContext& context);
541 bool ddd_PrioActive(const DDD::DDDContext& context);
542
543
544 /* join/join.c */
545 void ddd_JoinInit(DDD::DDDContext& context);
546 void ddd_JoinExit(DDD::DDDContext& context);
547 bool ddd_JoinActive(const DDD::DDDContext& context);
548
549
550 /* ident/ident.c */
551 void ddd_IdentInit(DDD::DDDContext& context);
552 void ddd_IdentExit(DDD::DDDContext& context);
553
554
555 /* basic/cons.c */
556 void ddd_ConsInit(DDD::DDDContext& context);
557 void ddd_ConsExit(DDD::DDDContext& context);
558
559 END_UGDIM_NAMESPACE
560 namespace DDD {
561 /* basic/topo.c */
562 void ddd_TopoInit(DDD::DDDContext& context);
563 void ddd_TopoExit(DDD::DDDContext& context);
564 DDD_PROC* DDD_ProcArray(DDD::DDDContext& context);
565 RETCODE DDD_GetChannels(DDD::DDDContext& context, int);
566 void DDD_DisplayTopo(const DDD::DDDContext& context);
567 } /* namespace DDD */
568 START_UGDIM_NAMESPACE
569
570
571 /* mgr/objmgr.c */
572 void DDD_HdrConstructorCopy(DDD::DDDContext& context, DDD_HDR, DDD_PRIO);
573 void ObjCopyGlobalData (TYPE_DESC *, DDD_OBJ, DDD_OBJ, size_t);
574 std::vector<DDD_HDR> LocalObjectsList(const DDD::DDDContext& context);
575 std::vector<DDD_HDR> LocalCoupledObjectsList(const DDD::DDDContext& context);
576
577 END_UGDIM_NAMESPACE
578 namespace DDD {
579 /* basic/reduct.c */
580 int ddd_GlobalSumInt(const DDD::DDDContext& context, int);
581 int ddd_GlobalMaxInt(const DDD::DDDContext& context, int);
582 int ddd_GlobalMinInt(const DDD::DDDContext& context, int);
583 } /* namespace DDD */
584 START_UGDIM_NAMESPACE
585
586
587 /* ctrl/stat.c */
588 void ddd_StatInit (void);
589 void ddd_StatExit (void);
590
591
592 END_UGDIM_NAMESPACE
593
594 #endif
595