| |
| trace-cmd coding-style |
| ====================== |
| |
| The coding style of trace-cmd and the tracing libraries (libtracefs and |
| libtraceevent) are very similar to the Linux kernel coding style: |
| |
| https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/coding-style.rst |
| |
| Indentation |
| =========== |
| |
| Tabs are used for the start of indentation (the '\t' character), and should be |
| set to 8 characters. Spaces may be used at the end for continued lines where |
| having the start of text line up to braces in the previous line is not |
| divisible by 8. |
| |
| Max line width |
| ============== |
| |
| All lines should not be more than 100 characters in length. |
| |
| This is a guide, as readability is more important than breaking lines up into a |
| hard limit. Ideally, strings should never be broken up except for where a new |
| line is added. |
| |
| printf("This is a line that may continue for a very long string.\n" |
| "This is another line, but after a new line\n"); |
| |
| But line breaks should not be: |
| |
| printf("This is a line that may continue for a very" |
| "long string.\n This is another line," |
| "but after a new line\n"); |
| |
| Not only is the above not as readable as the first version, it is not |
| even equivalent, because it is missing spaces between the line breaks. |
| For this reason, finish the string on the same line, even if that string |
| breaks the 100 character limit. |
| |
| Brackets and braces |
| =================== |
| |
| For all conditionals, the braces start on the same line: |
| |
| if (cond) { |
| } |
| |
| And the ending brace is at the same indentation as the conditional. |
| |
| while (cond) { |
| } |
| |
| do { |
| } while (cond); |
| |
| for (i = 0; i < 10; i++) { |
| } |
| |
| The same is true for structures: |
| |
| struct my_struct { |
| int field; |
| }; |
| |
| But for functions, the braces should start on the following line: |
| |
| void my_function(void) |
| { |
| } |
| |
| |
| It is also fine to not use braces for simple conditionals and loops. |
| |
| if (!x) |
| y = x; |
| else |
| y = 1; |
| |
| for (i = 0; i < 10; i++) |
| foo(i); |
| |
| while (getline(&line, &size, fp) > 0) |
| printf("%s", line); |
| |
| But any complex or multiline conditional or loop should have braces even if it |
| is allowed not to by the C language. |
| |
| if (x) { |
| for (i = 0; i < 10; i++) |
| foo(i); |
| } else { |
| foo(1); |
| } |
| |
| Notice above that even though the else portion is simple, it too has braces as |
| the else and if blocks should match. If one is required to have braces, they |
| both should have braces. |
| |
| |
| Spaces |
| ====== |
| |
| A single space should be used between C commands and their starting |
| parenthesis. |
| |
| if (x) |
| for (i = 0; i < 10; i++) |
| while (getline(&line, &size, fp) > 0) |
| |
| There should be no space between function or macros and the starting |
| parenthesis. |
| |
| foo(x) |
| IS_VALID(y) |
| |
| This includes prototypes and declarations. |
| |
| void foo(int x) |
| |
| A space should be before and after assignment, comparison and algorithmic |
| signs. |
| |
| i = 0; |
| if (i < 10) |
| if (i == 5) |
| |
| y = i + 10; |
| |
| i += 5; |
| |
| For structures, use tabs to make all the fields line up nicely. |
| |
| struct { |
| int foo; |
| int bar; |
| unsigned long long time; |
| }; |
| |
| Variable declarations |
| ===================== |
| |
| The order of variables that are declared, should first keep the same types |
| together, but also should be ordered by their length such that the variables |
| are ordered in an "upside-down Christmas tree" fashion where the length gets |
| smaller. |
| |
| int tracecmd_count_cpus(void) |
| { |
| static int once; |
| char buf[1024]; |
| int cpus = 0; |
| char *pbuf; |
| size_t *pn; |
| FILE *fp; |
| size_t n; |
| int r; |
| |
| The above shows that the order is done by length, and in the above example it |
| also shows that "int cpu = 0;" is not grouped next to "int r;". As this is more |
| of a guideline and made to be more aesthetic to the eye of the reader, both the |
| above and is acceptable as below. |
| |
| int tracecmd_count_cpus(void) |
| { |
| static int once; |
| char buf[1024]; |
| char *pbuf; |
| size_t *pn; |
| FILE *fp; |
| size_t n; |
| int cpus = 0; |
| int r; |
| |
| |
| Unless variables are tightly related, it is expected that each variable be on |
| its own line and not grouped by type. That is, |
| |
| int r, cpus = 0; |
| |
| is to be discouraged, as the two variables are not related to each other. |
| But if you had a bunch of counters: |
| |
| int i, j, k; |
| |
| That would be fine, as the variables are all related as they are all for the |
| same purpose (arbitrary counters). The same may go with pointers; |
| |
| |
| char *begin, *end; |
| |
| Comments |
| ======== |
| |
| Comments will use the "/* */" format and the C++ "//" style is discouraged. |
| If a comment is on one line, keep the "/*" and "*/" on the same line: |
| |
| /* This is a single line comment. */ |
| |
| If a comment spans more than one line, then have the "/*" on a separate line |
| before the comment and the "*/" on a separate line at the end of the comment, |
| and each line starts with a "*" where all the "*" line up with each other. |
| |
| /* |
| * This is a multi line comment, where all the '*' |
| * will line up, and the text is on a separate line |
| * as the start and end markers. |
| */ |
| |
| |
| Function documentation |
| ====================== |
| |
| All global functions (and especially any APIs) should have a function |
| description in the form of "kernel doc": |
| |
| https://www.kernel.org/doc/html/latest/doc-guide/kernel-doc.html |
| |
| The form is: |
| |
| /** |
| * function_name() - Brief description of function. |
| * @arg1: Describe the first argument. |
| * @arg2: Describe the second argument. |
| * One can provide multiple line descriptions |
| * for arguments. |
| * |
| * A longer description, with more discussion of the function function_name() |
| * that might be useful to those using or modifying it. Begins with an |
| * empty comment line, and may include additional embedded empty |
| * comment lines. |
| * |
| * The longer description may have multiple paragraphs. |
| * |
| * Context: Describes whether the function can sleep, what locks it takes, |
| * releases, or expects to be held. It can extend over multiple |
| * lines. |
| * Return: Describe the return value of function_name. |
| * |
| * The return value description can also have multiple paragraphs, and should |
| * be placed at the end of the comment block. |
| */ |
| |
| Structure layout |
| ================ |
| |
| This is more about compaction than coding style. When creating structures, be |
| aware that if the fields are placed together without being sized by alignment, |
| that the compiler will create "holes" in them. |
| |
| struct { |
| int x; |
| char y; |
| unsigned long long f; |
| }; |
| |
| As int is 4 bytes in length, char is one byte, and unsigned long long is 8 |
| bytes. The compiler will try to naturally align them by their size, and will |
| include padding (holes) inside the structure to do so. The above is equivalent |
| to: |
| |
| struct { |
| int x; |
| char y; |
| char padding[3]; |
| unsigned long long f; |
| }; |
| |
| It is best to try to organize the structure where there are no holes within |
| them. |
| |
| struct { |
| unsigned long long f; |
| int x; |
| char y; |
| }; |
| |
| The above is better formatting, even if there may be padding outside the |
| structure, but the compiler will still have more flexibility to utilize the |
| space outside the structure than what it can do within it. |
| |
| General |
| ======= |
| |
| As stated, this is a guide and may not be strictly enforced. The goal is to |
| have consistent and readable code. In general, try to have the coding style |
| match the surrounding code. |