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>
Fri, 27 Jan 2023 05:17:48 +0000 (14:17 +0900)
Change-Id: I76f8df6b8fed1d01540c1430247ffc00dc28dfc5

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

index 6fd9715..fafc38b 100644 (file)
@@ -1528,6 +1528,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;
+
+       dispatch = fallback_dispatch(evdev_dispatch);
+
+       for (i = 0; i < (int)dispatch->mt.slots_len; i++) {
+               list_for_each_safe(aux_data, &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
 };
@@ -1683,10 +1702,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 642b9a5..bd1fb4a 100644 (file)
@@ -3198,6 +3198,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);
 }
 
@@ -3265,7 +3266,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 97d8ffd..4457052 100644 (file)
@@ -357,6 +357,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 {
@@ -1078,4 +1079,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 */