mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-22 08:56:59 -05:00
spa: fixes for dereferencing pointer to incomplete type in __typeof__
before gcc 10 its not supporting pointer dereferencing in __typeof__.
so made changes according to that. Fixes #3375
clang also defines __GNUC__ and resolves '4' along with __clang__ which
resolves '1'. On any version of clang, __GNUC__ and resolves '4'.
anyway clang has this feature since version 3.
This commit is contained in:
parent
3a8894d2a4
commit
c6c3259a08
1 changed files with 16 additions and 0 deletions
|
|
@ -40,13 +40,20 @@ __extension__ ({ \
|
||||||
_old_value; \
|
_old_value; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#if __GNUC__ > 10 || defined(__clang__)
|
||||||
#define spa_steal_ptr(ptr) ((__typeof__(*(ptr)) *) spa_exchange((ptr), NULL))
|
#define spa_steal_ptr(ptr) ((__typeof__(*(ptr)) *) spa_exchange((ptr), NULL))
|
||||||
|
#else
|
||||||
|
#define spa_steal_ptr(ptr) ((__typeof__(ptr)) spa_exchange((ptr), NULL))
|
||||||
|
#endif
|
||||||
|
|
||||||
#define spa_steal_fd(fd) spa_exchange((fd), -1)
|
#define spa_steal_fd(fd) spa_exchange((fd), -1)
|
||||||
|
|
||||||
/* ========================================================================== */
|
/* ========================================================================== */
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
#if __GNUC__ > 10 || defined(__clang__)
|
||||||
#define spa_clear_ptr(ptr, destructor) \
|
#define spa_clear_ptr(ptr, destructor) \
|
||||||
__extension__ ({ \
|
__extension__ ({ \
|
||||||
__typeof__(*(ptr)) *_old_value = spa_steal_ptr(ptr); \
|
__typeof__(*(ptr)) *_old_value = spa_steal_ptr(ptr); \
|
||||||
|
|
@ -54,6 +61,15 @@ __extension__ ({ \
|
||||||
destructor(_old_value); \
|
destructor(_old_value); \
|
||||||
(void) 0; \
|
(void) 0; \
|
||||||
})
|
})
|
||||||
|
#else
|
||||||
|
#define spa_clear_ptr(ptr, destructor) \
|
||||||
|
__extension__ ({ \
|
||||||
|
__typeof__(ptr) _old_value = spa_steal_ptr(ptr); \
|
||||||
|
if (_old_value) \
|
||||||
|
destructor(_old_value); \
|
||||||
|
(void) 0; \
|
||||||
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline void _spa_autofree_cleanup_func(void *p)
|
static inline void _spa_autofree_cleanup_func(void *p)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue