* 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;
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.
*/
#define LTTNG_OPTIONAL_GET(optional) \
({ \
- assert(optional.is_set); \
- optional.value; \
+ assert((optional).is_set); \
+ (optional).value; \
})
/*
#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 */