2 ** Source tree organization
4 ******************************************************
6 There is at least 4 sub-projects in the tree:
8 - XBT: eXtended Bundle of Tools (low-level toolbox: logging, datatypes).
9 - SURF: a SimUlation aRtiFact. This is the simulation kernel.
10 - MSG: originally MetaSimGrid, MSG is a simple distributed application
12 - SMPI: Simulated MPI, to run MPI application using emulation technics.
14 They are all in the same tree because they are complementary tools and
15 having all of them in the same package makes the installation easier
16 for end-users. Moreover, it enables to share the compilation chain and
17 eases the development.
19 The tree is not split on projects, but on file finality:
20 include/ -> all *public* headers
21 include/xbt/*.h -> one file per module
23 src/include -> another location for protected headers. Used by SURF, and
24 other should be converted, since this is the Right Thing.
26 testsuite/ -> The more test the better.
27 Same organization than src/ and include/
28 Tests are allowed to load some headers of the module they test.
29 All tests should be listed in run_test.in so that they get
32 examples/ -> Supposed to be copy/pastable by the user, so keep it clear and
33 avoid any kind of trick. In particular, do only include the
36 ** Indentation standard
38 *****************************************************
40 Most files use the Kernighan & Ritchie coding style with 2 spaces of
41 indentation. The indent program can help you to stick to it:
43 indent -kr -l80 -nut -i2 -lps -npcs -br -brs -ce -cdw -bbo -npsl <myfile>
45 The script ./tools/indent runs indent with the appropriate options.
47 FIXME: this list of arguments is still to be discussed, maybe
50 ** Type naming standard
52 *****************************************************
54 It may sound strange, but the type naming convention was source of intense
55 discussion between da SimGrid posse members. The convention we came to may not
56 be the best solution, but it has the merit to exist and leave everyone work.
57 So please stick to it.
59 - ???_t is a valid type (built with typedef)
60 - s_toto_t is a structure (access to fields with .)
61 - s_toto is a structure needing 'struct' keyword to be used
63 - u_toto_t is an union
64 - u_toto is an union needing 'union' keyword to be used
65 - toto_t is an 'object' (struct*)
67 Please to not call toto_t something else than an 'object' (ie, something you
68 have to call _new and _free on it).
71 typedef struct s_toto {} s_toto_t, *toto_t;
72 typedef enum {} e_toto_t;
74 Moreover, only toto_t (and e_toto_t) are public. The rest (mainly s_toto_t)
77 If you see any part of the code not following this convention, this is a
78 bug. Please report it (or fix it yourself if you can).
81 ** Random bits about coding standards and portability
83 *****************************************************
86 Don't use it, or you'll have to check the result (and do some dirty stuff
87 on AIX). Use xbt_malloc (or even better, xbt_new) instead.
89 SIZE_T (FIXME: obsolete?)
90 If possible, avoid size_t and use unsigned long instead. If not,
91 #include <sys/types.h> in all files manipulating size_t
92 do cast it to unsigned long before printing (and use %lu)
94 PRINTF pointer difference (FIXME: advertise %td instead?)
95 printf ("diff = %ld\n", (long) (pointer2 - pointer1));
98 The definition of a inline function must be visible when it is used.
99 As such, an inline function should be defined (an not only declared)
100 in header file (.h) with attributes 'static XBT_INLINE'. It should
101 not be defined in source file (.c).
104 ** Commenting the source: doxygen
106 ****************************************************
108 The global structure of the documentation is in doc/modules.doc
110 The structure of each module (xbt, msg, etc) is in doc/module-<module>.doc
112 The structure of a module is in its public header. This way, you're sure to
113 see all the public interface (and only it). The different parts of the
114 interface are grouped using the @name construct, even if it's buggy. Since
115 parts often get reordered, it's better to add numbers to the parts (so that
116 users can see the intended order).
118 The documentation of each type and macro are also in the public header since
119 this is were they live.
121 The documentation of each function must be in the C file were it lives.
123 Any public element (function, type and macro) must have a @brief part.
126 ** XBT virtualization mechanism (FIXME: this section is deprecated)
128 ****************************************************
130 There is some functionalities that we want to virtualize in XBT. We
131 want xbt_time to give the simulated clock when running on top of the
132 simulator, and the host clock when running on a real system. This
133 could be placed in GRAS (and was, historically), but there is some
134 reason to lower it down to XBT.
136 Here is the used naming scheme:
138 - xbt_<module>_<func>(): functions working both in SG and RL
139 - xbt_os_<module>_<func>(): RL functions usable even in simulator
141 That way, in libsimgrid, we still can use native functions if we
142 want to. It may for example be useful to get the real time when
143 implementing the simulator. Think of the SIGINT handler, which
144 wants to see if the user pressed the key twice in a 5 seconds
145 interval. This is of little use to check the simulated time here.
147 Here is the file layout:
149 - xbt_rl_<module>.c: native implementation (xbt_<module>_<func>()).
150 Simply call the corresponding xbt_os_<module>_<func>.
151 Part only of libgras.so
153 - xbt_sg_<module>.c: SIMIX implementation xbt_<module>_<func>()).
154 Simply call the corresponding SIMIX implementation.
155 Part only of libsimgrid.so
157 - xbt_os_<module>.c: body of the functions implementing natively the
158 stuff (xbt_os_<module>_<func>()).
159 Part of both libgras.so and libsimgrid.so
161 Since there is almost nothing in xbt_rl_module.c and xbt_sg_module.c,
162 it'd be better to use symbol aliasing here (to declare in the object
163 code that the same function have two names), but I'm still
164 investigating the portability of the thing to windows.
168 * SimGrid Hacker Survival Guide (FIXME: should be betterly placed)
169 ********************************
171 * Before pushing any change, don't forget to check if the compilation
172 passes with compiler optimizations and warnings turned on:
173 cmake -Denable_compile_optimizations=ON \
174 -Denable_compile_warnings=ON
176 * If you want to debug memory allocation problems, here are a few hints:
177 - disable compiler optimizations, to have better backtraces;
178 - disable the mallocators, or it will be hard to match malloc's with
180 - disable model checking, unless your problem lies in the model
181 checker part of SimGrid (MC brings its own malloc implementation,
182 which valgrind doesn't understand).
183 All this is configured with:
184 cmake -Denable_model-checking=OFF \
185 -Denable_mallocators=OFF \
186 -Denable_compile_optimizations=OFF
188 * If you break the logs (for example while hacking in the dynars), you
189 want to define XBT_LOG_MAYDAY at the beginning of log.h. It will
190 deactivate the whole logging mechanism, switching to printfs
191 instead. SimGrid becomes incredibly verbose when doing so, but it
192 you let you fixing the dynars.