mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
spa: utils: explicitly preserve errno in spa_cleanup handlers
The cleanup handlers like free(), close(), etc. aren't necessarily guaranteed to preserve errno, so do it explicitly. This allows for usage in functions that return NULL + errno to signal errors.
This commit is contained in:
parent
e7e1d25a89
commit
aa74a502d0
1 changed files with 9 additions and 0 deletions
|
|
@ -31,6 +31,7 @@ __extension__ ({ \
|
||||||
|
|
||||||
/* ========================================================================== */
|
/* ========================================================================== */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#define spa_steal_fd(fd) spa_exchange((fd), -1)
|
#define spa_steal_fd(fd) spa_exchange((fd), -1)
|
||||||
|
|
@ -53,7 +54,9 @@ __extension__ ({ \
|
||||||
typedef __typeof__(type) _spa_auto_cleanup_type_ ## name; \
|
typedef __typeof__(type) _spa_auto_cleanup_type_ ## name; \
|
||||||
static inline void _spa_auto_cleanup_func_ ## name (__typeof__(type) *thing) \
|
static inline void _spa_auto_cleanup_func_ ## name (__typeof__(type) *thing) \
|
||||||
{ \
|
{ \
|
||||||
|
int _save_errno = errno; \
|
||||||
__VA_ARGS__ \
|
__VA_ARGS__ \
|
||||||
|
errno = _save_errno; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define spa_auto(name) \
|
#define spa_auto(name) \
|
||||||
|
|
@ -64,7 +67,9 @@ static inline void _spa_auto_cleanup_func_ ## name (__typeof__(type) *thing) \
|
||||||
typedef __typeof__(type) * _spa_autoptr_cleanup_type_ ## name; \
|
typedef __typeof__(type) * _spa_autoptr_cleanup_type_ ## name; \
|
||||||
static inline void _spa_autoptr_cleanup_func_ ## name (__typeof__(type) **thing) \
|
static inline void _spa_autoptr_cleanup_func_ ## name (__typeof__(type) **thing) \
|
||||||
{ \
|
{ \
|
||||||
|
int _save_errno = errno; \
|
||||||
__VA_ARGS__ \
|
__VA_ARGS__ \
|
||||||
|
errno = _save_errno; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define spa_autoptr(name) \
|
#define spa_autoptr(name) \
|
||||||
|
|
@ -77,7 +82,9 @@ static inline void _spa_autoptr_cleanup_func_ ## name (__typeof__(type) **thing)
|
||||||
|
|
||||||
static inline void _spa_autofree_cleanup_func(void *p)
|
static inline void _spa_autofree_cleanup_func(void *p)
|
||||||
{
|
{
|
||||||
|
int save_errno = errno;
|
||||||
free(*(void **) p);
|
free(*(void **) p);
|
||||||
|
errno = save_errno;
|
||||||
}
|
}
|
||||||
#define spa_autofree spa_cleanup(_spa_autofree_cleanup_func)
|
#define spa_autofree spa_cleanup(_spa_autofree_cleanup_func)
|
||||||
|
|
||||||
|
|
@ -85,7 +92,9 @@ static inline void _spa_autofree_cleanup_func(void *p)
|
||||||
|
|
||||||
static inline void _spa_autoclose_cleanup_func(int *fd)
|
static inline void _spa_autoclose_cleanup_func(int *fd)
|
||||||
{
|
{
|
||||||
|
int save_errno = errno;
|
||||||
spa_clear_fd(*fd);
|
spa_clear_fd(*fd);
|
||||||
|
errno = save_errno;
|
||||||
}
|
}
|
||||||
#define spa_autoclose spa_cleanup(_spa_autoclose_cleanup_func)
|
#define spa_autoclose spa_cleanup(_spa_autoclose_cleanup_func)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue