X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=blobdiff_plain;f=CodingStyle;h=bae8cd65ced7caf87a5bfe21a734fea8f1dc3853;hp=f4765ad8dc36e4e926830619c704f4c4a7897652;hb=HEAD;hpb=f1acd62b54376a425a975f9af501c4c8c5689b39 diff --git a/CodingStyle b/CodingStyle index f4765ad8d..bae8cd65c 100644 --- a/CodingStyle +++ b/CodingStyle @@ -156,6 +156,12 @@ parameters and their corresponding size parameters should be paired. ... } +Functions that destroy an instance of a dynamically-allocated type +should accept and ignore a null pointer argument. Code that calls +such a function (including the C standard library function free()) +should omit a null-pointer check. We find that this usually makes +code easier to read. + FUNCTION PROTOTYPES @@ -218,7 +224,7 @@ statement, that is, write "return 0;" and not "return(0);" break; default: - NOT_REACHED(); + OVS_NOT_REACHED(); } "switch" statements with very short, uniform cases may use an @@ -243,6 +249,18 @@ details. (Some compilers also assume that the "if" branch is the more common case, so this can be a real form of optimization as well.) +RETURN VALUES + + For functions that return a success or failure indication, prefer +one of the following return value conventions: + + * An "int" where 0 indicates success and a positive errno value + indicates a reason for failure. + + * A "bool" where true indicates success and false indicates + failure. + + MACROS Don't define an object-like macro if an enum can be used instead. @@ -280,6 +298,21 @@ the name of each enum. For example: }; +THREAD SAFETY ANNOTATIONS + + Use the macros in lib/compiler.h to annotate locking requirements. +For example: + + static struct ovs_mutex mutex = OVS_MUTEX_INITIALIZER; + static struct ovs_rwlock rwlock = OVS_RWLOCK_INITIALIZER; + + void function_require_plain_mutex(void) OVS_REQUIRES(mutex); + void function_require_rwlock(void) OVS_REQ_RDLOCK(rwlock); + + Pass lock objects, not their addresses, to the annotation macros. +(Thus we have OVS_REQUIRES(mutex) above, not OVS_REQUIRES(&mutex).) + + SOURCE FILES Each source file should state its license in a comment at the very @@ -361,7 +394,21 @@ from . integer types. Use the PRId, PRIu, and PRIx macros from for formatting them with printf() and related functions. - Use %zu to format size_t with printf(). + For compatibility with antique printf() implementations: + + - Instead of "%zu", use "%"PRIuSIZE. + + - Instead of "%td", use "%"PRIdPTR. + + - Instead of "%ju", use "%"PRIuMAX. + +Other variants exist for different radixes. For example, use +"%"PRIxSIZE instead of "%zx" or "%x" instead of "%hhx". + + Also, instead of "%hhd", use "%d". Be cautious substituting "%u", +"%x", and "%o" for the corresponding versions with "hh": cast the +argument to unsigned char if necessary, because printf("%hhu", -1) +prints 255 but printf("%u", -1) prints 4294967295. Use bit-fields sparingly. Do not use bit-fields for layout of network protocol fields or in other circumstances where the exact @@ -412,13 +459,8 @@ Exception 1: Put a space after (but not before) the "sizeof" keyword. Exception 2: Put a space between the () used in a cast and the expression whose type is cast: (void *) 0. - Break long lines before binary operators and the ternary operators ? -and :, rather than after them, e.g. - - if (first_long_condition() || second_long_condition() - || third_long_condition()) - -and + Break long lines before the ternary operators ? and :, rather than +after them, e.g. return (out_port != VIGP_CONTROL_PATH ? alpheus_output_port(dp, skb, out_port) @@ -431,8 +473,8 @@ precedence makes it necessary, or unless the operands are themselves expressions that use && and ||. Thus: if (!isdigit((unsigned char)s[0]) - || !isdigit((unsigned char)s[1]) - || !isdigit((unsigned char)s[2])) { + || !isdigit((unsigned char)s[1]) + || !isdigit((unsigned char)s[2])) { printf("string %s does not start with 3-digit code\n", s); } @@ -473,9 +515,7 @@ global variables. C DIALECT - Try to avoid using GCC extensions where possible. - - Some C99 extensions are OK: + Some C99 features are OK because they are widely implemented: * Flexible array members (e.g. struct { int foo[]; }). @@ -490,12 +530,11 @@ C DIALECT only take on the values 0 or 1, because this behavior can't be simulated on C89 compilers. - Don't use other C99 extensions, and especially: - - * Don't use // comments. + * Designated initializers (e.g. "struct foo foo = {.a = 1};" and + "int a[] = {[2] = 5};"). - * Don't use designated initializers (e.g. don't write "struct foo - foo = {.a = 1};" or "int a[] = {[2] = 5};"). + Don't use other C99 features that are not widely implemented in +older compilers: * Don't mix declarations and code within a block. @@ -504,3 +543,11 @@ C DIALECT * Don't put a trailing comma in an enum declaration (e.g. don't write "enum { x = 1, };"). + + As a matter of style, avoid // comments. + + Avoid using GCC or Clang extensions unless you also add a fallback +for other compilers. You can, however, use C99 features or GCC +extensions also supported by Clang in code that compiles only on +GNU/Linux (such as lib/netdev-linux.c), because GCC is the system +compiler there.