Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update
[simgrid.git] / cruft / doc / tmpl / gras-unused.sgml
1 <!-- ##### SECTION ./tmpl/DataDesc.sgml:Long_Description ##### -->
2 <para>In order to allow GRAS to send data over the network (or simply to
3 dupplicate it in SG), you have to describe the structure of data attached
4 with each message. This mecanism is stolen from NWS message passing
5 interface.</para>
6
7 <para>For each message, you have to declare a structure representing the
8 data to send as payload with the message.</para>
9
10 <refsect2>
11   <title>Sending (or receiving) simple structures</title>
12   <para>Let's imagin you want to declare a <command>STORE_STATE</command>
13   message, which will send some data to the memory server for inclusion in
14   the database. Here is the structure we want to send:</para>
15
16 <literallayout>
17  struct state {
18   char id[STATE_NAME_SIZE];
19   int rec_size;
20   int rec_count;
21   double seq_no;
22   double time_out;
23  };
24 </literallayout>
25
26   <para>And here is the structure description GRAS needs to be able to send
27   this over the network:</para>
28
29 <literallayout>
30  const static DataDescriptor stateDescriptor[] =
31   {SIMPLE_MEMBER(CHAR_TYPE, STATE_NAME_SIZE, offsetof(struct state, id)),
32    SIMPLE_MEMBER(INT_TYPE, 1, offsetof(struct state, rec_size)),
33    SIMPLE_MEMBER(INT_TYPE, 1, offsetof(struct state, rec_count)),
34    SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(struct state, seq_no)),
35    SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(struct state, time_out))};
36 </literallayout>
37
38   <para>Contrary to what one could think when you first see it, it's pretty
39   easy. A structure descriptor is a list of descriptions, describing each
40   field of the structure. For example, for the first field, you say that
41   the base type is <command>CHAR_TYPE</command>, that there is
42   <command>STATE_NAME_SIZE</command> element of this type and that it's
43   position in the structure is computed by <command>offsetof(struct state,
44   id)</command>. This leads to two remarks:</para> 
45
46   <itemizedlist>
47     <listitem>
48       <para>it's impossible to send dynamic sized strings that way. It's a
49       known limitation, but I think we can live with it.</para>
50     </listitem>
51     <listitem>
52       <para>Yes, the <command>offsetof(struct state, id)</command>
53       construction is C ANSI and is portable.</para>
54     </listitem>
55   </itemizedlist>
56 </refsect2>
57
58 <refsect2>
59   <title>Sending (or receiving) complex structure</title>
60   <para>How to send non-flat structures, do you ask? It's not harder. Let's
61   imagin you want to send the following structure:</para>
62
63 <literallayout>
64  typedef struct {
65    unsigned long address;
66    unsigned long port;
67  } CliqueMember;
68
69  typedef struct {
70    char name[MAX_CLIQUE_NAME_SIZE];
71    double whenGenerated;
72    double instance;
73    char skill[MAX_SKILL_SIZE];
74    char options[MAX_OPTIONS_SIZE];
75    double period;
76    double timeOut;
77    CliqueMember members[MAX_MEMBERS];
78    unsigned int count;
79    unsigned int leader;
80  } Clique;
81 </literallayout>
82
83   <para>As you can see, this structure contains an array of another user
84   defined structure. To be able to send <command>struct Clique</command>,
85   you have to describe each structures that way:</para>
86
87 <literallayout>
88  static const DataDescriptor cliqueMemberDescriptor[] =
89    {SIMPLE_MEMBER(UNSIGNED_LONG_TYPE, 1, offsetof(CliqueMember, address)),
90     SIMPLE_MEMBER(UNSIGNED_LONG_TYPE, 1, offsetof(CliqueMember, port))};
91
92  static const DataDescriptor cliqueDescriptor[] =
93    {SIMPLE_MEMBER(CHAR_TYPE, MAX_CLIQUE_NAME_SIZE, offsetof(Clique, name)),
94     SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(Clique, whenGenerated)),
95     SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(Clique, instance)),
96     SIMPLE_MEMBER(CHAR_TYPE, MAX_SKILL_SIZE, offsetof(Clique, skill)),
97     SIMPLE_MEMBER(CHAR_TYPE, MAX_OPTIONS_SIZE, offsetof(Clique, options)),
98     SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(Clique, period)),
99     SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(Clique, timeOut)),
100     {STRUCT_TYPE, MAX_MEMBERS, offsetof(Clique, members),
101      (DataDescriptor *)&amp;cliqueMemberDescriptor, cliqueMemberDescriptorLength,
102      PAD_BYTES(CliqueMember, port, unsigned long, 1)},
103     SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(Clique, count)),
104     SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(Clique, leader))};
105 </literallayout>
106
107   <para>So, even if less natural, it is possible to send structures 
108   containing structures with these tools.</para>
109
110   <para>You can see that it's not only impossible to send dynamic-sized
111   strings, it impossible to send dynamic-sized arrays. Here,
112   <command>MAX_MEMBERS</command> is the maximum of members a clique can
113   contain. In NWS, this value is defined to 100.  <warning><para>I'm not
114   sure, but I think that all the 100 values are sent each time, even if
115   there is only 3 non-null members. Yes, that's
116   bad.</para></warning></para>
117
118   <warning><para>The DataDescriptor_t MUST be const. Malloc'ing them and
119   then casting them on argument passing IS NOT OK. This is because we get
120   the number of elements in the array with the sizeof(dd)/sizeof(dd[0]).
121   </para></warning>
122 </refsect2>
123
124
125 <!-- ##### SECTION ./tmpl/DataDesc.sgml:See_Also ##### -->
126 <para>
127
128 </para>
129
130
131 <!-- ##### SECTION ./tmpl/DataDesc.sgml:Short_Description ##### -->
132 Describing the data
133
134
135 <!-- ##### SECTION ./tmpl/DataDesc.sgml:Title ##### -->
136 DataDescriptor API
137
138
139 <!-- ##### SECTION ./tmpl/ErrLog.sgml:Long_Description ##### -->
140 <para>
141
142 </para>
143
144
145 <!-- ##### SECTION ./tmpl/ErrLog.sgml:See_Also ##### -->
146 <para>
147
148 </para>
149
150
151 <!-- ##### SECTION ./tmpl/ErrLog.sgml:Short_Description ##### -->
152
153
154
155 <!-- ##### SECTION ./tmpl/ErrLog.sgml:Title ##### -->
156 ErrLog
157
158
159 <!-- ##### SECTION ./tmpl/Socks.sgml:Long_Description ##### -->
160 <para>
161
162 </para>
163
164
165 <!-- ##### SECTION ./tmpl/Socks.sgml:See_Also ##### -->
166 <para>
167
168 </para>
169
170
171 <!-- ##### SECTION ./tmpl/Socks.sgml:Short_Description ##### -->
172 Handling sockets
173
174
175 <!-- ##### SECTION ./tmpl/Socks.sgml:Title ##### -->
176 Sockets API
177
178
179 <!-- ##### SECTION ./tmpl/comm_callbacks.sgml:Long_Description ##### -->
180 <para>
181
182 </para>
183
184
185 <!-- ##### SECTION ./tmpl/comm_callbacks.sgml:See_Also ##### -->
186 <para>
187
188 </para>
189
190
191 <!-- ##### SECTION ./tmpl/comm_callbacks.sgml:Short_Description ##### -->
192
193
194
195 <!-- ##### SECTION ./tmpl/comm_callbacks.sgml:Title ##### -->
196 comm_callbacks
197
198
199 <!-- ##### SECTION ./tmpl/comm_cb.sgml:Long_Description ##### -->
200 <para>
201
202 </para>
203
204
205 <!-- ##### SECTION ./tmpl/comm_cb.sgml:See_Also ##### -->
206 <para>
207
208 </para>
209
210
211 <!-- ##### SECTION ./tmpl/comm_cb.sgml:Short_Description ##### -->
212
213
214
215 <!-- ##### SECTION ./tmpl/comm_cb.sgml:Title ##### -->
216 comm_cb
217
218
219 <!-- ##### SECTION ./tmpl/comm_datadesc_expert.sgml:Long_Description ##### -->
220 <para>
221
222 </para>
223
224
225 <!-- ##### SECTION ./tmpl/comm_datadesc_expert.sgml:See_Also ##### -->
226 <para>
227
228 </para>
229
230
231 <!-- ##### SECTION ./tmpl/comm_datadesc_expert.sgml:Short_Description ##### -->
232 Advanced ways to describe data (for experts)
233
234
235 <!-- ##### SECTION ./tmpl/comm_datadesc_expert.sgml:Title ##### -->
236 Advanced Data description
237
238
239 <!-- ##### SECTION ./tmpl/comm_dd_cbps.sgml:Long_Description ##### -->
240 <para>
241
242 </para>
243
244
245 <!-- ##### SECTION ./tmpl/comm_dd_cbps.sgml:See_Also ##### -->
246 <para>
247
248 </para>
249
250
251 <!-- ##### SECTION ./tmpl/comm_dd_cbps.sgml:Short_Description ##### -->
252
253
254
255 <!-- ##### SECTION ./tmpl/comm_dd_cbps.sgml:Title ##### -->
256 Data description callbacks persistant state
257
258
259 <!-- ##### SECTION ./tmpl/config.sgml:Long_Description ##### -->
260 <para>
261
262 </para>
263
264
265 <!-- ##### SECTION ./tmpl/config.sgml:See_Also ##### -->
266 <para>
267
268 </para>
269
270
271 <!-- ##### SECTION ./tmpl/config.sgml:Short_Description ##### -->
272
273
274
275 <!-- ##### SECTION ./tmpl/config.sgml:Title ##### -->
276 config
277
278
279 <!-- ##### SECTION ./tmpl/dd_cbps.sgml:Long_Description ##### -->
280 <para>
281
282 </para>
283
284
285 <!-- ##### SECTION ./tmpl/dd_cbps.sgml:See_Also ##### -->
286 <para>
287
288 </para>
289
290
291 <!-- ##### SECTION ./tmpl/dd_cbps.sgml:Short_Description ##### -->
292
293
294
295 <!-- ##### SECTION ./tmpl/dd_cbps.sgml:Title ##### -->
296 Data description callbacks persistant state
297
298
299 <!-- ##### SECTION ./tmpl/dd_internal.sgml:Long_Description ##### -->
300 <para>
301
302 </para>
303
304
305 <!-- ##### SECTION ./tmpl/dd_internal.sgml:See_Also ##### -->
306 <para>
307
308 </para>
309
310
311 <!-- ##### SECTION ./tmpl/dd_internal.sgml:Short_Description ##### -->
312
313
314
315 <!-- ##### SECTION ./tmpl/dd_internal.sgml:Title ##### -->
316 Implementation of data description
317
318
319 <!-- ##### SECTION ./tmpl/dico.sgml:Long_Description ##### -->
320 <para>
321
322 </para>
323
324
325 <!-- ##### SECTION ./tmpl/dico.sgml:See_Also ##### -->
326 <para>
327
328 </para>
329
330
331 <!-- ##### SECTION ./tmpl/dico.sgml:Short_Description ##### -->
332
333
334
335 <!-- ##### SECTION ./tmpl/dico.sgml:Title ##### -->
336 dico
337
338
339 <!-- ##### SECTION ./tmpl/dynar.sgml:Long_Description ##### -->
340 <para>
341 This module provide the quite usual dynamic array facility.
342 </para>
343
344
345 <!-- ##### SECTION ./tmpl/dynar.sgml:See_Also ##### -->
346 <para>
347
348 </para>
349
350
351 <!-- ##### SECTION ./tmpl/dynar.sgml:Short_Description ##### -->
352 Dynamic array
353
354
355 <!-- ##### SECTION ./tmpl/dynar.sgml:Title ##### -->
356 dynar
357
358
359 <!-- ##### SECTION ./tmpl/gras-overview.sgml:Long_Description ##### -->
360     <para>This document introduce the GRAS library (<emphasis>Grid Reality
361     And Simulation</emphasis>, or according to my english dictionary,
362     <emphasis>Generally Recognized As Safe</emphasis> ;).</para>
363     
364     <refsect2>
365       <title>Overview</title>
366       <para>The purpose of the GRAS is to allow the developpement of
367       distributed programs which will work with as few as possible
368       modification both on the SimGrid simulator (SG), and in the Real Life
369       (RL).</para>
370
371       <para>Here are the problems when you want to do so:
372         <itemizedlist>
373           <listitem>
374             <para>Communication in SG is done by passing tasks, while in
375             RL, you have to deal with sockets (or any wrapper to it).</para>
376           </listitem>
377           <listitem><para>In RL, each process should provide a main()
378             function, and it's obviously not the case in SG.</para>
379           </listitem>
380         </itemizedlist>
381       </para>
382     </refsect2>
383     <refsect2>
384       <title>Application class target</title>
385       <para>If you want to run your code both in RL and in SG, you won't be
386       able to use the full set of features offered by any of those two
387       worlds. GRAS tries to provide a suffisent set of features to develop
388       your application, and implement them in both worlds.</para>
389
390       <para>GRAS uses the paradigm of <emphasis>event-driven 
391       programming</emphasis>, which is an extension to the message-passing
392       one. Any process of a typical event-driven application declares
393       callback to incoming events, which can be messages from other
394       processes, timers or others.</para>
395
396       <para>All messages have an header, specifying its type, and attached
397       data, represented as one or several C structures. In order to send
398       the data over the network in RL, a type-description mecanism is
399       provided, and the RL version of GRAS implements CDR
400       functionnalities. That is to say that the data are sent in the native
401       format of the sender host, and converted on the destination host only
402       if needed.</para>
403
404       <para>In order to not reimplement the wheel, GRAS use existing code,
405       and adapt them to make them work together. The SG version naturally
406       use the SimGrid toolkit, while the RL version is based over the
407       communication library used in NWS (note that this library was somehow
408       modified, since the previous version use XDR, ie both the sender and
409       the receiver convert the data from/to a so called network
410       format). That's why some basic knowledge about how NWS work is
411       supposed in this document. But don't worry, you only have to know the
412       basics about NWS, the internals needed to understand the document
413       will be presented when needed.</para>
414     </refsect2>
415
416
417 <!-- ##### SECTION ./tmpl/gras-overview.sgml:See_Also ##### -->
418 <para>
419
420 </para>
421
422
423 <!-- ##### SECTION ./tmpl/gras-overview.sgml:Short_Description ##### -->
424 Overview of the GRAS library
425
426
427 <!-- ##### SECTION ./tmpl/gras-overview.sgml:Title ##### -->
428 Overview
429
430
431 <!-- ##### SECTION ./tmpl/gras.sgml:Long_Description ##### -->
432 <para>
433
434 </para>
435
436
437 <!-- ##### SECTION ./tmpl/gras.sgml:See_Also ##### -->
438 <para>
439
440 </para>
441
442
443 <!-- ##### SECTION ./tmpl/gras.sgml:Short_Description ##### -->
444
445
446
447 <!-- ##### SECTION ./tmpl/gras.sgml:Title ##### -->
448 gras
449
450
451 <!-- ##### SECTION ./tmpl/gras_private.sgml:Long_Description ##### -->
452 <para>
453
454 </para>
455
456
457 <!-- ##### SECTION ./tmpl/gras_private.sgml:See_Also ##### -->
458 <para>
459
460 </para>
461
462
463 <!-- ##### SECTION ./tmpl/gras_private.sgml:Short_Description ##### -->
464
465
466
467 <!-- ##### SECTION ./tmpl/gras_private.sgml:Title ##### -->
468 gras_private
469
470
471 <!-- ##### SECTION ./tmpl/gras_rl.sgml:Long_Description ##### -->
472 <para>
473
474 </para>
475
476
477 <!-- ##### SECTION ./tmpl/gras_rl.sgml:See_Also ##### -->
478 <para>
479
480 </para>
481
482
483 <!-- ##### SECTION ./tmpl/gras_rl.sgml:Short_Description ##### -->
484 Implementation of GRAS suited for real life.
485
486
487 <!-- ##### SECTION ./tmpl/gras_rl.sgml:Title ##### -->
488 RL
489
490
491 <!-- ##### SECTION ./tmpl/gras_sg.sgml:Long_Description ##### -->
492 <para>
493   SimGrid was designed to ease the comparison of algorithms and
494   heuristics. That way, a lot of complicated notion from the system layer
495   were volontary left off. For example, migrating a process from an host to
496   another is as easy as: MSG_process_change_host(process, new_host).
497 </para>
498
499 <para>
500   No need to tell that performing this operation on real platform is really
501   harder. This simplification is a very good thing when you want to rapidly
502   prototype code, but makes things somehow more complicated in GRAS since
503   we want to have a realistic API, since it have to be implemented in
504   reality also.
505 </para>
506
507 <para>
508   The best example of complexity in GRAS_SG induced by simplicity in
509   SimGrid is the sockets handling. There is no "socket" in SG, but only
510   m_channel_t. In contrary to sockets from RL, no special treatment is
511   needed for a process before writing or reading on/from a channel. So, a
512   given channel can be pooled by more than one process. Likewise, you can
513   send data to a channel that nobody is actually listening to.
514 </para>
515
516 <para>
517   The SG implementation of GRAS repport as an error the fact that nobody is
518   listening to the socket when trying to open a socket, or send stuff using
519   a previously openned socket. That way, the SG version can be used to
520   debug all syncronization issues. For that, we store mainly the PID of
521   both the sender and the receiver in the socket structure, and then
522   resolve PID->process at the lastest moment. This search is a bit
523   expensive, but as long as there is no real garbage collection in SG, with
524   the information "dead process" within the structure, it's the only
525   solution to make sure that we won't dereference pointers to an old freed
526   structure when the process on the other side of the structure did finish
527   since the creation of the socket.
528 </para>
529
530 <para>
531   As said in the overview, the processes can declare to hear on several
532   sockets, but all incoming messages are handled by the same loop. So, we
533   can use only one channel per process, and use a table on each host to
534   determine to which process a message should be delivered depending on the
535   socket number provided by the sender.
536 </para>
537
538
539 <!-- ##### SECTION ./tmpl/gras_sg.sgml:See_Also ##### -->
540 <para>
541 RL, the implementation suited for real life.
542 </para>
543
544 <!--
545 Local variables:
546 sgml-parent-document:\.\./gras-docs\.sgml
547 sgml-omittag:t
548 sgml-shorttag:t
549 sgml-namecase-general:t
550 sgml-general-insert-case:lower
551 sgml-minimize-attributes:nil
552 sgml-always-quote-attributes:t
553 sgml-indent-step:2
554 sgml-indent-data:nil
555 sgml-exposed-tags:nil
556 sgml-local-catalogs:nil
557 sgml-local-ecat-files:nil
558 End:
559 -->
560
561
562 <!-- ##### SECTION ./tmpl/gras_sg.sgml:Short_Description ##### -->
563 Implementation of GRAS on top of the simulator.
564
565
566 <!-- ##### SECTION ./tmpl/gras_sg.sgml:Title ##### -->
567 SG
568
569
570 <!-- ##### SECTION ./tmpl/nws_comm.sgml:Long_Description ##### -->
571 <para>
572
573 </para>
574
575
576 <!-- ##### SECTION ./tmpl/nws_comm.sgml:See_Also ##### -->
577 <para>
578
579 </para>
580
581
582 <!-- ##### SECTION ./tmpl/nws_comm.sgml:Short_Description ##### -->
583
584
585
586 <!-- ##### SECTION ./tmpl/nws_comm.sgml:Title ##### -->
587 nws_comm
588
589
590 <!-- ##### SECTION ./tmpl/trp_socks.sgml:Long_Description ##### -->
591 <para>
592
593 </para>
594
595
596 <!-- ##### SECTION ./tmpl/trp_socks.sgml:See_Also ##### -->
597 <para>
598
599 </para>
600
601
602 <!-- ##### SECTION ./tmpl/trp_socks.sgml:Short_Description ##### -->
603
604
605
606 <!-- ##### SECTION ./tmpl/trp_socks.sgml:Title ##### -->
607 Sockets
608
609
610 <!-- ##### MACRO BEGIN_DECL ##### -->
611 <para>
612
613 </para>
614
615
616 <!-- ##### MACRO CCRITICAL0 ##### -->
617 <para>
618
619 </para>
620
621 @c: 
622 @f: 
623
624 <!-- ##### MACRO CCRITICAL1 ##### -->
625 <para>
626
627 </para>
628
629 @c: 
630 @f: 
631 @a1: 
632
633 <!-- ##### MACRO CCRITICAL2 ##### -->
634 <para>
635
636 </para>
637
638 @c: 
639 @f: 
640 @a1: 
641 @a2: 
642
643 <!-- ##### MACRO CCRITICAL3 ##### -->
644 <para>
645
646 </para>
647
648 @c: 
649 @f: 
650 @a1: 
651 @a2: 
652 @a3: 
653
654 <!-- ##### MACRO CCRITICAL4 ##### -->
655 <para>
656
657 </para>
658
659 @c: 
660 @f: 
661 @a1: 
662 @a2: 
663 @a3: 
664 @a4: 
665
666 <!-- ##### MACRO CCRITICAL5 ##### -->
667 <para>
668
669 </para>
670
671 @c: 
672 @f: 
673 @a1: 
674 @a2: 
675 @a3: 
676 @a4: 
677 @a5: 
678
679 <!-- ##### MACRO CDEBUG0 ##### -->
680 <para>
681
682 </para>
683
684 @c: 
685 @f: 
686
687 <!-- ##### MACRO CDEBUG1 ##### -->
688 <para>
689
690 </para>
691
692 @c: 
693 @f: 
694 @a1: 
695
696 <!-- ##### MACRO CDEBUG2 ##### -->
697 <para>
698
699 </para>
700
701 @c: 
702 @f: 
703 @a1: 
704 @a2: 
705
706 <!-- ##### MACRO CDEBUG3 ##### -->
707 <para>
708
709 </para>
710
711 @c: 
712 @f: 
713 @a1: 
714 @a2: 
715 @a3: 
716
717 <!-- ##### MACRO CDEBUG4 ##### -->
718 <para>
719
720 </para>
721
722 @c: 
723 @f: 
724 @a1: 
725 @a2: 
726 @a3: 
727 @a4: 
728
729 <!-- ##### MACRO CDEBUG5 ##### -->
730 <para>
731
732 </para>
733
734 @c: 
735 @f: 
736 @a1: 
737 @a2: 
738 @a3: 
739 @a4: 
740 @a5: 
741
742 <!-- ##### MACRO CERROR0 ##### -->
743 <para>
744
745 </para>
746
747 @c: 
748 @f: 
749
750 <!-- ##### MACRO CERROR1 ##### -->
751 <para>
752
753 </para>
754
755 @c: 
756 @f: 
757 @a1: 
758
759 <!-- ##### MACRO CERROR2 ##### -->
760 <para>
761
762 </para>
763
764 @c: 
765 @f: 
766 @a1: 
767 @a2: 
768
769 <!-- ##### MACRO CERROR3 ##### -->
770 <para>
771
772 </para>
773
774 @c: 
775 @f: 
776 @a1: 
777 @a2: 
778 @a3: 
779
780 <!-- ##### MACRO CERROR4 ##### -->
781 <para>
782
783 </para>
784
785 @c: 
786 @f: 
787 @a1: 
788 @a2: 
789 @a3: 
790 @a4: 
791
792 <!-- ##### MACRO CERROR5 ##### -->
793 <para>
794
795 </para>
796
797 @c: 
798 @f: 
799 @a1: 
800 @a2: 
801 @a3: 
802 @a4: 
803 @a5: 
804
805 <!-- ##### MACRO CINFO0 ##### -->
806 <para>
807
808 </para>
809
810 @c: 
811 @f: 
812
813 <!-- ##### MACRO CINFO1 ##### -->
814 <para>
815
816 </para>
817
818 @c: 
819 @f: 
820 @a1: 
821
822 <!-- ##### MACRO CINFO2 ##### -->
823 <para>
824
825 </para>
826
827 @c: 
828 @f: 
829 @a1: 
830 @a2: 
831
832 <!-- ##### MACRO CINFO3 ##### -->
833 <para>
834
835 </para>
836
837 @c: 
838 @f: 
839 @a1: 
840 @a2: 
841 @a3: 
842
843 <!-- ##### MACRO CINFO4 ##### -->
844 <para>
845
846 </para>
847
848 @c: 
849 @f: 
850 @a1: 
851 @a2: 
852 @a3: 
853 @a4: 
854
855 <!-- ##### MACRO CINFO5 ##### -->
856 <para>
857
858 </para>
859
860 @c: 
861 @f: 
862 @a1: 
863 @a2: 
864 @a3: 
865 @a4: 
866 @a5: 
867
868 <!-- ##### MACRO CLOG0 ##### -->
869 <para>
870
871 </para>
872
873 @c: 
874 @p: 
875 @f: 
876
877 <!-- ##### MACRO CLOG1 ##### -->
878 <para>
879
880 </para>
881
882 @c: 
883 @p: 
884 @f: 
885 @a1: 
886
887 <!-- ##### MACRO CLOG2 ##### -->
888 <para>
889
890 </para>
891
892 @c: 
893 @p: 
894 @f: 
895 @a1: 
896 @a2: 
897
898 <!-- ##### MACRO CLOG3 ##### -->
899 <para>
900
901 </para>
902
903 @c: 
904 @p: 
905 @f: 
906 @a1: 
907 @a2: 
908 @a3: 
909
910 <!-- ##### MACRO CLOG4 ##### -->
911 <para>
912
913 </para>
914
915 @c: 
916 @p: 
917 @f: 
918 @a1: 
919 @a2: 
920 @a3: 
921 @a4: 
922
923 <!-- ##### MACRO CLOG5 ##### -->
924 <para>
925
926 </para>
927
928 @c: 
929 @p: 
930 @f: 
931 @a1: 
932 @a2: 
933 @a3: 
934 @a4: 
935 @a5: 
936
937 <!-- ##### MACRO CLOG6 ##### -->
938 <para>
939
940 </para>
941
942 @c: 
943 @p: 
944 @f: 
945 @a1: 
946 @a2: 
947 @a3: 
948 @a4: 
949 @a5: 
950 @a6: 
951
952 <!-- ##### MACRO CRITICAL0 ##### -->
953 <para>
954
955 </para>
956
957 @f: 
958
959 <!-- ##### MACRO CRITICAL1 ##### -->
960 <para>
961
962 </para>
963
964 @f: 
965 @a1: 
966
967 <!-- ##### MACRO CRITICAL2 ##### -->
968 <para>
969
970 </para>
971
972 @f: 
973 @a1: 
974 @a2: 
975
976 <!-- ##### MACRO CRITICAL3 ##### -->
977 <para>
978
979 </para>
980
981 @f: 
982 @a1: 
983 @a2: 
984 @a3: 
985
986 <!-- ##### MACRO CRITICAL4 ##### -->
987 <para>
988
989 </para>
990
991 @f: 
992 @a1: 
993 @a2: 
994 @a3: 
995 @a4: 
996
997 <!-- ##### MACRO CRITICAL5 ##### -->
998 <para>
999
1000 </para>
1001
1002 @f: 
1003 @a1: 
1004 @a2: 
1005 @a3: 
1006 @a4: 
1007 @a5: 
1008
1009 <!-- ##### MACRO CWARNING6 ##### -->
1010 <para>
1011
1012 </para>
1013
1014 @c: 
1015 @f: 
1016 @a1: 
1017 @a2: 
1018 @a3: 
1019 @a4: 
1020 @a5: 
1021 @a6: 
1022
1023 <!-- ##### FUNCTION CallAddr ##### -->
1024 <para>
1025
1026 </para>
1027
1028 @addr: 
1029 @Param2: 
1030 @sock: 
1031 @timeOut: 
1032 @Returns: 
1033
1034 <!-- ##### FUNCTION CloseSocket ##### -->
1035 <para>
1036
1037 </para>
1038
1039 @sock: 
1040 @waitForPeer: 
1041 @Returns: 
1042
1043 <!-- ##### FUNCTION ConvertData ##### -->
1044 <para>
1045
1046 </para>
1047
1048 @destination: 
1049 @source: 
1050 @description: 
1051 @length: 
1052 @sourceFormat: 
1053
1054 <!-- ##### FUNCTION CreateLocalChild ##### -->
1055 <para>
1056
1057 </para>
1058
1059 @pid: 
1060 @parentToChild: 
1061 @childToParent: 
1062 @Returns: 
1063
1064 <!-- ##### FUNCTION DROP_SOCKET ##### -->
1065 <para>
1066
1067 </para>
1068
1069 @sock: 
1070 @Returns: 
1071
1072 <!-- ##### FUNCTION DataSize ##### -->
1073 <para>
1074
1075 </para>
1076
1077 @description: 
1078 @length: 
1079 @format: 
1080 @Returns: 
1081
1082 <!-- ##### ENUM DataTypes ##### -->
1083 <para>
1084
1085 </para>
1086
1087 @CHAR_TYPE: 
1088 @DOUBLE_TYPE: 
1089 @FLOAT_TYPE: 
1090 @INT_TYPE: 
1091 @LONG_TYPE: 
1092 @SHORT_TYPE: 
1093 @UNSIGNED_INT_TYPE: 
1094 @UNSIGNED_LONG_TYPE: 
1095 @UNSIGNED_SHORT_TYPE: 
1096 @STRUCT_TYPE: 
1097 @LAST_TYPE: 
1098
1099 <!-- ##### FUNCTION DifferentFormat ##### -->
1100 <para>
1101
1102 </para>
1103
1104 @whatType: 
1105 @Returns: 
1106
1107 <!-- ##### FUNCTION DifferentOrder ##### -->
1108 <para>
1109
1110 </para>
1111
1112 @Returns: 
1113
1114 <!-- ##### FUNCTION DifferentSize ##### -->
1115 <para>
1116
1117 </para>
1118
1119 @whatType: 
1120 @Returns: 
1121
1122 <!-- ##### MACRO END_DECL ##### -->
1123 <para>
1124
1125 </para>
1126
1127
1128 <!-- ##### MACRO EODD ##### -->
1129 <para>
1130
1131 </para>
1132
1133
1134 <!-- ##### FUNCTION EstablishAnEar ##### -->
1135 <para>
1136
1137 </para>
1138
1139 @Param1: 
1140 @Param2: 
1141 @ear: 
1142 @earPort: 
1143 @Returns: 
1144
1145 <!-- ##### ENUM FormatTypes ##### -->
1146 <para>
1147
1148 </para>
1149
1150 @HOST_FORMAT: 
1151 @NETWORK_FORMAT: 
1152
1153 <!-- ##### MACRO GRAS_LOG_MAYDAY ##### -->
1154 <para>
1155
1156 </para>
1157
1158
1159 <!-- ##### MACRO GRAS_LOG_ROOT_CAT ##### -->
1160 <para>
1161
1162 </para>
1163
1164
1165 <!-- ##### MACRO HAVE_DLFCN_H ##### -->
1166 <para>
1167
1168 </para>
1169
1170
1171 <!-- ##### MACRO HAVE_INTTYPES_H ##### -->
1172 <para>
1173
1174 </para>
1175
1176
1177 <!-- ##### MACRO HAVE_LIBPTHREAD ##### -->
1178 <para>
1179
1180 </para>
1181
1182
1183 <!-- ##### MACRO HAVE_MEMORY_H ##### -->
1184 <para>
1185
1186 </para>
1187
1188
1189 <!-- ##### MACRO HAVE_STDINT_H ##### -->
1190 <para>
1191
1192 </para>
1193
1194
1195 <!-- ##### MACRO HAVE_STDLIB_H ##### -->
1196 <para>
1197
1198 </para>
1199
1200
1201 <!-- ##### MACRO HAVE_STRINGS_H ##### -->
1202 <para>
1203
1204 </para>
1205
1206
1207 <!-- ##### MACRO HAVE_STRING_H ##### -->
1208 <para>
1209
1210 </para>
1211
1212
1213 <!-- ##### MACRO HAVE_SYS_STAT_H ##### -->
1214 <para>
1215
1216 </para>
1217
1218
1219 <!-- ##### MACRO HAVE_SYS_TYPES_H ##### -->
1220 <para>
1221
1222 </para>
1223
1224
1225 <!-- ##### MACRO HAVE_UNISTD_H ##### -->
1226 <para>
1227
1228 </para>
1229
1230
1231 <!-- ##### FUNCTION HomogenousConvertData ##### -->
1232 <para>
1233
1234 </para>
1235
1236 @destination: 
1237 @source: 
1238 @whatType: 
1239 @repetitions: 
1240 @sourceFormat: 
1241
1242 <!-- ##### FUNCTION HomogenousDataSize ##### -->
1243 <para>
1244
1245 </para>
1246
1247 @whatType: 
1248 @repetitions: 
1249 @format: 
1250 @Returns: 
1251
1252 <!-- ##### TYPEDEF IPAddress ##### -->
1253 <para>
1254
1255 </para>
1256
1257
1258 <!-- ##### FUNCTION IPAddressImage ##### -->
1259 <para>
1260
1261 </para>
1262
1263 @addr: 
1264 @Returns: 
1265
1266 <!-- ##### FUNCTION IPAddressImage_r ##### -->
1267 <para>
1268
1269 </para>
1270
1271 @addr: 
1272 @Returns: 
1273
1274 <!-- ##### FUNCTION IPAddressMachine ##### -->
1275 <para>
1276
1277 </para>
1278
1279 @addr: 
1280 @Returns: 
1281
1282 <!-- ##### FUNCTION IPAddressMachine_r ##### -->
1283 <para>
1284
1285 </para>
1286
1287 @addr: 
1288 @Returns: 
1289
1290 <!-- ##### MACRO IPAddressValue ##### -->
1291 <para>
1292
1293 </para>
1294
1295 @machineOrAddress: 
1296 @address: 
1297
1298 <!-- ##### FUNCTION IPAddressValues ##### -->
1299 <para>
1300
1301 </para>
1302
1303 @machineOrAddress: 
1304 @addressList: 
1305 @atMost: 
1306 @Returns: 
1307
1308 <!-- ##### FUNCTION IncomingRequest ##### -->
1309 <para>
1310
1311 </para>
1312
1313 @timeOut: 
1314 @sd: 
1315 @ldap: 
1316 @Returns: 
1317
1318 <!-- ##### FUNCTION IsOkay ##### -->
1319 <para>
1320
1321 </para>
1322
1323 @sd: 
1324 @Returns: 
1325
1326 <!-- ##### FUNCTION IsPipe ##### -->
1327 <para>
1328
1329 </para>
1330
1331 @sd: 
1332 @Returns: 
1333
1334 <!-- ##### MACRO IsValidIP ##### -->
1335 <para>
1336
1337 </para>
1338
1339 @machineOrAddress: 
1340
1341 <!-- ##### MACRO LOG6 ##### -->
1342 <para>
1343
1344 </para>
1345
1346 @p: 
1347 @f: 
1348 @a1: 
1349 @a2: 
1350 @a3: 
1351 @a4: 
1352 @a5: 
1353 @a6: 
1354
1355 <!-- ##### FUNCTION MyMachineName ##### -->
1356 <para>
1357
1358 </para>
1359
1360 @Returns: 
1361
1362 <!-- ##### MACRO NO_SOCKET ##### -->
1363 <para>
1364
1365 </para>
1366
1367
1368 <!-- ##### FUNCTION NotifyOnDisconnection ##### -->
1369 <para>
1370
1371 </para>
1372
1373 @notifyFn: 
1374
1375 <!-- ##### FUNCTION OpenClientSocket ##### -->
1376 <para>
1377
1378 </para>
1379
1380 @addr: 
1381 @Param2: 
1382 @sock: 
1383 @Returns: 
1384
1385 <!-- ##### FUNCTION OpenServerSocket ##### -->
1386 <para>
1387
1388 </para>
1389
1390 @Param1: 
1391 @Param2: 
1392 @ear: 
1393 @earPort: 
1394 @Returns: 
1395
1396 <!-- ##### MACRO PACKAGE ##### -->
1397 <para>
1398
1399 </para>
1400
1401
1402 <!-- ##### MACRO PACKAGE_BUGREPORT ##### -->
1403 <para>
1404
1405 </para>
1406
1407
1408 <!-- ##### MACRO PACKAGE_NAME ##### -->
1409 <para>
1410
1411 </para>
1412
1413
1414 <!-- ##### MACRO PACKAGE_STRING ##### -->
1415 <para>
1416
1417 </para>
1418
1419
1420 <!-- ##### MACRO PACKAGE_TARNAME ##### -->
1421 <para>
1422
1423 </para>
1424
1425
1426 <!-- ##### MACRO PACKAGE_VERSION ##### -->
1427 <para>
1428
1429 </para>
1430
1431
1432 <!-- ##### MACRO PAD_BYTES ##### -->
1433 <para>
1434
1435 </para>
1436
1437 @structType: 
1438 @lastMember: 
1439 @memberType: 
1440 @repetitions: 
1441
1442 <!-- ##### FUNCTION PassSocket ##### -->
1443 <para>
1444
1445 </para>
1446
1447 @sock: 
1448 @child: 
1449 @Returns: 
1450
1451 <!-- ##### FUNCTION Peer ##### -->
1452 <para>
1453
1454 </para>
1455
1456 @sd: 
1457 @Returns: 
1458
1459 <!-- ##### FUNCTION PeerName ##### -->
1460 <para>
1461
1462 </para>
1463
1464 @sd: 
1465 @Returns: 
1466
1467 <!-- ##### FUNCTION PeerName_r ##### -->
1468 <para>
1469
1470 </para>
1471
1472 @sd: 
1473 @Returns: 
1474
1475 <!-- ##### FUNCTION ReverseData ##### -->
1476 <para>
1477
1478 </para>
1479
1480 @destination: 
1481 @source: 
1482 @whatType: 
1483 @repetitions: 
1484 @format: 
1485
1486 <!-- ##### MACRO SIMPLE_DATA ##### -->
1487 <para>
1488
1489 </para>
1490
1491 @type: 
1492 @repetitions: 
1493
1494 <!-- ##### MACRO SIMPLE_MEMBER ##### -->
1495 <para>
1496
1497 </para>
1498
1499 @type: 
1500 @repetitions: 
1501 @offset: 
1502
1503 <!-- ##### MACRO SIMPLE_TYPE_COUNT ##### -->
1504 <para>
1505
1506 </para>
1507
1508
1509 <!-- ##### MACRO STDC_HEADERS ##### -->
1510 <para>
1511
1512 </para>
1513
1514
1515 <!-- ##### TYPEDEF Socket ##### -->
1516 <para>
1517
1518 </para>
1519
1520
1521 <!-- ##### FUNCTION SocketFailure ##### -->
1522 <para>
1523
1524 </para>
1525
1526 @sig: 
1527
1528 <!-- ##### USER_FUNCTION SocketFunction ##### -->
1529 <para>
1530
1531 </para>
1532
1533 @Param1: 
1534
1535 <!-- ##### FUNCTION SocketInUse ##### -->
1536 <para>
1537
1538 </para>
1539
1540 @sd: 
1541 @Returns: 
1542
1543 <!-- ##### FUNCTION SocketIsAvailable ##### -->
1544 <para>
1545
1546 </para>
1547
1548 @sd: 
1549 @Returns: 
1550
1551 <!-- ##### MACRO VERSION ##### -->
1552 <para>
1553
1554 </para>
1555
1556
1557 <!-- ##### MACRO WARNING6 ##### -->
1558 <para>
1559
1560 </para>
1561
1562 @f: 
1563 @a1: 
1564 @a2: 
1565 @a3: 
1566 @a4: 
1567 @a5: 
1568 @a6: 
1569
1570 <!-- ##### USER_FUNCTION grasCallbackFunction ##### -->
1571 <para>
1572
1573 </para>
1574
1575 @sd: 
1576 @msgType: 
1577 @vdata: 
1578
1579 <!-- ##### FUNCTION grasCloseSocket ##### -->
1580 <para>
1581
1582 </para>
1583
1584 @sock: 
1585 @Returns: 
1586
1587 <!-- ##### FUNCTION grasDataDescCmp ##### -->
1588 <para>
1589
1590 </para>
1591
1592 @dd1: 
1593 @c1: 
1594 @dd2: 
1595 @c2: 
1596 @Returns: 
1597 @description: 
1598
1599 <!-- ##### FUNCTION grasDataDescCount ##### -->
1600 <para>
1601
1602 </para>
1603
1604 @description: 
1605 @Returns: 
1606
1607 <!-- ##### FUNCTION grasDataRecv ##### -->
1608 <para>
1609
1610 </para>
1611
1612 @sd: 
1613 @data: 
1614 @description: 
1615 @description_length: 
1616 @repetition: 
1617 @Returns: 
1618
1619 <!-- ##### FUNCTION grasDataSend ##### -->
1620 <para>
1621
1622 </para>
1623
1624 @sd: 
1625 @data: 
1626 @description: 
1627 @description_length: 
1628 @repetition: 
1629 @Returns: 
1630
1631 <!-- ##### FUNCTION grasDataSize ##### -->
1632 <para>
1633
1634 </para>
1635
1636 @description: 
1637 @ft: 
1638 @Returns: 
1639
1640 <!-- ##### ENUM grasError_t ##### -->
1641 <para>
1642
1643 </para>
1644
1645 @no_error: 
1646 @malloc_error: 
1647 @mismatch_error: 
1648 @sanity_error: 
1649 @system_error: 
1650 @network_error: 
1651 @timeout_error: 
1652 @thread_error: 
1653 @unknown_error: 
1654
1655 <!-- ##### FUNCTION grasLock ##### -->
1656 <para>
1657
1658 </para>
1659
1660 @Returns: 
1661
1662 <!-- ##### TYPEDEF grasMessageType_t ##### -->
1663 <para>
1664
1665 </para>
1666
1667
1668 <!-- ##### FUNCTION grasMsgDiscard ##### -->
1669 <para>
1670
1671 </para>
1672
1673 @sd: 
1674 @size: 
1675
1676 <!-- ##### FUNCTION grasMsgEntryGet ##### -->
1677 <para>
1678
1679 </para>
1680
1681 @id: 
1682 @Returns: 
1683
1684 <!-- ##### TYPEDEF grasMsgEntry_t ##### -->
1685 <para>
1686
1687 </para>
1688
1689
1690 <!-- ##### FUNCTION grasMsgFree ##### -->
1691 <para>
1692
1693 </para>
1694
1695 @msg: 
1696
1697 <!-- ##### FUNCTION grasMsgHandle ##### -->
1698 <para>
1699
1700 </para>
1701
1702 @timeOut: 
1703
1704 <!-- ##### FUNCTION grasMsgHeaderNew ##### -->
1705 <para>
1706
1707 </para>
1708
1709 @msgId: 
1710 @dataSize: 
1711 @seqCount: 
1712 @Returns: 
1713
1714 <!-- ##### FUNCTION grasMsgNew ##### -->
1715 <para>
1716
1717 </para>
1718
1719 @msgId: 
1720 @free_data_on_free: 
1721 @seqCount: 
1722 @Varargs: 
1723 @Returns: 
1724
1725 <!-- ##### FUNCTION grasMsgRecv ##### -->
1726 <para>
1727
1728 </para>
1729
1730 @msg: 
1731 @timeout: 
1732 @Returns: 
1733 @sd: 
1734
1735 <!-- ##### FUNCTION grasMsgRegister ##### -->
1736 <para>
1737
1738 </para>
1739
1740 @message: 
1741 @name: 
1742 @sequence_count: 
1743 @Varargs: 
1744 @Returns: 
1745
1746 <!-- ##### FUNCTION grasMsgSend ##### -->
1747 <para>
1748
1749 </para>
1750
1751 @sd: 
1752 @message: 
1753 @sequence_count: 
1754 @Varargs: 
1755 @Returns: 
1756
1757 <!-- ##### FUNCTION grasMsgWait ##### -->
1758 <para>
1759
1760 </para>
1761
1762 @sd: 
1763 @timeout: 
1764 @message: 
1765 @sequence_count: 
1766 @Varargs: 
1767 @Returns: 
1768
1769 <!-- ##### FUNCTION grasMyMachineName ##### -->
1770 <para>
1771
1772 </para>
1773
1774 @Returns: 
1775
1776 <!-- ##### FUNCTION grasOpenClientSocket ##### -->
1777 <para>
1778
1779 </para>
1780
1781 @host: 
1782 @Param2: 
1783 @sock: 
1784 @Returns: 
1785
1786 <!-- ##### FUNCTION grasOpenServerSocket ##### -->
1787 <para>
1788
1789 </para>
1790
1791 @Param1: 
1792 @Param2: 
1793 @sock: 
1794 @Returns: 
1795
1796 <!-- ##### MACRO grasPROTOCOL ##### -->
1797 <para>
1798
1799 </para>
1800
1801
1802 <!-- ##### FUNCTION grasPeerGetAddress ##### -->
1803 <para>
1804
1805 </para>
1806
1807 @sd: 
1808 @Returns: 
1809
1810 <!-- ##### FUNCTION grasPeerGetName ##### -->
1811 <para>
1812
1813 </para>
1814
1815 @sd: 
1816 @Returns: 
1817
1818 <!-- ##### FUNCTION grasRecvData ##### -->
1819 <para>
1820
1821 </para>
1822
1823 @sd: 
1824 @data: 
1825 @description: 
1826 @Returns: 
1827
1828 <!-- ##### FUNCTION grasRegisterCallback ##### -->
1829 <para>
1830
1831 </para>
1832
1833 @message: 
1834 @TTL: 
1835 @cb: 
1836
1837 <!-- ##### FUNCTION grasSendData ##### -->
1838 <para>
1839
1840 </para>
1841
1842 @sd: 
1843 @data: 
1844 @description: 
1845 @Returns: 
1846
1847 <!-- ##### FUNCTION grasUnlock ##### -->
1848 <para>
1849
1850 </para>
1851
1852 @Returns: 
1853
1854 <!-- ##### FUNCTION grasUserdataGet ##### -->
1855 <para>
1856
1857 </para>
1858
1859
1860 <!-- ##### MACRO grasUserdataNew ##### -->
1861 <para>
1862
1863 </para>
1864
1865 @type: 
1866
1867 <!-- ##### FUNCTION grasUserdataSet ##### -->
1868 <para>
1869
1870 </para>
1871
1872 @ud: 
1873
1874 <!-- ##### FUNCTION gras_datadesc_cmp ##### -->
1875 <para>
1876
1877 </para>
1878
1879 @d1: 
1880 @d2: 
1881 @Returns: 
1882 @dd1: 
1883 @c1: 
1884 @dd2: 
1885 @c2: 
1886
1887 <!-- ##### FUNCTION gras_datadesc_copy_data ##### -->
1888 <para>
1889
1890 </para>
1891
1892 @dd: 
1893 @c: 
1894 @data: 
1895
1896 <!-- ##### MACRO gras_datadesc_declare_array ##### -->
1897 <para>
1898
1899 </para>
1900
1901 @name: 
1902 @elm_type: 
1903 @size: 
1904 @code: 
1905
1906 <!-- ##### FUNCTION gras_datadesc_declare_array_cb ##### -->
1907 <para>
1908
1909 </para>
1910
1911 @name: 
1912 @element_type: 
1913 @fixed_size: 
1914 @dynamic_size: 
1915 @post: 
1916 @code: 
1917 @Returns: 
1918
1919 <!-- ##### FUNCTION gras_datadesc_declare_ref_cb ##### -->
1920 <para>
1921
1922 </para>
1923
1924 @name: 
1925 @referenced_type: 
1926 @discriminant: 
1927 @post: 
1928 @code: 
1929 @Returns: 
1930
1931 <!-- ##### MACRO gras_datadesc_declare_ref_disc ##### -->
1932 <para>
1933
1934 </para>
1935
1936 @name: 
1937 @discriminant: 
1938 @code: 
1939
1940 <!-- ##### MACRO gras_datadesc_declare_struct_add_code ##### -->
1941 <para>
1942
1943 </para>
1944
1945 @struct_code: 
1946 @field_name: 
1947 @field_type_code: 
1948
1949 <!-- ##### FUNCTION gras_datadesc_declare_struct_add_code_cb ##### -->
1950 <para>
1951
1952 </para>
1953
1954 @struct_code: 
1955 @field_name: 
1956 @field_code: 
1957 @pre_cb: 
1958 @post_cb: 
1959 @Returns: 
1960
1961 <!-- ##### MACRO gras_datadesc_declare_struct_add_name ##### -->
1962 <para>
1963
1964 </para>
1965
1966 @struct_code: 
1967 @field_name: 
1968 @field_type_name: 
1969
1970 <!-- ##### FUNCTION gras_datadesc_declare_struct_add_name_cb ##### -->
1971 <para>
1972
1973 </para>
1974
1975 @struct_code: 
1976 @field_name: 
1977 @field_type_name: 
1978 @pre_cb: 
1979 @post_cb: 
1980 @Returns: 
1981
1982 <!-- ##### FUNCTION gras_datadesc_declare_struct_append_name ##### -->
1983 <para>
1984
1985 </para>
1986
1987 @struct_type: 
1988 @name: 
1989 @field_type_name: 
1990 @Returns: 
1991
1992 <!-- ##### FUNCTION gras_datadesc_declare_struct_cb ##### -->
1993 <para>
1994
1995 </para>
1996
1997 @name: 
1998 @pre_cb: 
1999 @post_cb: 
2000 @code: 
2001 @Returns: 
2002
2003 <!-- ##### MACRO gras_datadesc_declare_union_add_code ##### -->
2004 <para>
2005
2006 </para>
2007
2008 @union_code: 
2009 @field_name: 
2010 @field_type_code: 
2011
2012 <!-- ##### FUNCTION gras_datadesc_declare_union_add_code_cb ##### -->
2013 <para>
2014
2015 </para>
2016
2017 @union_code: 
2018 @field_name: 
2019 @field_code: 
2020 @pre_cb: 
2021 @post_cb: 
2022 @Returns: 
2023
2024 <!-- ##### MACRO gras_datadesc_declare_union_add_name ##### -->
2025 <para>
2026
2027 </para>
2028
2029 @union_code: 
2030 @field_name: 
2031 @field_type_name: 
2032
2033 <!-- ##### FUNCTION gras_datadesc_declare_union_add_name_cb ##### -->
2034 <para>
2035
2036 </para>
2037
2038 @union_code: 
2039 @field_name: 
2040 @field_type_name: 
2041 @pre_cb: 
2042 @post_cb: 
2043 @Returns: 
2044
2045 <!-- ##### FUNCTION gras_datadesc_declare_union_append_name ##### -->
2046 <para>
2047
2048 </para>
2049
2050 @union_type: 
2051 @name: 
2052 @field_type_name: 
2053 @Returns: 
2054
2055 <!-- ##### FUNCTION gras_datadesc_declare_union_cb ##### -->
2056 <para>
2057
2058 </para>
2059
2060 @name: 
2061 @field_count: 
2062 @post: 
2063 @code: 
2064 @Returns: 
2065
2066 <!-- ##### FUNCTION gras_datadesc_from_nws ##### -->
2067 <para>
2068
2069 </para>
2070
2071 @name: 
2072 @desc: 
2073 @howmany: 
2074 @code: 
2075 @Returns: 
2076 @dst: 
2077
2078 <!-- ##### FUNCTION gras_datadesc_import_nws ##### -->
2079 <para>
2080
2081 </para>
2082
2083 @name: 
2084 @desc: 
2085 @howmany: 
2086 @dst: 
2087 @Returns: 
2088
2089 <!-- ##### FUNCTION gras_datadesc_parse ##### -->
2090 <para>
2091
2092 </para>
2093
2094 @name: 
2095 @Cdefinition: 
2096 @dst: 
2097 @Returns: 
2098 @code: 
2099 @def: 
2100
2101 <!-- ##### FUNCTION gras_ddt_free ##### -->
2102 <para>
2103
2104 </para>
2105
2106 @type: 
2107
2108 <!-- ##### FUNCTION gras_ddt_get_by_code ##### -->
2109 <para>
2110
2111 </para>
2112
2113 @code: 
2114 @type: 
2115 @Returns: 
2116
2117 <!-- ##### FUNCTION gras_ddt_get_by_name ##### -->
2118 <para>
2119
2120 </para>
2121
2122 @name: 
2123 @type: 
2124 @Returns: 
2125
2126 <!-- ##### FUNCTION gras_ddt_new_array ##### -->
2127 <para>
2128
2129 </para>
2130
2131 @name: 
2132 @element_type: 
2133 @fixed_size: 
2134 @dynamic_size: 
2135 @post: 
2136 @dst: 
2137 @Returns: 
2138
2139 <!-- ##### FUNCTION gras_ddt_new_from_nws ##### -->
2140 <para>
2141
2142 </para>
2143
2144 @name: 
2145 @desc: 
2146 @howmany: 
2147 @dst: 
2148 @Returns: 
2149
2150 <!-- ##### FUNCTION gras_ddt_new_ignored ##### -->
2151 <para>
2152
2153 </para>
2154
2155 @name: 
2156 @default_value: 
2157 @free_func: 
2158 @size: 
2159 @alignment: 
2160 @post: 
2161 @dst: 
2162 @Returns: 
2163
2164 <!-- ##### FUNCTION gras_ddt_new_parse ##### -->
2165 <para>
2166
2167 </para>
2168
2169 @name: 
2170 @C_definition: 
2171 @dst: 
2172 @Returns: 
2173
2174 <!-- ##### FUNCTION gras_ddt_new_ref ##### -->
2175 <para>
2176
2177 </para>
2178
2179 @name: 
2180 @referenced_type: 
2181 @discriminant: 
2182 @post: 
2183 @dst: 
2184 @Returns: 
2185
2186 <!-- ##### FUNCTION gras_ddt_new_scalar ##### -->
2187 <para>
2188
2189 </para>
2190
2191 @name: 
2192 @type: 
2193 @Returns: 
2194
2195 <!-- ##### FUNCTION gras_ddt_new_struct ##### -->
2196 <para>
2197
2198 </para>
2199
2200 @name: 
2201 @pre: 
2202 @post: 
2203 @dst: 
2204 @Returns: 
2205
2206 <!-- ##### FUNCTION gras_ddt_new_struct_append ##### -->
2207 <para>
2208
2209 </para>
2210
2211 @struct_type: 
2212 @name: 
2213 @field_type: 
2214 @pre: 
2215 @post: 
2216 @Returns: 
2217
2218 <!-- ##### FUNCTION gras_ddt_new_union ##### -->
2219 <para>
2220
2221 </para>
2222
2223 @name: 
2224 @field_count: 
2225 @post: 
2226 @dst: 
2227 @Returns: 
2228
2229 <!-- ##### FUNCTION gras_ddt_new_union_append ##### -->
2230 <para>
2231
2232 </para>
2233
2234 @union_type: 
2235 @name: 
2236 @field_type: 
2237 @pre: 
2238 @post: 
2239 @Returns: 
2240
2241 <!-- ##### FUNCTION gras_ddt_register ##### -->
2242 <para>
2243
2244 </para>
2245
2246 @type: 
2247 @Returns: 
2248
2249 <!-- ##### FUNCTION gras_dict_cursor_next ##### -->
2250 <para>
2251
2252 </para>
2253
2254 @cursor: 
2255 @Returns: 
2256
2257 <!-- ##### FUNCTION gras_dict_insert ##### -->
2258 <para>
2259
2260 </para>
2261
2262 @head: 
2263 @key: 
2264 @data: 
2265 @free_ctn: 
2266 @Returns: 
2267
2268 <!-- ##### FUNCTION gras_dict_insert_ext ##### -->
2269 <para>
2270
2271 </para>
2272
2273 @head: 
2274 @key: 
2275 @key_len: 
2276 @data: 
2277 @free_ctn: 
2278 @Returns: 
2279
2280 <!-- ##### FUNCTION gras_dict_retrieve ##### -->
2281 <para>
2282
2283 </para>
2284
2285 @head: 
2286 @key: 
2287 @data: 
2288 @Returns: 
2289
2290 <!-- ##### FUNCTION gras_dict_retrieve_ext ##### -->
2291 <para>
2292
2293 </para>
2294
2295 @head: 
2296 @key: 
2297 @key_len: 
2298 @data: 
2299 @Returns: 
2300
2301 <!-- ##### FUNCTION gras_dynar_first ##### -->
2302 <para>
2303
2304 </para>
2305
2306 @dynar: 
2307 @cursor: 
2308 @Returns: 
2309
2310 <!-- ##### FUNCTION gras_dynar_next ##### -->
2311 <para>
2312
2313 </para>
2314
2315 @dynar: 
2316 @cursor: 
2317 @whereto: 
2318 @Returns: 
2319
2320 <!-- ##### FUNCTION gras_lock ##### -->
2321 <para>
2322
2323 </para>
2324
2325 @Returns: 
2326
2327 <!-- ##### FUNCTION gras_log_parent_set ##### -->
2328 <para>
2329
2330 </para>
2331
2332 @cat: 
2333 @parent: 
2334
2335 <!-- ##### FUNCTION gras_log_threshold_set ##### -->
2336 <para>
2337
2338 </para>
2339
2340 @cat: 
2341 @thresholdPriority: 
2342
2343 <!-- ##### FUNCTION gras_msg_discard ##### -->
2344 <para>
2345
2346 </para>
2347
2348 @sd: 
2349 @size: 
2350
2351 <!-- ##### FUNCTION gras_msg_free ##### -->
2352 <para>
2353
2354 </para>
2355
2356 @msg: 
2357
2358 <!-- ##### FUNCTION gras_msg_new ##### -->
2359 <para>
2360
2361 </para>
2362
2363 @msgId: 
2364 @free_data_on_free: 
2365 @seqCount: 
2366 @Varargs: 
2367 @Returns: 
2368
2369 <!-- ##### FUNCTION gras_msgtype_register ##### -->
2370 <para>
2371
2372 </para>
2373
2374 @msgId: 
2375 @name: 
2376 @sequence_count: 
2377 @Varargs: 
2378 @Returns: 
2379
2380 <!-- ##### FUNCTION gras_sleep ##### -->
2381 <para>
2382
2383 </para>
2384
2385 @Param1: 
2386 @Param2: 
2387
2388 <!-- ##### FUNCTION gras_sock_client_open ##### -->
2389 <para>
2390
2391 </para>
2392
2393 @host: 
2394 @Param2: 
2395 @sock: 
2396 @Returns: 
2397
2398 <!-- ##### FUNCTION gras_sock_close ##### -->
2399 <para>
2400
2401 </para>
2402
2403 @sock: 
2404 @Returns: 
2405
2406 <!-- ##### FUNCTION gras_sock_get_peer_addr ##### -->
2407 <para>
2408
2409 </para>
2410
2411 @sd: 
2412 @Returns: 
2413
2414 <!-- ##### FUNCTION gras_sock_get_peer_name ##### -->
2415 <para>
2416
2417 </para>
2418
2419 @sd: 
2420 @Returns: 
2421
2422 <!-- ##### FUNCTION gras_sock_server_open ##### -->
2423 <para>
2424
2425 </para>
2426
2427 @Param1: 
2428 @Param2: 
2429 @sock: 
2430 @Returns: 
2431
2432 <!-- ##### FUNCTION gras_time ##### -->
2433 <para>
2434
2435 </para>
2436
2437 @Returns: 
2438
2439 <!-- ##### FUNCTION gras_unlock ##### -->
2440 <para>
2441
2442 </para>
2443
2444 @Returns: 
2445