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