client: Refactor wl_proxy_destroy critical section

Split wl_proxy_destroy into two pieces, wl_proxy_destroy_unlocked which
performs the critical section code with no locking, and wl_proxy_destroy
which locks before calling that.

We'll use the new unlocked variant later in code that already holds the
lock.

There is a slight functional change - an aborting check is now called
with the lock held. This should be harmless as wl_abort() performs
no locking.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
This commit is contained in:
Derek Foreman 2021-07-21 16:03:12 -05:00 committed by Daniel Stone
parent 6ebe3cfed0
commit 942f1d8843

View file

@ -514,12 +514,26 @@ proxy_destroy(struct wl_proxy *proxy)
wl_proxy_unref(proxy);
}
static void
wl_proxy_destroy_caller_locks(struct wl_proxy *proxy)
{
if (proxy->flags & WL_PROXY_FLAG_WRAPPER)
wl_abort("Tried to destroy wrapper with wl_proxy_destroy()\n");
proxy_destroy(proxy);
}
/** Destroy a proxy object
*
* \param proxy The proxy to be destroyed
*
* \c proxy must not be a proxy wrapper.
*
* \note This function will abort in response to egregious
* errors, and will do so with the display lock held. This means
* SIGABRT handlers must not perform any actions that would
* attempt to take that lock, or a deadlock would occur.
*
* \memberof wl_proxy
*/
WL_EXPORT void
@ -527,11 +541,10 @@ wl_proxy_destroy(struct wl_proxy *proxy)
{
struct wl_display *display = proxy->display;
if (proxy->flags & WL_PROXY_FLAG_WRAPPER)
wl_abort("Tried to destroy wrapper with wl_proxy_destroy()\n");
pthread_mutex_lock(&display->mutex);
proxy_destroy(proxy);
wl_proxy_destroy_caller_locks(proxy);
pthread_mutex_unlock(&display->mutex);
}