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
7 <para>For each message, you have to declare a structure representing the
8 data to send as payload with the message.</para>
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>
18 char id[STATE_NAME_SIZE];
26 <para>And here is the structure description GRAS needs to be able to send
27 this over the network:</para>
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))};
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>
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>
52 <para>Yes, the <command>offsetof(struct state, id)</command>
53 construction is C ANSI and is portable.</para>
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>
65 unsigned long address;
70 char name[MAX_CLIQUE_NAME_SIZE];
73 char skill[MAX_SKILL_SIZE];
74 char options[MAX_OPTIONS_SIZE];
77 CliqueMember members[MAX_MEMBERS];
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>
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))};
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 *)&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))};
107 <para>So, even if less natural, it is possible to send structures
108 containing structures with these tools.</para>
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>
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]).
125 <!-- ##### SECTION ./tmpl/DataDesc.sgml:See_Also ##### -->
131 <!-- ##### SECTION ./tmpl/DataDesc.sgml:Short_Description ##### -->
135 <!-- ##### SECTION ./tmpl/DataDesc.sgml:Title ##### -->
139 <!-- ##### SECTION ./tmpl/ErrLog.sgml:Long_Description ##### -->
145 <!-- ##### SECTION ./tmpl/ErrLog.sgml:See_Also ##### -->
151 <!-- ##### SECTION ./tmpl/ErrLog.sgml:Short_Description ##### -->
155 <!-- ##### SECTION ./tmpl/ErrLog.sgml:Title ##### -->
159 <!-- ##### SECTION ./tmpl/Socks.sgml:Long_Description ##### -->
165 <!-- ##### SECTION ./tmpl/Socks.sgml:See_Also ##### -->
171 <!-- ##### SECTION ./tmpl/Socks.sgml:Short_Description ##### -->
175 <!-- ##### SECTION ./tmpl/Socks.sgml:Title ##### -->
179 <!-- ##### SECTION ./tmpl/comm_callbacks.sgml:Long_Description ##### -->
185 <!-- ##### SECTION ./tmpl/comm_callbacks.sgml:See_Also ##### -->
191 <!-- ##### SECTION ./tmpl/comm_callbacks.sgml:Short_Description ##### -->
195 <!-- ##### SECTION ./tmpl/comm_callbacks.sgml:Title ##### -->
199 <!-- ##### SECTION ./tmpl/comm_cb.sgml:Long_Description ##### -->
205 <!-- ##### SECTION ./tmpl/comm_cb.sgml:See_Also ##### -->
211 <!-- ##### SECTION ./tmpl/comm_cb.sgml:Short_Description ##### -->
215 <!-- ##### SECTION ./tmpl/comm_cb.sgml:Title ##### -->
219 <!-- ##### SECTION ./tmpl/comm_datadesc_expert.sgml:Long_Description ##### -->
225 <!-- ##### SECTION ./tmpl/comm_datadesc_expert.sgml:See_Also ##### -->
231 <!-- ##### SECTION ./tmpl/comm_datadesc_expert.sgml:Short_Description ##### -->
232 Advanced ways to describe data (for experts)
235 <!-- ##### SECTION ./tmpl/comm_datadesc_expert.sgml:Title ##### -->
236 Advanced Data description
239 <!-- ##### SECTION ./tmpl/comm_dd_cbps.sgml:Long_Description ##### -->
245 <!-- ##### SECTION ./tmpl/comm_dd_cbps.sgml:See_Also ##### -->
251 <!-- ##### SECTION ./tmpl/comm_dd_cbps.sgml:Short_Description ##### -->
255 <!-- ##### SECTION ./tmpl/comm_dd_cbps.sgml:Title ##### -->
256 Data description callbacks persistant state
259 <!-- ##### SECTION ./tmpl/config.sgml:Long_Description ##### -->
265 <!-- ##### SECTION ./tmpl/config.sgml:See_Also ##### -->
271 <!-- ##### SECTION ./tmpl/config.sgml:Short_Description ##### -->
275 <!-- ##### SECTION ./tmpl/config.sgml:Title ##### -->
279 <!-- ##### SECTION ./tmpl/dd_cbps.sgml:Long_Description ##### -->
285 <!-- ##### SECTION ./tmpl/dd_cbps.sgml:See_Also ##### -->
291 <!-- ##### SECTION ./tmpl/dd_cbps.sgml:Short_Description ##### -->
295 <!-- ##### SECTION ./tmpl/dd_cbps.sgml:Title ##### -->
296 Data description callbacks persistant state
299 <!-- ##### SECTION ./tmpl/dd_internal.sgml:Long_Description ##### -->
305 <!-- ##### SECTION ./tmpl/dd_internal.sgml:See_Also ##### -->
311 <!-- ##### SECTION ./tmpl/dd_internal.sgml:Short_Description ##### -->
315 <!-- ##### SECTION ./tmpl/dd_internal.sgml:Title ##### -->
316 Implementation of data description
319 <!-- ##### SECTION ./tmpl/dico.sgml:Long_Description ##### -->
325 <!-- ##### SECTION ./tmpl/dico.sgml:See_Also ##### -->
331 <!-- ##### SECTION ./tmpl/dico.sgml:Short_Description ##### -->
335 <!-- ##### SECTION ./tmpl/dico.sgml:Title ##### -->
339 <!-- ##### SECTION ./tmpl/dynar.sgml:Long_Description ##### -->
341 This module provide the quite usual dynamic array facility.
345 <!-- ##### SECTION ./tmpl/dynar.sgml:See_Also ##### -->
351 <!-- ##### SECTION ./tmpl/dynar.sgml:Short_Description ##### -->
355 <!-- ##### SECTION ./tmpl/dynar.sgml:Title ##### -->
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>
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
371 <para>Here are the problems when you want to do so:
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>
377 <listitem><para>In RL, each process should provide a main()
378 function, and it's obviously not the case in SG.</para>
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>
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>
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
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>
417 <!-- ##### SECTION ./tmpl/gras-overview.sgml:See_Also ##### -->
423 <!-- ##### SECTION ./tmpl/gras-overview.sgml:Short_Description ##### -->
424 Overview of the GRAS library
427 <!-- ##### SECTION ./tmpl/gras-overview.sgml:Title ##### -->
431 <!-- ##### SECTION ./tmpl/gras.sgml:Long_Description ##### -->
437 <!-- ##### SECTION ./tmpl/gras.sgml:See_Also ##### -->
443 <!-- ##### SECTION ./tmpl/gras.sgml:Short_Description ##### -->
447 <!-- ##### SECTION ./tmpl/gras.sgml:Title ##### -->
451 <!-- ##### SECTION ./tmpl/gras_private.sgml:Long_Description ##### -->
457 <!-- ##### SECTION ./tmpl/gras_private.sgml:See_Also ##### -->
463 <!-- ##### SECTION ./tmpl/gras_private.sgml:Short_Description ##### -->
467 <!-- ##### SECTION ./tmpl/gras_private.sgml:Title ##### -->
471 <!-- ##### SECTION ./tmpl/gras_rl.sgml:Long_Description ##### -->
477 <!-- ##### SECTION ./tmpl/gras_rl.sgml:See_Also ##### -->
483 <!-- ##### SECTION ./tmpl/gras_rl.sgml:Short_Description ##### -->
484 Implementation of GRAS suited for real life.
487 <!-- ##### SECTION ./tmpl/gras_rl.sgml:Title ##### -->
491 <!-- ##### SECTION ./tmpl/gras_sg.sgml:Long_Description ##### -->
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).
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
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.
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.
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.
539 <!-- ##### SECTION ./tmpl/gras_sg.sgml:See_Also ##### -->
541 RL, the implementation suited for real life.
546 sgml-parent-document:\.\./gras-docs\.sgml
549 sgml-namecase-general:t
550 sgml-general-insert-case:lower
551 sgml-minimize-attributes:nil
552 sgml-always-quote-attributes:t
555 sgml-exposed-tags:nil
556 sgml-local-catalogs:nil
557 sgml-local-ecat-files:nil
562 <!-- ##### SECTION ./tmpl/gras_sg.sgml:Short_Description ##### -->
563 Implementation of GRAS on top of the simulator.
566 <!-- ##### SECTION ./tmpl/gras_sg.sgml:Title ##### -->
570 <!-- ##### SECTION ./tmpl/nws_comm.sgml:Long_Description ##### -->
576 <!-- ##### SECTION ./tmpl/nws_comm.sgml:See_Also ##### -->
582 <!-- ##### SECTION ./tmpl/nws_comm.sgml:Short_Description ##### -->
586 <!-- ##### SECTION ./tmpl/nws_comm.sgml:Title ##### -->
590 <!-- ##### SECTION ./tmpl/trp_socks.sgml:Long_Description ##### -->
596 <!-- ##### SECTION ./tmpl/trp_socks.sgml:See_Also ##### -->
602 <!-- ##### SECTION ./tmpl/trp_socks.sgml:Short_Description ##### -->
606 <!-- ##### SECTION ./tmpl/trp_socks.sgml:Title ##### -->
610 <!-- ##### MACRO BEGIN_DECL ##### -->
616 <!-- ##### MACRO CCRITICAL0 ##### -->
624 <!-- ##### MACRO CCRITICAL1 ##### -->
633 <!-- ##### MACRO CCRITICAL2 ##### -->
643 <!-- ##### MACRO CCRITICAL3 ##### -->
654 <!-- ##### MACRO CCRITICAL4 ##### -->
666 <!-- ##### MACRO CCRITICAL5 ##### -->
679 <!-- ##### MACRO CDEBUG0 ##### -->
687 <!-- ##### MACRO CDEBUG1 ##### -->
696 <!-- ##### MACRO CDEBUG2 ##### -->
706 <!-- ##### MACRO CDEBUG3 ##### -->
717 <!-- ##### MACRO CDEBUG4 ##### -->
729 <!-- ##### MACRO CDEBUG5 ##### -->
742 <!-- ##### MACRO CERROR0 ##### -->
750 <!-- ##### MACRO CERROR1 ##### -->
759 <!-- ##### MACRO CERROR2 ##### -->
769 <!-- ##### MACRO CERROR3 ##### -->
780 <!-- ##### MACRO CERROR4 ##### -->
792 <!-- ##### MACRO CERROR5 ##### -->
805 <!-- ##### MACRO CINFO0 ##### -->
813 <!-- ##### MACRO CINFO1 ##### -->
822 <!-- ##### MACRO CINFO2 ##### -->
832 <!-- ##### MACRO CINFO3 ##### -->
843 <!-- ##### MACRO CINFO4 ##### -->
855 <!-- ##### MACRO CINFO5 ##### -->
868 <!-- ##### MACRO CLOG0 ##### -->
877 <!-- ##### MACRO CLOG1 ##### -->
887 <!-- ##### MACRO CLOG2 ##### -->
898 <!-- ##### MACRO CLOG3 ##### -->
910 <!-- ##### MACRO CLOG4 ##### -->
923 <!-- ##### MACRO CLOG5 ##### -->
937 <!-- ##### MACRO CLOG6 ##### -->
952 <!-- ##### MACRO CRITICAL0 ##### -->
959 <!-- ##### MACRO CRITICAL1 ##### -->
967 <!-- ##### MACRO CRITICAL2 ##### -->
976 <!-- ##### MACRO CRITICAL3 ##### -->
986 <!-- ##### MACRO CRITICAL4 ##### -->
997 <!-- ##### MACRO CRITICAL5 ##### -->
1009 <!-- ##### MACRO CWARNING6 ##### -->
1023 <!-- ##### FUNCTION CallAddr ##### -->
1034 <!-- ##### FUNCTION CloseSocket ##### -->
1043 <!-- ##### FUNCTION ConvertData ##### -->
1054 <!-- ##### FUNCTION CreateLocalChild ##### -->
1064 <!-- ##### FUNCTION DROP_SOCKET ##### -->
1072 <!-- ##### FUNCTION DataSize ##### -->
1082 <!-- ##### ENUM DataTypes ##### -->
1094 @UNSIGNED_LONG_TYPE:
1095 @UNSIGNED_SHORT_TYPE:
1099 <!-- ##### FUNCTION DifferentFormat ##### -->
1107 <!-- ##### FUNCTION DifferentOrder ##### -->
1114 <!-- ##### FUNCTION DifferentSize ##### -->
1122 <!-- ##### MACRO END_DECL ##### -->
1128 <!-- ##### MACRO EODD ##### -->
1134 <!-- ##### FUNCTION EstablishAnEar ##### -->
1145 <!-- ##### ENUM FormatTypes ##### -->
1153 <!-- ##### MACRO GRAS_LOG_MAYDAY ##### -->
1159 <!-- ##### MACRO GRAS_LOG_ROOT_CAT ##### -->
1165 <!-- ##### MACRO HAVE_DLFCN_H ##### -->
1171 <!-- ##### MACRO HAVE_INTTYPES_H ##### -->
1177 <!-- ##### MACRO HAVE_LIBPTHREAD ##### -->
1183 <!-- ##### MACRO HAVE_MEMORY_H ##### -->
1189 <!-- ##### MACRO HAVE_STDINT_H ##### -->
1195 <!-- ##### MACRO HAVE_STDLIB_H ##### -->
1201 <!-- ##### MACRO HAVE_STRINGS_H ##### -->
1207 <!-- ##### MACRO HAVE_STRING_H ##### -->
1213 <!-- ##### MACRO HAVE_SYS_STAT_H ##### -->
1219 <!-- ##### MACRO HAVE_SYS_TYPES_H ##### -->
1225 <!-- ##### MACRO HAVE_UNISTD_H ##### -->
1231 <!-- ##### FUNCTION HomogenousConvertData ##### -->
1242 <!-- ##### FUNCTION HomogenousDataSize ##### -->
1252 <!-- ##### TYPEDEF IPAddress ##### -->
1258 <!-- ##### FUNCTION IPAddressImage ##### -->
1266 <!-- ##### FUNCTION IPAddressImage_r ##### -->
1274 <!-- ##### FUNCTION IPAddressMachine ##### -->
1282 <!-- ##### FUNCTION IPAddressMachine_r ##### -->
1290 <!-- ##### MACRO IPAddressValue ##### -->
1298 <!-- ##### FUNCTION IPAddressValues ##### -->
1308 <!-- ##### FUNCTION IncomingRequest ##### -->
1318 <!-- ##### FUNCTION IsOkay ##### -->
1326 <!-- ##### FUNCTION IsPipe ##### -->
1334 <!-- ##### MACRO IsValidIP ##### -->
1341 <!-- ##### MACRO LOG6 ##### -->
1355 <!-- ##### FUNCTION MyMachineName ##### -->
1362 <!-- ##### MACRO NO_SOCKET ##### -->
1368 <!-- ##### FUNCTION NotifyOnDisconnection ##### -->
1375 <!-- ##### FUNCTION OpenClientSocket ##### -->
1385 <!-- ##### FUNCTION OpenServerSocket ##### -->
1396 <!-- ##### MACRO PACKAGE ##### -->
1402 <!-- ##### MACRO PACKAGE_BUGREPORT ##### -->
1408 <!-- ##### MACRO PACKAGE_NAME ##### -->
1414 <!-- ##### MACRO PACKAGE_STRING ##### -->
1420 <!-- ##### MACRO PACKAGE_TARNAME ##### -->
1426 <!-- ##### MACRO PACKAGE_VERSION ##### -->
1432 <!-- ##### MACRO PAD_BYTES ##### -->
1442 <!-- ##### FUNCTION PassSocket ##### -->
1451 <!-- ##### FUNCTION Peer ##### -->
1459 <!-- ##### FUNCTION PeerName ##### -->
1467 <!-- ##### FUNCTION PeerName_r ##### -->
1475 <!-- ##### FUNCTION ReverseData ##### -->
1486 <!-- ##### MACRO SIMPLE_DATA ##### -->
1494 <!-- ##### MACRO SIMPLE_MEMBER ##### -->
1503 <!-- ##### MACRO SIMPLE_TYPE_COUNT ##### -->
1509 <!-- ##### MACRO STDC_HEADERS ##### -->
1515 <!-- ##### TYPEDEF Socket ##### -->
1521 <!-- ##### FUNCTION SocketFailure ##### -->
1528 <!-- ##### USER_FUNCTION SocketFunction ##### -->
1535 <!-- ##### FUNCTION SocketInUse ##### -->
1543 <!-- ##### FUNCTION SocketIsAvailable ##### -->
1551 <!-- ##### MACRO VERSION ##### -->
1557 <!-- ##### MACRO WARNING6 ##### -->
1570 <!-- ##### USER_FUNCTION grasCallbackFunction ##### -->
1579 <!-- ##### FUNCTION grasCloseSocket ##### -->
1587 <!-- ##### FUNCTION grasDataDescCmp ##### -->
1599 <!-- ##### FUNCTION grasDataDescCount ##### -->
1607 <!-- ##### FUNCTION grasDataRecv ##### -->
1615 @description_length:
1619 <!-- ##### FUNCTION grasDataSend ##### -->
1627 @description_length:
1631 <!-- ##### FUNCTION grasDataSize ##### -->
1640 <!-- ##### ENUM grasError_t ##### -->
1655 <!-- ##### FUNCTION grasLock ##### -->
1662 <!-- ##### TYPEDEF grasMessageType_t ##### -->
1668 <!-- ##### FUNCTION grasMsgDiscard ##### -->
1676 <!-- ##### FUNCTION grasMsgEntryGet ##### -->
1684 <!-- ##### TYPEDEF grasMsgEntry_t ##### -->
1690 <!-- ##### FUNCTION grasMsgFree ##### -->
1697 <!-- ##### FUNCTION grasMsgHandle ##### -->
1704 <!-- ##### FUNCTION grasMsgHeaderNew ##### -->
1714 <!-- ##### FUNCTION grasMsgNew ##### -->
1725 <!-- ##### FUNCTION grasMsgRecv ##### -->
1735 <!-- ##### FUNCTION grasMsgRegister ##### -->
1746 <!-- ##### FUNCTION grasMsgSend ##### -->
1757 <!-- ##### FUNCTION grasMsgWait ##### -->
1769 <!-- ##### FUNCTION grasMyMachineName ##### -->
1776 <!-- ##### FUNCTION grasOpenClientSocket ##### -->
1786 <!-- ##### FUNCTION grasOpenServerSocket ##### -->
1796 <!-- ##### MACRO grasPROTOCOL ##### -->
1802 <!-- ##### FUNCTION grasPeerGetAddress ##### -->
1810 <!-- ##### FUNCTION grasPeerGetName ##### -->
1818 <!-- ##### FUNCTION grasRecvData ##### -->
1828 <!-- ##### FUNCTION grasRegisterCallback ##### -->
1837 <!-- ##### FUNCTION grasSendData ##### -->
1847 <!-- ##### FUNCTION grasUnlock ##### -->
1854 <!-- ##### FUNCTION grasUserdataGet ##### -->
1860 <!-- ##### MACRO grasUserdataNew ##### -->
1867 <!-- ##### FUNCTION grasUserdataSet ##### -->
1874 <!-- ##### FUNCTION gras_datadesc_cmp ##### -->
1887 <!-- ##### FUNCTION gras_datadesc_copy_data ##### -->
1896 <!-- ##### MACRO gras_datadesc_declare_array ##### -->
1906 <!-- ##### FUNCTION gras_datadesc_declare_array_cb ##### -->
1919 <!-- ##### FUNCTION gras_datadesc_declare_ref_cb ##### -->
1931 <!-- ##### MACRO gras_datadesc_declare_ref_disc ##### -->
1940 <!-- ##### MACRO gras_datadesc_declare_struct_add_code ##### -->
1949 <!-- ##### FUNCTION gras_datadesc_declare_struct_add_code_cb ##### -->
1961 <!-- ##### MACRO gras_datadesc_declare_struct_add_name ##### -->
1970 <!-- ##### FUNCTION gras_datadesc_declare_struct_add_name_cb ##### -->
1982 <!-- ##### FUNCTION gras_datadesc_declare_struct_append_name ##### -->
1992 <!-- ##### FUNCTION gras_datadesc_declare_struct_cb ##### -->
2003 <!-- ##### MACRO gras_datadesc_declare_union_add_code ##### -->
2012 <!-- ##### FUNCTION gras_datadesc_declare_union_add_code_cb ##### -->
2024 <!-- ##### MACRO gras_datadesc_declare_union_add_name ##### -->
2033 <!-- ##### FUNCTION gras_datadesc_declare_union_add_name_cb ##### -->
2045 <!-- ##### FUNCTION gras_datadesc_declare_union_append_name ##### -->
2055 <!-- ##### FUNCTION gras_datadesc_declare_union_cb ##### -->
2066 <!-- ##### FUNCTION gras_datadesc_from_nws ##### -->
2078 <!-- ##### FUNCTION gras_datadesc_parse ##### -->
2090 <!-- ##### FUNCTION gras_ddt_free ##### -->
2097 <!-- ##### FUNCTION gras_ddt_get_by_code ##### -->
2106 <!-- ##### FUNCTION gras_ddt_get_by_name ##### -->
2115 <!-- ##### FUNCTION gras_ddt_new_array ##### -->
2128 <!-- ##### FUNCTION gras_ddt_new_from_nws ##### -->
2139 <!-- ##### FUNCTION gras_ddt_new_ignored ##### -->
2153 <!-- ##### FUNCTION gras_ddt_new_parse ##### -->
2163 <!-- ##### FUNCTION gras_ddt_new_ref ##### -->
2175 <!-- ##### FUNCTION gras_ddt_new_scalar ##### -->
2184 <!-- ##### FUNCTION gras_ddt_new_struct ##### -->
2195 <!-- ##### FUNCTION gras_ddt_new_struct_append ##### -->
2207 <!-- ##### FUNCTION gras_ddt_new_union ##### -->
2218 <!-- ##### FUNCTION gras_ddt_new_union_append ##### -->
2230 <!-- ##### FUNCTION gras_ddt_register ##### -->
2238 <!-- ##### FUNCTION gras_dict_cursor_next ##### -->
2246 <!-- ##### FUNCTION gras_dict_insert ##### -->
2257 <!-- ##### FUNCTION gras_dict_insert_ext ##### -->
2269 <!-- ##### FUNCTION gras_dict_retrieve ##### -->
2279 <!-- ##### FUNCTION gras_dict_retrieve_ext ##### -->
2290 <!-- ##### FUNCTION gras_dynar_first ##### -->
2299 <!-- ##### FUNCTION gras_dynar_next ##### -->
2309 <!-- ##### FUNCTION gras_lock ##### -->
2316 <!-- ##### FUNCTION gras_log_parent_set ##### -->
2324 <!-- ##### FUNCTION gras_log_threshold_set ##### -->
2332 <!-- ##### FUNCTION gras_msg_discard ##### -->
2340 <!-- ##### FUNCTION gras_msg_free ##### -->
2347 <!-- ##### FUNCTION gras_msg_new ##### -->
2358 <!-- ##### FUNCTION gras_msgtype_register ##### -->
2369 <!-- ##### FUNCTION gras_sock_client_open ##### -->
2379 <!-- ##### FUNCTION gras_sock_close ##### -->
2387 <!-- ##### FUNCTION gras_sock_get_peer_addr ##### -->
2395 <!-- ##### FUNCTION gras_sock_get_peer_name ##### -->
2403 <!-- ##### FUNCTION gras_sock_server_open ##### -->
2413 <!-- ##### FUNCTION gras_unlock ##### -->