[PATCH xf86-input-libinput] Use __attribute__((cleanup)) for most of the xf86SetStrOption handling

Hans de Goede hdegoede at redhat.com
Fri Nov 11 08:36:30 UTC 2016


Hi,

On 11-11-16 02:08, Peter Hutterer wrote:
> Code was already clean, but this removes error path handling.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> Somewhat in two minds about it because it doesn't gain us that much in this
> codebase. I want to start using this more because it is quite useful and
> this is a low-key project to start with :)

I'm not really a fan of using these gcc specific __attribute__ thingies.

Regards,

Hanse

>
>  src/xf86libinput.c | 51 +++++++++++++++++++++------------------------------
>  1 file changed, 21 insertions(+), 30 deletions(-)
>
> diff --git a/src/xf86libinput.c b/src/xf86libinput.c
> index a6481bc..5f7a551 100644
> --- a/src/xf86libinput.c
> +++ b/src/xf86libinput.c
> @@ -84,6 +84,10 @@
>  #define CAP_TABLET_TOOL	0x10
>  #define CAP_TABLET_PAD	0x20
>
> +static inline void freep(void *p) { free(*(void**)p); }
> +#define _cleanup_(x_) __attribute__((cleanup(x_)))
> +#define _autofree_ __attribute__((cleanup(freep)))
> +
>  struct xf86libinput_driver {
>  	struct libinput *libinput;
>  	int device_enabled_count;
> @@ -236,12 +240,11 @@ btn_xorg2linux(unsigned int b)
>  static BOOL
>  xf86libinput_is_subdevice(InputInfoPtr pInfo)
>  {
> -	char *source;
> +	_autofree_ char *source = NULL;
>  	BOOL is_subdevice;
>
>  	source = xf86SetStrOption(pInfo->options, "_source", "");
>  	is_subdevice = strcmp(source, "_driver/libinput") == 0;
> -	free(source);
>
>  	return is_subdevice;
>  }
> @@ -1134,12 +1137,11 @@ xf86libinput_init(DeviceIntPtr dev)
>  static bool
>  is_libinput_device(InputInfoPtr pInfo)
>  {
> -	char *driver;
> +	_autofree_ char *driver = NULL;
>  	BOOL rc;
>
>  	driver = xf86CheckStrOption(pInfo->options, "driver", "");
>  	rc = strcmp(driver, "libinput") == 0;
> -	free(driver);
>
>  	return rc;
>  }
> @@ -2012,13 +2014,12 @@ open_restricted(const char *path, int flags, void *data)
>  	int fd = -1;
>
>  	nt_list_for_each_entry(pInfo, xf86FirstLocalDevice(), next) {
> -		char *device = xf86CheckStrOption(pInfo->options, "Device", NULL);
> +		_autofree_ char *device = NULL;
>
> -		if (device != NULL && strcmp(path, device) == 0) {
> -			free(device);
> +		device = xf86CheckStrOption(pInfo->options, "Device", NULL);
> +
> +		if (device != NULL && strcmp(path, device) == 0)
>  			break;
> -		}
> -		free(device);
>  	}
>
>  	if (pInfo == NULL) {
> @@ -2176,7 +2177,7 @@ xf86libinput_parse_tap_buttonmap_option(InputInfoPtr pInfo,
>  					struct libinput_device *device)
>  {
>  	enum libinput_config_tap_button_map map;
> -	char *str;
> +	_autofree_ char *str = NULL;
>
>  	if (libinput_device_config_tap_get_finger_count(device) == 0)
>  		return FALSE;
> @@ -2194,7 +2195,6 @@ xf86libinput_parse_tap_buttonmap_option(InputInfoPtr pInfo,
>  			xf86IDrvMsg(pInfo, X_ERROR,
>  				    "Invalid TapButtonMap: %s\n",
>  				    str);
> -		free(str);
>  	}
>
>  	if (libinput_device_config_tap_set_button_map(device, map) !=
> @@ -2236,7 +2236,7 @@ xf86libinput_parse_accel_profile_option(InputInfoPtr pInfo,
>  					struct libinput_device *device)
>  {
>  	enum libinput_config_accel_profile profile;
> -	char *str;
> +	_autofree_ char *str = NULL;
>
>  	if (libinput_device_config_accel_get_profiles(device) ==
>  	    LIBINPUT_CONFIG_ACCEL_PROFILE_NONE)
> @@ -2256,8 +2256,6 @@ xf86libinput_parse_accel_profile_option(InputInfoPtr pInfo,
>  		profile = libinput_device_config_accel_get_profile(device);
>  	}
>
> -	free(str);
> -
>  	return profile;
>  }
>
> @@ -2290,7 +2288,7 @@ static inline enum libinput_config_send_events_mode
>  xf86libinput_parse_sendevents_option(InputInfoPtr pInfo,
>  				     struct libinput_device *device)
>  {
> -	char *modestr;
> +	_autofree_ char *modestr = NULL;
>  	enum libinput_config_send_events_mode mode;
>
>  	if (libinput_device_config_send_events_get_modes(device) == LIBINPUT_CONFIG_SEND_EVENTS_ENABLED)
> @@ -2311,7 +2309,6 @@ xf86libinput_parse_sendevents_option(InputInfoPtr pInfo,
>  			xf86IDrvMsg(pInfo, X_ERROR,
>  				    "Invalid SendeventsMode: %s\n",
>  				    modestr);
> -		free(modestr);
>  	}
>
>  	if (libinput_device_config_send_events_set_mode(device, mode) !=
> @@ -2329,7 +2326,7 @@ xf86libinput_parse_calibration_option(InputInfoPtr pInfo,
>  				      struct libinput_device *device,
>  				      float matrix_out[9])
>  {
> -	char *str;
> +	_autofree_ char *str = NULL;
>  	float matrix[9] = { 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
>  	int num_calibration;
>
> @@ -2363,7 +2360,6 @@ xf86libinput_parse_calibration_option(InputInfoPtr pInfo,
>  	} else
>  		xf86IDrvMsg(pInfo, X_ERROR,
>  			    "Failed to apply matrix: %s, using default\n",  str);
> -	free(str);
>  }
>
>  static inline BOOL
> @@ -2396,7 +2392,7 @@ xf86libinput_parse_scroll_option(InputInfoPtr pInfo,
>  {
>  	uint32_t scroll_methods;
>  	enum libinput_config_scroll_method m;
> -	char *method;
> +	_autofree_ char *method = NULL;
>
>  	scroll_methods = libinput_device_config_scroll_get_methods(device);
>  	if (scroll_methods == LIBINPUT_CONFIG_SCROLL_NO_SCROLL)
> @@ -2420,7 +2416,6 @@ xf86libinput_parse_scroll_option(InputInfoPtr pInfo,
>  		m = libinput_device_config_scroll_get_method(device);
>  	}
>
> -	free(method);
>  	return m;
>  }
>
> @@ -2458,7 +2453,7 @@ xf86libinput_parse_clickmethod_option(InputInfoPtr pInfo,
>  {
>  	uint32_t click_methods = libinput_device_config_click_get_methods(device);
>  	enum libinput_config_click_method m;
> -	char *method;
> +	_autofree_ char *method = NULL;
>
>  	if (click_methods == LIBINPUT_CONFIG_CLICK_METHOD_NONE)
>  		return LIBINPUT_CONFIG_CLICK_METHOD_NONE;
> @@ -2479,7 +2474,6 @@ xf86libinput_parse_clickmethod_option(InputInfoPtr pInfo,
>  			    method);
>  		m = libinput_device_config_click_get_method(device);
>  	}
> -	free(method);
>
>  	return m;
>  }
> @@ -2536,7 +2530,8 @@ xf86libinput_parse_buttonmap_option(InputInfoPtr pInfo,
>  				    size_t size)
>  {
>  	const int MAXBUTTONS = 32;
> -	char *mapping, *map, *s = NULL;
> +	_autofree_ char *mapping = NULL;
> +	char *map, *s = NULL;
>  	int idx = 1;
>
>  	init_button_map(btnmap, size);
> @@ -2561,22 +2556,19 @@ xf86libinput_parse_buttonmap_option(InputInfoPtr pInfo,
>  		btnmap[idx++] = btn;
>  		map = s;
>  	} while (s && *s != '\0' && idx < MAXBUTTONS);
> -
> -	free(mapping);
>  }
>
>  static inline void
>  xf86libinput_parse_draglock_option(InputInfoPtr pInfo,
>  				   struct xf86libinput *driver_data)
>  {
> -	char *str;
> +	_autofree_ char *str = NULL;
>
>  	str = xf86CheckStrOption(pInfo->options, "DragLockButtons",NULL);
>  	if (draglock_init_from_string(&driver_data->draglock, str) != 0)
>  		xf86IDrvMsg(pInfo, X_ERROR,
>  			    "Invalid DragLockButtons option: \"%s\"\n",
>  			    str);
> -	free(str);
>  }
>
>  static inline BOOL
> @@ -2851,7 +2843,7 @@ xf86libinput_pre_init(InputDriverPtr drv,
>  	struct xf86libinput_device *shared_device = NULL;
>  	struct libinput *libinput = NULL;
>  	struct libinput_device *device;
> -	char *path = NULL;
> +	_autofree_ char *path = NULL;
>  	bool is_subdevice;
>
>  	pInfo->type_name = 0;
> @@ -2926,7 +2918,7 @@ xf86libinput_pre_init(InputDriverPtr drv,
>  	driver_data->pInfo = pInfo;
>  	driver_data->scroll.vdist = 15;
>  	driver_data->scroll.hdist = 15;
> -	driver_data->path = path;
> +	driver_data->path = strdup(path);
>  	driver_data->shared_device = shared_device;
>  	xorg_list_append(&driver_data->shared_device_link,
>  			 &shared_device->device_list);
> @@ -2977,7 +2969,6 @@ fail:
>  		if (driver_data->valuators_unaccelerated)
>  			valuator_mask_free(&driver_data->valuators_unaccelerated);
>  	}
> -	free(path);
>  	if (shared_device)
>  		xf86libinput_shared_unref(shared_device);
>  	free(driver_data);
>


More information about the xorg-devel mailing list