X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Foptional.h;h=53215b0315e299695e03ec67dc49890176707cd4;hp=1da5fda5da21ac0e8d9acd9c4b7f9f3821b950a9;hb=bc2dc8d464c34ad5a51ed46e46c6fc98a5bbf3fd;hpb=2c5ff4e47394f9588ac1a0ab50e8fbdf36727cbe diff --git a/src/common/optional.h b/src/common/optional.h index 1da5fda5d..53215b031 100644 --- a/src/common/optional.h +++ b/src/common/optional.h @@ -32,9 +32,6 @@ * Prefer using this macro where "special" values would be used, e.g. * -1ULL for uint64_t types. * - * LTTNG_OPTIONAL should be combined with the LTTNG_PACKED macro when - * used for IPC / network communication. - * * Declaration example: * struct my_struct { * int a; @@ -57,6 +54,16 @@ type value; \ } +/* + * Alias used for communication structures. If the layout of an LTTNG_OPTIONAL + * is changed, the original layout should still be used for communication + * purposes. + * + * LTTNG_OPTIONAL_COMM should be combined with the LTTNG_PACKED macro when + * used for IPC / network communication. + */ +#define LTTNG_OPTIONAL_COMM LTTNG_OPTIONAL + /* * This macro is available as a 'convenience' to allow sites that assume * an optional value is set to assert() that it is set when accessing it. @@ -66,8 +73,8 @@ */ #define LTTNG_OPTIONAL_GET(optional) \ ({ \ - assert(optional.is_set); \ - optional.value; \ + assert((optional).is_set); \ + (optional).value; \ }) /* @@ -79,12 +86,16 @@ #define LTTNG_OPTIONAL_INIT { .is_set = 0 } /* Set the value of an optional field. */ -#define LTTNG_OPTIONAL_SET(field_ptr, val) \ - (field_ptr)->value = val; \ - (field_ptr)->is_set = 1; +#define LTTNG_OPTIONAL_SET(field_ptr, val) \ + do { \ + (field_ptr)->value = (val); \ + (field_ptr)->is_set = 1; \ + } while (0) /* Put an optional field in the "unset" (NULL-ed) state. */ -#define LTTNG_OPTIONAL_UNSET(field_ptr) \ - (field_ptr)->is_set = 0; +#define LTTNG_OPTIONAL_UNSET(field_ptr) \ + do { \ + (field_ptr)->is_set = 0; \ + } while (0) #endif /* LTTNG_OPTIONAL_H */