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>
 | 
			
		||||
 | 
			
		||||
#define spa_steal_fd(fd) spa_exchange((fd), -1)
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +54,9 @@ __extension__ ({ \
 | 
			
		|||
typedef __typeof__(type) _spa_auto_cleanup_type_ ## name; \
 | 
			
		||||
static inline void _spa_auto_cleanup_func_ ## name (__typeof__(type) *thing) \
 | 
			
		||||
{ \
 | 
			
		||||
	int _save_errno = errno; \
 | 
			
		||||
	__VA_ARGS__ \
 | 
			
		||||
	errno = _save_errno; \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#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; \
 | 
			
		||||
static inline void _spa_autoptr_cleanup_func_ ## name (__typeof__(type) **thing) \
 | 
			
		||||
{ \
 | 
			
		||||
	int _save_errno = errno; \
 | 
			
		||||
	__VA_ARGS__ \
 | 
			
		||||
	errno = _save_errno; \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#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)
 | 
			
		||||
{
 | 
			
		||||
	int save_errno = errno;
 | 
			
		||||
	free(*(void **) p);
 | 
			
		||||
	errno = save_errno;
 | 
			
		||||
}
 | 
			
		||||
#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)
 | 
			
		||||
{
 | 
			
		||||
	int save_errno = errno;
 | 
			
		||||
	spa_clear_fd(*fd);
 | 
			
		||||
	errno = save_errno;
 | 
			
		||||
}
 | 
			
		||||
#define spa_autoclose spa_cleanup(_spa_autoclose_cleanup_func)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue