[PATCH weston v2] input: Free the memory allocated to store the device resource lists

Rob Bradford robert.bradford at intel.com
Mon Jul 22 10:11:21 PDT 2013


From: Rob Bradford <rob at linux.intel.com>

v2: Walk the array manually as wl_array_for_each is bytewise we're
storing pointers that we need to free.
---
 src/input.c | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/src/input.c b/src/input.c
index 25f2a3e..08b138c 100644
--- a/src/input.c
+++ b/src/input.c
@@ -366,10 +366,17 @@ weston_pointer_create(void)
 WL_EXPORT void
 weston_pointer_destroy(struct weston_pointer *pointer)
 {
+	void **p;
+
 	if (pointer->sprite)
 		pointer_unmap_sprite(pointer);
 
-	/* XXX: What about pointer->resource_list? */
+	for (p = pointer->resources.data;
+	     p < (void **)(pointer->resources.data + pointer->resources.size);
+	     p+= sizeof(struct wl_list *))
+		free(*p);
+	wl_array_release(&pointer->resources);
+
 	if (!wl_list_empty(pointer->focus_resource_list))
 		wl_list_remove(&pointer->focus_listener.link);
 	free(pointer);
@@ -400,7 +407,14 @@ weston_keyboard_create(void)
 WL_EXPORT void
 weston_keyboard_destroy(struct weston_keyboard *keyboard)
 {
-	/* XXX: What about keyboard->resource_list? */
+	void **p;
+
+	for (p = keyboard->resources.data;
+	     p < (void **)(keyboard->resources.data + keyboard->resources.size);
+	     p+= sizeof(struct wl_list *))
+		free(*p);
+	wl_array_release(&keyboard->resources);
+
 	if (!wl_list_empty(keyboard->focus_resource_list))
 		wl_list_remove(&keyboard->focus_listener.link);
 	wl_array_release(&keyboard->keys);
@@ -431,7 +445,14 @@ weston_touch_create(void)
 WL_EXPORT void
 weston_touch_destroy(struct weston_touch *touch)
 {
-	/* XXX: What about touch->resource_list? */
+	void **p;
+
+	for (p = touch->resources.data;
+	     p < (void **)(touch->resources.data + touch->resources.size);
+	     p+= sizeof(struct wl_list *))
+		free(*p);
+	wl_array_release(&touch->resources);
+
 	if (!wl_list_empty(touch->focus_resource_list))
 		wl_list_remove(&touch->focus_listener.link);
 	free(touch);
-- 
1.8.3.1



More information about the wayland-devel mailing list