From: Pekka Paalanen Date: Fri, 17 Apr 2015 11:00:24 +0000 (+0300) Subject: compositor: inert wl_surface objects do not exist X-Git-Tag: 1.7.91~17 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=08d3fb762527b15b33c3e63cc7ccea45fff9acfe;p=platform%2Fupstream%2Fweston.git compositor: inert wl_surface objects do not exist There is no valid case, where you would actually destroy a weston_surface, while leaving the wl_surface protocol object in existence. Therefore, inert wl_surface objects do not exist, except because of bugs. To catch such bugs, check that the resource is really NULL before actually destroying the weston_surface. We actually used to have this check, but it was removed by: commit 9dadfb53526bc97d62dc01c165e8b6f722f7ea5a Author: Kristian Høgsberg Date: Mon Jul 8 13:49:36 2013 -0400 compositor: Eliminate marshalling warning for leave events However, the invariant was put back in: commit 0d379744d34e616fea840272deda6b7027f79f55 Author: Giulio Camuffo Date: Fri Nov 15 22:06:15 2013 +0100 compositor: set weston_surface:resource to NULL when destroyed So apparently the issue fixed by 9dadfb53 was fixed another way later. Signed-off-by: Pekka Paalanen --- diff --git a/src/compositor.c b/src/compositor.c index e6a60bd..c94f00f 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1874,6 +1874,8 @@ weston_surface_destroy(struct weston_surface *surface) if (--surface->ref_count > 0) return; + assert(surface->resource == NULL); + wl_signal_emit(&surface->destroy_signal, &surface->resource); assert(wl_list_empty(&surface->subsurface_list_pending)); @@ -1903,6 +1905,8 @@ destroy_surface(struct wl_resource *resource) { struct weston_surface *surface = wl_resource_get_user_data(resource); + assert(surface); + /* Set the resource to NULL, since we don't want to leave a * dangling pointer if the surface was refcounted and survives * the weston_surface_destroy() call. */