• Derek Foreman's avatar
    server: Add special case destroy signal emitter · 5e0f7ad1
    Derek Foreman authored
    In the past much code (weston, efl/enlightenment, mutter) has
    freed structures containing wl_listeners from destroy handlers
    without first removing the listener from the signal.  As the
    destroy notifier only fires once, this has largely gone
    unnoticed until recently.
    Other code does not (Qt, wlroots) - and removes itself from
    the signal before free.
    If somehow a destroy signal is listened to by code from both
    kinds of callers, those that free will corrupt the lists for
    those that don't, and Bad Things will happen.
    To avoid these bad things, remove every item from the signal list
    during destroy emit, and put it in a list all its own.  This way
    whether the listener is removed or not has no impact on the
    following emits.
    Signed-off-by: default avatarDerek Foreman <derekf@osg.samsung.com>
    Reviewed-by: Simon Ser's avatarSimon Ser <contact@emersion.fr>
    Reviewed-by: Ongy's avatarMarkus Ongyerth <wl@ongy.net>
wayland-server.c 57.4 KB