| 1 | /* |
| 2 | * SPDX-License-Identifier: MIT |
| 3 | * |
| 4 | * Copyright 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
| 5 | */ |
| 6 | |
| 7 | #ifndef _BABELTRACE_INTERNAL_H |
| 8 | #define _BABELTRACE_INTERNAL_H |
| 9 | |
| 10 | #define bt_max_t(type, a, b) \ |
| 11 | ((type) (a) > (type) (b) ? (type) (a) : (type) (b)) |
| 12 | |
| 13 | /* |
| 14 | * BT_HIDDEN: set the hidden attribute for internal functions |
| 15 | * On Windows, symbols are local unless explicitly exported, |
| 16 | * see https://gcc.gnu.org/wiki/Visibility |
| 17 | */ |
| 18 | #if defined(_WIN32) || defined(__CYGWIN__) |
| 19 | #define BT_HIDDEN |
| 20 | #else |
| 21 | #define BT_HIDDEN __attribute__((visibility("hidden"))) |
| 22 | #endif |
| 23 | |
| 24 | /* |
| 25 | * Yield `ref`'s value while setting `ref` to NULL. |
| 26 | * |
| 27 | * This can be used to give a strong reference to a callee: |
| 28 | * |
| 29 | * add_foo_to_list(list, BT_MOVE_REF(foo)); |
| 30 | * |
| 31 | * or in a simple assignment: |
| 32 | * |
| 33 | * my_struct->foo = BT_MOVE_REF(foo); |
| 34 | * |
| 35 | * When moving a reference in a function call, the reference is given to the |
| 36 | * callee even if that function call fails, so make sure the called function |
| 37 | * is written accordingly. |
| 38 | */ |
| 39 | |
| 40 | #define BT_MOVE_REF(ref) \ |
| 41 | ({ \ |
| 42 | typeof(ref) _ref = ref; \ |
| 43 | ref = NULL; \ |
| 44 | _ref; \ |
| 45 | }) |
| 46 | |
| 47 | #endif |