Properly dispose event sources and event loops

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
dev
Jonas Ådahl 13 years ago committed by Kristian Høgsberg
parent b5ef591fac
commit c97af923d9
  1. 10
      src/compositor-drm.c
  2. 4
      src/compositor.c
  3. 24
      src/evdev.c
  4. 3
      src/tty.c

@ -1424,15 +1424,19 @@ drm_destroy(struct weston_compositor *ec)
struct drm_compositor *d = (struct drm_compositor *) ec; struct drm_compositor *d = (struct drm_compositor *) ec;
struct weston_input_device *input, *next; struct weston_input_device *input, *next;
wl_list_for_each_safe(input, next, &ec->input_device_list, link)
evdev_input_destroy(input);
wl_event_source_remove(d->udev_drm_source);
wl_event_source_remove(d->drm_source);
weston_compositor_shutdown(ec); weston_compositor_shutdown(ec);
gbm_device_destroy(d->gbm); gbm_device_destroy(d->gbm);
destroy_sprites(d); destroy_sprites(d);
drmDropMaster(d->drm.fd); drmDropMaster(d->drm.fd);
tty_destroy(d->tty); tty_destroy(d->tty);
wl_list_for_each_safe(input, next, &ec->input_device_list, link)
evdev_input_destroy(input);
free(d); free(d);
} }

@ -2415,6 +2415,8 @@ weston_compositor_shutdown(struct weston_compositor *ec)
struct weston_output *output, *next; struct weston_output *output, *next;
wl_event_source_remove(ec->idle_source); wl_event_source_remove(ec->idle_source);
if (ec->input_loop_source)
wl_event_source_remove(ec->input_loop_source);
if (ec->screenshooter) if (ec->screenshooter)
screenshooter_destroy(ec->screenshooter); screenshooter_destroy(ec->screenshooter);
@ -2427,6 +2429,8 @@ weston_compositor_shutdown(struct weston_compositor *ec)
wl_array_release(&ec->vertices); wl_array_release(&ec->vertices);
wl_array_release(&ec->indices); wl_array_release(&ec->indices);
wl_event_loop_destroy(ec->input_loop);
} }
static int on_term_signal(int signal_number, void *data) static int on_term_signal(int signal_number, void *data)

@ -35,6 +35,7 @@ struct evdev_input {
struct weston_input_device base; struct weston_input_device base;
struct wl_list devices_list; struct wl_list devices_list;
struct udev_monitor *udev_monitor; struct udev_monitor *udev_monitor;
struct wl_event_source *udev_monitor_source;
char *seat_id; char *seat_id;
}; };
@ -562,7 +563,7 @@ evdev_add_devices(struct udev *udev, struct weston_input_device *input_base)
struct udev_enumerate *e; struct udev_enumerate *e;
struct udev_list_entry *entry; struct udev_list_entry *entry;
struct udev_device *device; struct udev_device *device;
const char *path; const char *path, *sysname;
e = udev_enumerate_new(udev); e = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(e, "input"); udev_enumerate_add_match_subsystem(e, "input");
@ -571,8 +572,11 @@ evdev_add_devices(struct udev *udev, struct weston_input_device *input_base)
path = udev_list_entry_get_name(entry); path = udev_list_entry_get_name(entry);
device = udev_device_new_from_syspath(udev, path); device = udev_device_new_from_syspath(udev, path);
if (strncmp("event", udev_device_get_sysname(device), 5) != 0) sysname = udev_device_get_sysname(device);
if (strncmp("event", sysname, 5) != 0) {
udev_device_unref(device);
continue; continue;
}
device_added(device, input); device_added(device, input);
@ -632,6 +636,7 @@ evdev_config_udev_monitor(struct udev *udev, struct evdev_input *master)
{ {
struct wl_event_loop *loop; struct wl_event_loop *loop;
struct weston_compositor *c = master->base.compositor; struct weston_compositor *c = master->base.compositor;
int fd;
master->udev_monitor = udev_monitor_new_from_netlink(udev, "udev"); master->udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
if (!master->udev_monitor) { if (!master->udev_monitor) {
@ -644,12 +649,19 @@ evdev_config_udev_monitor(struct udev *udev, struct evdev_input *master)
if (udev_monitor_enable_receiving(master->udev_monitor)) { if (udev_monitor_enable_receiving(master->udev_monitor)) {
fprintf(stderr, "udev: failed to bind the udev monitor\n"); fprintf(stderr, "udev: failed to bind the udev monitor\n");
udev_monitor_unref(master->udev_monitor);
return 0; return 0;
} }
loop = wl_display_get_event_loop(c->wl_display); loop = wl_display_get_event_loop(c->wl_display);
wl_event_loop_add_fd(loop, udev_monitor_get_fd(master->udev_monitor), fd = udev_monitor_get_fd(master->udev_monitor);
WL_EVENT_READABLE, evdev_udev_handler, master); master->udev_monitor_source =
wl_event_loop_add_fd(loop, fd, WL_EVENT_READABLE,
evdev_udev_handler, master);
if (!master->udev_monitor_source) {
udev_monitor_unref(master->udev_monitor);
return 0;
}
return 1; return 1;
} }
@ -696,6 +708,10 @@ evdev_input_destroy(struct weston_input_device *input_base)
struct evdev_input *input = (struct evdev_input *) input_base; struct evdev_input *input = (struct evdev_input *) input_base;
evdev_remove_devices(input_base); evdev_remove_devices(input_base);
udev_monitor_unref(input->udev_monitor);
wl_event_source_remove(input->udev_monitor_source);
wl_list_remove(&input->base.link); wl_list_remove(&input->base.link);
free(input->seat_id); free(input->seat_id);
free(input); free(input);

@ -221,6 +221,9 @@ tty_destroy(struct tty *tty)
ioctl(tty->fd, VT_WAITACTIVE, tty->starting_vt); ioctl(tty->fd, VT_WAITACTIVE, tty->starting_vt);
} }
wl_event_source_remove(tty->input_source);
wl_event_source_remove(tty->vt_source);
close(tty->fd); close(tty->fd);
free(tty); free(tty);

Loading…
Cancel
Save