X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Foptional.h;h=0d99fe3224f4e419679d22627a0f4899f0c2a9d2;hp=1da5fda5da21ac0e8d9acd9c4b7f9f3821b950a9;hb=3da864a94ccc39239fea82c4803b58b6b56a1003;hpb=2c5ff4e47394f9588ac1a0ab50e8fbdf36727cbe diff --git a/src/common/optional.h b/src/common/optional.h index 1da5fda5d..0d99fe322 100644 --- a/src/common/optional.h +++ b/src/common/optional.h @@ -1,18 +1,8 @@ /* - * Copyright (C) 2019 - Jérémie Galarneau + * Copyright (C) 2019 Jérémie Galarneau * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2 only, - * as published by the Free Software Foundation. + * SPDX-License-Identifier: GPL-2.0-only * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef LTTNG_OPTIONAL_H @@ -32,9 +22,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 +44,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 +63,19 @@ */ #define LTTNG_OPTIONAL_GET(optional) \ ({ \ - assert(optional.is_set); \ - optional.value; \ + assert((optional).is_set); \ + (optional).value; \ + }) + +/* + * This macro is available as a 'convenience' to allow sites that assume + * an optional value is set to assert() that it is set when fecthing the + * underlying value's address. + */ +#define LTTNG_OPTIONAL_GET_PTR(optional) \ + ({ \ + assert((optional).is_set); \ + &(optional).value; \ }) /* @@ -79,12 +87,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 */