Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Make snapshots compatible with SMPI privatization of global variables
[simgrid.git] / README.coding
1 **
2 ** Source tree organization
3 **
4 ******************************************************
5
6 There is at least 4 sub-projects in the tree:
7
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
11          simulator.
12  - SMPI: Simulated MPI, to run MPI application using emulation technics.
13
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.
18
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
22
23  src/include -> another location for protected headers. Used by SURF, and
24                 other should be converted, since this is the Right Thing.
25
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
30                run on 'make check'.
31
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
34                 public headers here.
35
36  teshsuite/ -> The more test the better. Put in there any strange test
37                doing things that the users are not supposed to do,
38                just to see if our framework is robust to incorrect and
39                unusual behaviors. All tests written in this section
40                should leverage our tesh(1) utility.
41
42  testsuite/ -> Old test suite, that should be converted to tesh and
43                moved to teshsuite at some point.
44
45 **
46 ** Indentation standard
47 **
48 *****************************************************
49
50 Most files use the Kernighan & Ritchie coding style with 2 spaces of
51 indentation. The indent program can help you to stick to it:
52
53 indent -kr -l80 -nut -i2 -lps -npcs -br -brs -ce -cdw -bbo -npsl <myfile>
54
55 The script ./tools/indent runs indent with the appropriate options.
56
57 FIXME: this list of arguments is still to be discussed, maybe
58
59 **
60 ** Type naming standard
61 **
62 *****************************************************
63
64 It may sound strange, but the type naming convention was source of intense
65 discussion between da SimGrid posse members. The convention we came to may not
66 be the best solution, but it has the merit to exist and leave everyone work.
67 So please stick to it.
68
69   - ???_t is a valid type (built with typedef)
70   - s_toto_t is a structure (access to fields with .)
71   - s_toto   is a structure needing 'struct' keyword to be used
72   - e_toto_t is an enum
73   - u_toto_t is an union
74   - u_toto   is an union needing 'union' keyword to be used
75   -   toto_t is an 'object' (struct*)
76
77 Please to not call toto_t something else than an 'object' (ie, something you
78 have to call _new and _free on it).
79
80 Example:
81   typedef struct s_toto {} s_toto_t, *toto_t;
82   typedef enum {} e_toto_t;
83
84 Moreover, only toto_t (and e_toto_t) are public. The rest (mainly s_toto_t)
85 is private.
86
87 If you see any part of the code not following this convention, this is a
88 bug. Please report it (or fix it yourself if you can).
89
90 **
91 ** Random bits about coding standards and portability
92 **
93 *****************************************************
94
95 MALLOC
96  Don't use it, or you'll have to check the result (and do some dirty stuff
97  on AIX). Use xbt_malloc (or even better, xbt_new) instead.
98
99 SIZE_T (FIXME: obsolete?)
100  If possible, avoid size_t and use unsigned long instead. If not,
101  #include <sys/types.h> in all files manipulating size_t
102  do cast it to unsigned long before printing (and use %lu),
103  or use %zu.
104
105 INTEGERS
106  Please avoid to use long ints.  This is the source of many compatibility
107  problems between 32 bits and 64 bits archs.  Either use plain ints (generally
108  32 bits wide) or long long ints (64 bits wide, at least).  At last resort
109  consider using integer types defined in C99 by <stdint.h>.
110
111 PRINTF pointer difference (FIXME: advertise %td instead?)
112  printf ("diff = %ld\n", (long) (pointer2 - pointer1));
113
114 INLINE functions
115  The definition of a inline function must be visible when it is used.
116  As such, an inline function should be defined (an not only declared)
117  in header file (.h) with attributes 'static XBT_INLINE'.  It should
118  not be defined in source file (.c).
119
120 **
121 ** Commenting the source: doxygen
122 **
123 ****************************************************
124
125 The global structure of the documentation is in doc/modules.doc
126
127 The structure of each module (xbt, msg, etc) is in doc/module-<module>.doc
128
129 The structure of a module is in its public header. This way, you're sure to
130 see all the public interface (and only it). The different parts of the
131 interface are grouped using the @name construct, even if it's buggy. Since
132 parts often get reordered, it's better to add numbers to the parts (so that
133 users can see the intended order).
134
135 The documentation of each type and macro are also in the public header since
136 this is were they live.
137
138 The documentation of each function must be in the C file were it lives.
139
140 Any public element (function, type and macro) must have a @brief part.
141
142 **
143 ** XBT virtualization mechanism (FIXME: this section is deprecated)
144 **
145 ****************************************************
146
147 There is some functionalities that we want to virtualize in XBT. We
148 want xbt_time to give the simulated clock when running on top of the
149 simulator, and the host clock when running on a real system. This
150 could be placed in GRAS (and was, historically), but there is some
151 reason to lower it down to XBT.
152
153 Here is the used naming scheme:
154
155   - xbt_<module>_<func>(): functions working both in SG and RL
156   - xbt_os_<module>_<func>(): RL functions usable even in simulator
157
158     That way, in libsimgrid, we still can use native functions if we
159     want to. It may for example be useful to get the real time when
160     implementing the simulator. Think of the SIGINT handler, which
161     wants to see if the user pressed the key twice in a 5 seconds
162     interval. This is of little use to check the simulated time here.
163
164 Here is the file layout:
165
166   - xbt_rl_<module>.c: native implementation (xbt_<module>_<func>()).
167     Simply call the corresponding xbt_os_<module>_<func>.
168     Part only of libgras.so
169
170   - xbt_sg_<module>.c: SIMIX implementation xbt_<module>_<func>()).
171     Simply call the corresponding SIMIX implementation.
172     Part only of libsimgrid.so
173
174   - xbt_os_<module>.c: body of the functions implementing natively the
175     stuff (xbt_os_<module>_<func>()).
176     Part of both libgras.so and libsimgrid.so
177
178 Since there is almost nothing in xbt_rl_module.c and xbt_sg_module.c,
179 it'd be better to use symbol aliasing here (to declare in the object
180 code that the same function have two names), but I'm still
181 investigating the portability of the thing to windows.
182
183
184 *
185 * SimGrid Hacker Survival Guide (FIXME: should be betterly placed)
186 ********************************
187
188 * Before pushing any change, don't forget to check if the compilation
189   passes with compiler optimizations and warnings turned on:
190       cmake -Denable_compile_optimizations=ON \
191             -Denable_compile_warnings=ON
192
193 * Your commit message should follow the git habits, explained eg here:
194   http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
195
196 * When you add/remove files, and/or make changes in the lists of files to build,
197   please check that "make distcheck" still succeeds.  This is needed to ensure
198   that the generated archive is consistent.
199
200 * If you want to debug memory allocation problems, here are a few hints:
201   - disable compiler optimizations, to have better backtraces;
202   - disable the mallocators, or it will be hard to match malloc's with
203     free's;
204   - disable model checking, unless your problem lies in the model
205     checker part of SimGrid (MC brings its own malloc implementation,
206     which valgrind doesn't understand).
207   All this is configured with:
208       cmake -Denable_model-checking=OFF \
209             -Denable_mallocators=OFF \
210             -Denable_compile_optimizations=OFF
211
212 * If you break the logs (for example while hacking in the dynars), you
213   want to define XBT_LOG_MAYDAY at the beginning of log.h. It will
214   deactivate the whole logging mechanism, switching to printfs
215   instead. SimGrid becomes incredibly verbose when doing so, but it
216   you let you fixing the dynars.