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)
committerDuna Oh <duna.oh@samsung.com>
Mon, 7 Feb 2022 16:06:26 +0000 (01:06 +0900)
Change-Id: I76f8df6b8fed1d01540c1430247ffc00dc28dfc5

src/evdev-fallback.c
src/evdev.c
src/evdev.h

index c9e682757d6e51cc2e163b41d361e9b4b3580418..a34bbad8533603b574a78051531283db6bd9b891 100644 (file)
@@ -1584,6 +1584,25 @@ failed:
        }
 }
 
+static void
+fallback_device_interface_free_aux_data(struct evdev_dispatch *evdev_dispatch)
+{
+       int i;
+       struct fallback_dispatch *dispatch;
+       struct mt_aux_data *aux_data, *aux_data_tmp;
+
+       dispatch = fallback_dispatch(evdev_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);
+}
+
 struct evdev_dispatch_device_interface fallback_device_interface = {
        .set_aux_data = fallback_device_interface_set_aux_data
 };
@@ -1739,10 +1758,10 @@ fallback_dispatch_init_slots(struct fallback_dispatch *dispatch,
                                                        ABS_MT_TOOL_TYPE);
 
        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
index 51041b22f721cb3f395d00ad2d66ca30b660bcc8..72bdb5c4ebba236318b00c39530714d976443903 100644 (file)
@@ -2988,6 +2988,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);
 }
 
@@ -3055,7 +3056,19 @@ evdev_device_set_aux_data(struct evdev_device *device, uint32_t code)
        if (!dispatch) return;
        if (!dispatch->device_interface) return;
 
-       if (dispatch->device_interface->set_auxdata) {
-               dispatch->device_interface->set_auxdata(dispatch, code);
+       if (dispatch->device_interface->set_aux_data) {
+               dispatch->device_interface->set_aux_data(dispatch, code);
+       }
+}
+
+void
+evdev_device_free_aux_data(struct evdev_device *device)
+{
+       struct evdev_dispatch *dispatch = device->dispatch;
+       if (!dispatch) return;
+       if (!dispatch->device_interface) return;
+
+       if (dispatch->device_interface->free_aux_data) {
+               dispatch->device_interface->free_aux_data(dispatch, code);
        }
 }
index 81b74f0d50c6f167507f1e0fa16dc73022daa64d..8eb07753cb2e0c7111b42a7141be2bd825f25c0d 100644 (file)
@@ -355,6 +355,7 @@ struct evdev_dispatch_interface {
 
 struct evdev_dispatch_device_interface {
        void (*set_aux_data) (struct evdev_dispatch *dispatch, uint32_t code);
+       void (*free_aux_data) (struct evdev_dispatch *dispatch);
 };
 
 enum evdev_dispatch_type {
@@ -1054,4 +1055,6 @@ 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 */