xref: /aosp_15_r20/external/trace-cmd/CODING_STYLE (revision 58e6ee5f017f6a8912852c892d18457e4bafb554)
1*58e6ee5fSAndroid Build Coastguard Worker
2*58e6ee5fSAndroid Build Coastguard Workertrace-cmd coding-style
3*58e6ee5fSAndroid Build Coastguard Worker======================
4*58e6ee5fSAndroid Build Coastguard Worker
5*58e6ee5fSAndroid Build Coastguard WorkerThe coding style of trace-cmd and the tracing libraries (libtracefs and
6*58e6ee5fSAndroid Build Coastguard Workerlibtraceevent) are very similar to the Linux kernel coding style:
7*58e6ee5fSAndroid Build Coastguard Worker
8*58e6ee5fSAndroid Build Coastguard Worker  https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/coding-style.rst
9*58e6ee5fSAndroid Build Coastguard Worker
10*58e6ee5fSAndroid Build Coastguard WorkerIndentation
11*58e6ee5fSAndroid Build Coastguard Worker===========
12*58e6ee5fSAndroid Build Coastguard Worker
13*58e6ee5fSAndroid Build Coastguard WorkerTabs are used for the start of indentation (the '\t' character), and should be
14*58e6ee5fSAndroid Build Coastguard Workerset to 8 characters. Spaces may be used at the end for continued lines where
15*58e6ee5fSAndroid Build Coastguard Workerhaving the start of text line up to braces in the previous line is not
16*58e6ee5fSAndroid Build Coastguard Workerdivisible by 8.
17*58e6ee5fSAndroid Build Coastguard Worker
18*58e6ee5fSAndroid Build Coastguard WorkerMax line width
19*58e6ee5fSAndroid Build Coastguard Worker==============
20*58e6ee5fSAndroid Build Coastguard Worker
21*58e6ee5fSAndroid Build Coastguard WorkerAll lines should not be more than 100 characters in length.
22*58e6ee5fSAndroid Build Coastguard Worker
23*58e6ee5fSAndroid Build Coastguard WorkerThis is a guide, as readability is more important than breaking lines up into a
24*58e6ee5fSAndroid Build Coastguard Workerhard limit. Ideally, strings should never be broken up except for where a new
25*58e6ee5fSAndroid Build Coastguard Workerline is added.
26*58e6ee5fSAndroid Build Coastguard Worker
27*58e6ee5fSAndroid Build Coastguard Worker	printf("This is a line that may continue for a very long string.\n"
28*58e6ee5fSAndroid Build Coastguard Worker	       "This is another line, but after a new line\n");
29*58e6ee5fSAndroid Build Coastguard Worker
30*58e6ee5fSAndroid Build Coastguard WorkerBut line breaks should not be:
31*58e6ee5fSAndroid Build Coastguard Worker
32*58e6ee5fSAndroid Build Coastguard Worker	printf("This is a line that may continue for a very"
33*58e6ee5fSAndroid Build Coastguard Worker	       "long string.\n This is another line,"
34*58e6ee5fSAndroid Build Coastguard Worker	       "but after a new line\n");
35*58e6ee5fSAndroid Build Coastguard Worker
36*58e6ee5fSAndroid Build Coastguard WorkerNot only is the above not as readable as the first version, it is not
37*58e6ee5fSAndroid Build Coastguard Workereven equivalent, because it is missing spaces between the line breaks.
38*58e6ee5fSAndroid Build Coastguard WorkerFor this reason, finish the string on the same line, even if that string
39*58e6ee5fSAndroid Build Coastguard Workerbreaks the 100 character limit.
40*58e6ee5fSAndroid Build Coastguard Worker
41*58e6ee5fSAndroid Build Coastguard WorkerBrackets and braces
42*58e6ee5fSAndroid Build Coastguard Worker===================
43*58e6ee5fSAndroid Build Coastguard Worker
44*58e6ee5fSAndroid Build Coastguard WorkerFor all conditionals, the braces start on the same line:
45*58e6ee5fSAndroid Build Coastguard Worker
46*58e6ee5fSAndroid Build Coastguard Worker	if (cond) {
47*58e6ee5fSAndroid Build Coastguard Worker	}
48*58e6ee5fSAndroid Build Coastguard Worker
49*58e6ee5fSAndroid Build Coastguard WorkerAnd the ending brace is at the same indentation as the conditional.
50*58e6ee5fSAndroid Build Coastguard Worker
51*58e6ee5fSAndroid Build Coastguard Worker	while (cond) {
52*58e6ee5fSAndroid Build Coastguard Worker	}
53*58e6ee5fSAndroid Build Coastguard Worker
54*58e6ee5fSAndroid Build Coastguard Worker	do {
55*58e6ee5fSAndroid Build Coastguard Worker	} while (cond);
56*58e6ee5fSAndroid Build Coastguard Worker
57*58e6ee5fSAndroid Build Coastguard Worker	for (i = 0; i < 10; i++) {
58*58e6ee5fSAndroid Build Coastguard Worker	}
59*58e6ee5fSAndroid Build Coastguard Worker
60*58e6ee5fSAndroid Build Coastguard WorkerThe same is true for structures:
61*58e6ee5fSAndroid Build Coastguard Worker
62*58e6ee5fSAndroid Build Coastguard Worker	struct my_struct {
63*58e6ee5fSAndroid Build Coastguard Worker		int field;
64*58e6ee5fSAndroid Build Coastguard Worker	};
65*58e6ee5fSAndroid Build Coastguard Worker
66*58e6ee5fSAndroid Build Coastguard WorkerBut for functions, the braces should start on the following line:
67*58e6ee5fSAndroid Build Coastguard Worker
68*58e6ee5fSAndroid Build Coastguard Worker	void my_function(void)
69*58e6ee5fSAndroid Build Coastguard Worker	{
70*58e6ee5fSAndroid Build Coastguard Worker	}
71*58e6ee5fSAndroid Build Coastguard Worker
72*58e6ee5fSAndroid Build Coastguard Worker
73*58e6ee5fSAndroid Build Coastguard WorkerIt is also fine to not use braces for simple conditionals and loops.
74*58e6ee5fSAndroid Build Coastguard Worker
75*58e6ee5fSAndroid Build Coastguard Worker	if (!x)
76*58e6ee5fSAndroid Build Coastguard Worker		y = x;
77*58e6ee5fSAndroid Build Coastguard Worker	else
78*58e6ee5fSAndroid Build Coastguard Worker		y = 1;
79*58e6ee5fSAndroid Build Coastguard Worker
80*58e6ee5fSAndroid Build Coastguard Worker	for (i = 0; i < 10; i++)
81*58e6ee5fSAndroid Build Coastguard Worker		foo(i);
82*58e6ee5fSAndroid Build Coastguard Worker
83*58e6ee5fSAndroid Build Coastguard Worker	while (getline(&line, &size, fp) > 0)
84*58e6ee5fSAndroid Build Coastguard Worker		printf("%s", line);
85*58e6ee5fSAndroid Build Coastguard Worker
86*58e6ee5fSAndroid Build Coastguard WorkerBut any complex or multiline conditional or loop should have braces even if it
87*58e6ee5fSAndroid Build Coastguard Workeris allowed not to by the C language.
88*58e6ee5fSAndroid Build Coastguard Worker
89*58e6ee5fSAndroid Build Coastguard Worker	if (x) {
90*58e6ee5fSAndroid Build Coastguard Worker		for (i = 0; i < 10; i++)
91*58e6ee5fSAndroid Build Coastguard Worker			foo(i);
92*58e6ee5fSAndroid Build Coastguard Worker	} else {
93*58e6ee5fSAndroid Build Coastguard Worker		foo(1);
94*58e6ee5fSAndroid Build Coastguard Worker	}
95*58e6ee5fSAndroid Build Coastguard Worker
96*58e6ee5fSAndroid Build Coastguard WorkerNotice above that even though the else portion is simple, it too has braces as
97*58e6ee5fSAndroid Build Coastguard Workerthe else and if blocks should match. If one is required to have braces, they
98*58e6ee5fSAndroid Build Coastguard Workerboth should have braces.
99*58e6ee5fSAndroid Build Coastguard Worker
100*58e6ee5fSAndroid Build Coastguard Worker
101*58e6ee5fSAndroid Build Coastguard WorkerSpaces
102*58e6ee5fSAndroid Build Coastguard Worker======
103*58e6ee5fSAndroid Build Coastguard Worker
104*58e6ee5fSAndroid Build Coastguard WorkerA single space should be used between C commands and their starting
105*58e6ee5fSAndroid Build Coastguard Workerparenthesis.
106*58e6ee5fSAndroid Build Coastguard Worker
107*58e6ee5fSAndroid Build Coastguard Worker	if (x)
108*58e6ee5fSAndroid Build Coastguard Worker	for (i = 0; i < 10; i++)
109*58e6ee5fSAndroid Build Coastguard Worker	while (getline(&line, &size, fp) > 0)
110*58e6ee5fSAndroid Build Coastguard Worker
111*58e6ee5fSAndroid Build Coastguard WorkerThere should be no space between function or macros and the starting
112*58e6ee5fSAndroid Build Coastguard Workerparenthesis.
113*58e6ee5fSAndroid Build Coastguard Worker
114*58e6ee5fSAndroid Build Coastguard Worker	foo(x)
115*58e6ee5fSAndroid Build Coastguard Worker	IS_VALID(y)
116*58e6ee5fSAndroid Build Coastguard Worker
117*58e6ee5fSAndroid Build Coastguard WorkerThis includes prototypes and declarations.
118*58e6ee5fSAndroid Build Coastguard Worker
119*58e6ee5fSAndroid Build Coastguard Worker	void foo(int x)
120*58e6ee5fSAndroid Build Coastguard Worker
121*58e6ee5fSAndroid Build Coastguard WorkerA space should be before and after assignment, comparison and algorithmic
122*58e6ee5fSAndroid Build Coastguard Workersigns.
123*58e6ee5fSAndroid Build Coastguard Worker
124*58e6ee5fSAndroid Build Coastguard Worker	i = 0;
125*58e6ee5fSAndroid Build Coastguard Worker	if (i < 10)
126*58e6ee5fSAndroid Build Coastguard Worker	if (i == 5)
127*58e6ee5fSAndroid Build Coastguard Worker
128*58e6ee5fSAndroid Build Coastguard Worker	y = i + 10;
129*58e6ee5fSAndroid Build Coastguard Worker
130*58e6ee5fSAndroid Build Coastguard Worker	i += 5;
131*58e6ee5fSAndroid Build Coastguard Worker
132*58e6ee5fSAndroid Build Coastguard WorkerFor structures, use tabs to make all the fields line up nicely.
133*58e6ee5fSAndroid Build Coastguard Worker
134*58e6ee5fSAndroid Build Coastguard Worker	struct {
135*58e6ee5fSAndroid Build Coastguard Worker		int			foo;
136*58e6ee5fSAndroid Build Coastguard Worker		int			bar;
137*58e6ee5fSAndroid Build Coastguard Worker		unsigned long long	time;
138*58e6ee5fSAndroid Build Coastguard Worker	};
139*58e6ee5fSAndroid Build Coastguard Worker
140*58e6ee5fSAndroid Build Coastguard WorkerVariable declarations
141*58e6ee5fSAndroid Build Coastguard Worker=====================
142*58e6ee5fSAndroid Build Coastguard Worker
143*58e6ee5fSAndroid Build Coastguard WorkerThe order of variables that are declared, should first keep the same types
144*58e6ee5fSAndroid Build Coastguard Workertogether, but also should be ordered by their length such that the variables
145*58e6ee5fSAndroid Build Coastguard Workerare ordered in an "upside-down Christmas tree" fashion where the length gets
146*58e6ee5fSAndroid Build Coastguard Workersmaller.
147*58e6ee5fSAndroid Build Coastguard Worker
148*58e6ee5fSAndroid Build Coastguard Worker	int tracecmd_count_cpus(void)
149*58e6ee5fSAndroid Build Coastguard Worker	{
150*58e6ee5fSAndroid Build Coastguard Worker		static int once;
151*58e6ee5fSAndroid Build Coastguard Worker		char buf[1024];
152*58e6ee5fSAndroid Build Coastguard Worker		int cpus = 0;
153*58e6ee5fSAndroid Build Coastguard Worker		char *pbuf;
154*58e6ee5fSAndroid Build Coastguard Worker		size_t *pn;
155*58e6ee5fSAndroid Build Coastguard Worker		FILE *fp;
156*58e6ee5fSAndroid Build Coastguard Worker		size_t n;
157*58e6ee5fSAndroid Build Coastguard Worker		int r;
158*58e6ee5fSAndroid Build Coastguard Worker
159*58e6ee5fSAndroid Build Coastguard WorkerThe above shows that the order is done by length, and in the above example it
160*58e6ee5fSAndroid Build Coastguard Workeralso shows that "int cpu = 0;" is not grouped next to "int r;". As this is more
161*58e6ee5fSAndroid Build Coastguard Workerof a guideline and made to be more aesthetic to the eye of the reader, both the
162*58e6ee5fSAndroid Build Coastguard Workerabove and is acceptable as below.
163*58e6ee5fSAndroid Build Coastguard Worker
164*58e6ee5fSAndroid Build Coastguard Worker	int tracecmd_count_cpus(void)
165*58e6ee5fSAndroid Build Coastguard Worker	{
166*58e6ee5fSAndroid Build Coastguard Worker		static int once;
167*58e6ee5fSAndroid Build Coastguard Worker		char buf[1024];
168*58e6ee5fSAndroid Build Coastguard Worker		char *pbuf;
169*58e6ee5fSAndroid Build Coastguard Worker		size_t *pn;
170*58e6ee5fSAndroid Build Coastguard Worker		FILE *fp;
171*58e6ee5fSAndroid Build Coastguard Worker		size_t n;
172*58e6ee5fSAndroid Build Coastguard Worker		int cpus = 0;
173*58e6ee5fSAndroid Build Coastguard Worker		int r;
174*58e6ee5fSAndroid Build Coastguard Worker
175*58e6ee5fSAndroid Build Coastguard Worker
176*58e6ee5fSAndroid Build Coastguard WorkerUnless variables are tightly related, it is expected that each variable be on
177*58e6ee5fSAndroid Build Coastguard Workerits own line and not grouped by type. That is,
178*58e6ee5fSAndroid Build Coastguard Worker
179*58e6ee5fSAndroid Build Coastguard Worker		int r, cpus = 0;
180*58e6ee5fSAndroid Build Coastguard Worker
181*58e6ee5fSAndroid Build Coastguard Workeris to be discouraged, as the two variables are not related to each other.
182*58e6ee5fSAndroid Build Coastguard WorkerBut if you had a bunch of counters:
183*58e6ee5fSAndroid Build Coastguard Worker
184*58e6ee5fSAndroid Build Coastguard Worker		int i, j, k;
185*58e6ee5fSAndroid Build Coastguard Worker
186*58e6ee5fSAndroid Build Coastguard WorkerThat would be fine, as the variables are all related as they are all for the
187*58e6ee5fSAndroid Build Coastguard Workersame purpose (arbitrary counters). The same may go with pointers;
188*58e6ee5fSAndroid Build Coastguard Worker
189*58e6ee5fSAndroid Build Coastguard Worker
190*58e6ee5fSAndroid Build Coastguard Worker	char *begin, *end;
191*58e6ee5fSAndroid Build Coastguard Worker
192*58e6ee5fSAndroid Build Coastguard WorkerComments
193*58e6ee5fSAndroid Build Coastguard Worker========
194*58e6ee5fSAndroid Build Coastguard Worker
195*58e6ee5fSAndroid Build Coastguard WorkerComments will use the "/* */" format and the C++ "//" style is discouraged.
196*58e6ee5fSAndroid Build Coastguard WorkerIf a comment is on one line, keep the "/*" and "*/" on the same line:
197*58e6ee5fSAndroid Build Coastguard Worker
198*58e6ee5fSAndroid Build Coastguard Worker	/* This is a single line comment. */
199*58e6ee5fSAndroid Build Coastguard Worker
200*58e6ee5fSAndroid Build Coastguard WorkerIf a comment spans more than one line, then have the "/*" on a separate line
201*58e6ee5fSAndroid Build Coastguard Workerbefore the comment and the "*/" on a separate line at the end of the comment,
202*58e6ee5fSAndroid Build Coastguard Workerand each line starts with a "*" where all the "*" line up with each other.
203*58e6ee5fSAndroid Build Coastguard Worker
204*58e6ee5fSAndroid Build Coastguard Worker	/*
205*58e6ee5fSAndroid Build Coastguard Worker	 * This is a multi line comment, where all the '*'
206*58e6ee5fSAndroid Build Coastguard Worker	 * will line up, and the text is on a separate line
207*58e6ee5fSAndroid Build Coastguard Worker	 * as the start and end markers.
208*58e6ee5fSAndroid Build Coastguard Worker	 */
209*58e6ee5fSAndroid Build Coastguard Worker
210*58e6ee5fSAndroid Build Coastguard Worker
211*58e6ee5fSAndroid Build Coastguard WorkerFunction documentation
212*58e6ee5fSAndroid Build Coastguard Worker======================
213*58e6ee5fSAndroid Build Coastguard Worker
214*58e6ee5fSAndroid Build Coastguard WorkerAll global functions (and especially any APIs) should have a function
215*58e6ee5fSAndroid Build Coastguard Workerdescription in the form of "kernel doc":
216*58e6ee5fSAndroid Build Coastguard Worker
217*58e6ee5fSAndroid Build Coastguard Worker  https://www.kernel.org/doc/html/latest/doc-guide/kernel-doc.html
218*58e6ee5fSAndroid Build Coastguard Worker
219*58e6ee5fSAndroid Build Coastguard WorkerThe form is:
220*58e6ee5fSAndroid Build Coastguard Worker
221*58e6ee5fSAndroid Build Coastguard Worker  /**
222*58e6ee5fSAndroid Build Coastguard Worker   * function_name() - Brief description of function.
223*58e6ee5fSAndroid Build Coastguard Worker   * @arg1: Describe the first argument.
224*58e6ee5fSAndroid Build Coastguard Worker   * @arg2: Describe the second argument.
225*58e6ee5fSAndroid Build Coastguard Worker   *        One can provide multiple line descriptions
226*58e6ee5fSAndroid Build Coastguard Worker   *        for arguments.
227*58e6ee5fSAndroid Build Coastguard Worker   *
228*58e6ee5fSAndroid Build Coastguard Worker   * A longer description, with more discussion of the function function_name()
229*58e6ee5fSAndroid Build Coastguard Worker   * that might be useful to those using or modifying it. Begins with an
230*58e6ee5fSAndroid Build Coastguard Worker   * empty comment line, and may include additional embedded empty
231*58e6ee5fSAndroid Build Coastguard Worker   * comment lines.
232*58e6ee5fSAndroid Build Coastguard Worker   *
233*58e6ee5fSAndroid Build Coastguard Worker   * The longer description may have multiple paragraphs.
234*58e6ee5fSAndroid Build Coastguard Worker   *
235*58e6ee5fSAndroid Build Coastguard Worker   * Context: Describes whether the function can sleep, what locks it takes,
236*58e6ee5fSAndroid Build Coastguard Worker   *          releases, or expects to be held. It can extend over multiple
237*58e6ee5fSAndroid Build Coastguard Worker   *          lines.
238*58e6ee5fSAndroid Build Coastguard Worker   * Return: Describe the return value of function_name.
239*58e6ee5fSAndroid Build Coastguard Worker   *
240*58e6ee5fSAndroid Build Coastguard Worker   * The return value description can also have multiple paragraphs, and should
241*58e6ee5fSAndroid Build Coastguard Worker   * be placed at the end of the comment block.
242*58e6ee5fSAndroid Build Coastguard Worker   */
243*58e6ee5fSAndroid Build Coastguard Worker
244*58e6ee5fSAndroid Build Coastguard WorkerStructure layout
245*58e6ee5fSAndroid Build Coastguard Worker================
246*58e6ee5fSAndroid Build Coastguard Worker
247*58e6ee5fSAndroid Build Coastguard WorkerThis is more about compaction than coding style. When creating structures, be
248*58e6ee5fSAndroid Build Coastguard Workeraware that if the fields are placed together without being sized by alignment,
249*58e6ee5fSAndroid Build Coastguard Workerthat the compiler will create "holes" in them.
250*58e6ee5fSAndroid Build Coastguard Worker
251*58e6ee5fSAndroid Build Coastguard Worker	struct {
252*58e6ee5fSAndroid Build Coastguard Worker		int			x;
253*58e6ee5fSAndroid Build Coastguard Worker		char			y;
254*58e6ee5fSAndroid Build Coastguard Worker		unsigned long long	f;
255*58e6ee5fSAndroid Build Coastguard Worker	};
256*58e6ee5fSAndroid Build Coastguard Worker
257*58e6ee5fSAndroid Build Coastguard WorkerAs int is 4 bytes in length, char is one byte, and unsigned long long is 8
258*58e6ee5fSAndroid Build Coastguard Workerbytes. The compiler will try to naturally align them by their size, and will
259*58e6ee5fSAndroid Build Coastguard Workerinclude padding (holes) inside the structure to do so. The above is equivalent
260*58e6ee5fSAndroid Build Coastguard Workerto:
261*58e6ee5fSAndroid Build Coastguard Worker
262*58e6ee5fSAndroid Build Coastguard Worker	struct {
263*58e6ee5fSAndroid Build Coastguard Worker		int			x;
264*58e6ee5fSAndroid Build Coastguard Worker		char			y;
265*58e6ee5fSAndroid Build Coastguard Worker		char			padding[3];
266*58e6ee5fSAndroid Build Coastguard Worker		unsigned long long	f;
267*58e6ee5fSAndroid Build Coastguard Worker	};
268*58e6ee5fSAndroid Build Coastguard Worker
269*58e6ee5fSAndroid Build Coastguard WorkerIt is best to try to organize the structure where there are no holes within
270*58e6ee5fSAndroid Build Coastguard Workerthem.
271*58e6ee5fSAndroid Build Coastguard Worker
272*58e6ee5fSAndroid Build Coastguard Worker	struct {
273*58e6ee5fSAndroid Build Coastguard Worker		unsigned long long	f;
274*58e6ee5fSAndroid Build Coastguard Worker		int			x;
275*58e6ee5fSAndroid Build Coastguard Worker		char			y;
276*58e6ee5fSAndroid Build Coastguard Worker	};
277*58e6ee5fSAndroid Build Coastguard Worker
278*58e6ee5fSAndroid Build Coastguard WorkerThe above is better formatting, even if there may be padding outside the
279*58e6ee5fSAndroid Build Coastguard Workerstructure, but the compiler will still have more flexibility to utilize the
280*58e6ee5fSAndroid Build Coastguard Workerspace outside the structure than what it can do within it.
281*58e6ee5fSAndroid Build Coastguard Worker
282*58e6ee5fSAndroid Build Coastguard WorkerGeneral
283*58e6ee5fSAndroid Build Coastguard Worker=======
284*58e6ee5fSAndroid Build Coastguard Worker
285*58e6ee5fSAndroid Build Coastguard WorkerAs stated, this is a guide and may not be strictly enforced. The goal is to
286*58e6ee5fSAndroid Build Coastguard Workerhave consistent and readable code. In general, try to have the coding style
287*58e6ee5fSAndroid Build Coastguard Workermatch the surrounding code.
288