evdev: free aux_data list when device is destroy
authorJengHyun Kang <jhyuni.kang@samsung.com>
Wed, 7 Jun 2017 11:10:07 +0000 (20:10 +0900)
committerJengHyun Kang <jhyuni.kang@samsung.com>
Tue, 24 Oct 2017 07:04:33 +0000 (16:04 +0900)
Change-Id: I76f8df6b8fed1d01540c1430247ffc00dc28dfc5

src/evdev.c
src/evdev.h

index 36df04ba77fb2d64320f225c02c333b390ba3d08..d133e2fdf482badc6e87ae0c03254f99ce7d5693 100644 (file)
@@ -1984,10 +1984,10 @@ fallback_dispatch_init_slots(struct fallback_dispatch *dispatch,
        dispatch->mt.slot = active_slot;
 
        dispatch->mt.aux_data_list = calloc(num_slots, sizeof(struct list));
-       if (device->mt.aux_data_list) {
+       if (dispatch->mt.aux_data_list) {
                int i;
                for (i=0; i<num_slots; i++) {
-                       list_init(&device->mt.aux_data_list[i]);
+                       list_init(&dispatch->mt.aux_data_list[i]);
                }
        }
        else
@@ -3738,6 +3738,7 @@ evdev_device_destroy(struct evdev_device *device)
        libinput_seat_unref(device->base.seat);
        libevdev_free(device->evdev);
        udev_device_unref(device->udev_device);
+       evdev_device_free_aux_data(device);
        free(device);
 }
 
@@ -3830,3 +3831,22 @@ failed:
                }
        }
 }
+
+void
+evdev_device_free_aux_data(struct evdev_device *device)
+{
+       int i;
+       struct fallback_dispatch *dispatch;
+       struct mt_aux_data *aux_data, *aux_data_tmp;
+
+       dispatch = fallback_dispatch(device->dispatch);
+
+       for (i = 0; i < (int)dispatch->mt.slots_len; i++) {
+               list_for_each_safe(aux_data, aux_data_tmp, &dispatch->mt.aux_data_list[i], link) {
+                       list_remove(&aux_data->link);
+                       free(aux_data);
+               }
+               list_remove(&dispatch->mt.aux_data_list[i]);
+       }
+       free(dispatch->mt.aux_data_list);
+}
index e916e7b80edee4c8013ce474d921c970e5f08e5b..0c8a439d225fcb9e3b3aae8e4b0f516387065899 100644 (file)
@@ -907,4 +907,7 @@ evdev_device_has_aux_data(struct evdev_device *device, uint32_t code);
 
 void
 evdev_device_set_aux_data(struct evdev_device *device, uint32_t code);
+
+void
+evdev_device_free_aux_data(struct evdev_device *device);
 #endif /* EVDEV_H */