weston_buffer: Hold lifetime for resource/backend usage
Keep the weston_buffer alive for as long as at least one of the underlying wl_buffer or a backend usage exists. Signed-off-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
@@ -1203,7 +1203,6 @@ struct weston_buffer {
|
|||||||
|
|
||||||
struct weston_buffer_reference {
|
struct weston_buffer_reference {
|
||||||
struct weston_buffer *buffer;
|
struct weston_buffer *buffer;
|
||||||
struct wl_listener destroy_listener;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct weston_buffer_viewport {
|
struct weston_buffer_viewport {
|
||||||
|
|||||||
+20
-23
@@ -2385,6 +2385,12 @@ weston_buffer_destroy_handler(struct wl_listener *listener, void *data)
|
|||||||
struct weston_buffer *buffer =
|
struct weston_buffer *buffer =
|
||||||
container_of(listener, struct weston_buffer, destroy_listener);
|
container_of(listener, struct weston_buffer, destroy_listener);
|
||||||
|
|
||||||
|
buffer->resource = NULL;
|
||||||
|
buffer->shm_buffer = NULL;
|
||||||
|
|
||||||
|
if (buffer->busy_count > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
weston_signal_emit_mutable(&buffer->destroy_signal, buffer);
|
weston_signal_emit_mutable(&buffer->destroy_signal, buffer);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
}
|
}
|
||||||
@@ -2464,39 +2470,30 @@ fail:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
weston_buffer_reference_handle_destroy(struct wl_listener *listener,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
struct weston_buffer_reference *ref =
|
|
||||||
container_of(listener, struct weston_buffer_reference,
|
|
||||||
destroy_listener);
|
|
||||||
|
|
||||||
assert((struct weston_buffer *)data == ref->buffer);
|
|
||||||
ref->buffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
weston_buffer_reference(struct weston_buffer_reference *ref,
|
weston_buffer_reference(struct weston_buffer_reference *ref,
|
||||||
struct weston_buffer *buffer)
|
struct weston_buffer *buffer)
|
||||||
{
|
{
|
||||||
if (ref->buffer && buffer != ref->buffer) {
|
if (buffer == ref->buffer)
|
||||||
ref->buffer->busy_count--;
|
return;
|
||||||
if (ref->buffer->busy_count == 0) {
|
|
||||||
|
if (ref->buffer && --ref->buffer->busy_count == 0) {
|
||||||
|
if (ref->buffer->resource) {
|
||||||
assert(wl_resource_get_client(ref->buffer->resource));
|
assert(wl_resource_get_client(ref->buffer->resource));
|
||||||
wl_buffer_send_release(ref->buffer->resource);
|
wl_buffer_send_release(ref->buffer->resource);
|
||||||
|
} else {
|
||||||
|
weston_signal_emit_mutable(&ref->buffer->destroy_signal,
|
||||||
|
ref->buffer);
|
||||||
|
free(ref->buffer);
|
||||||
}
|
}
|
||||||
wl_list_remove(&ref->destroy_listener.link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buffer && buffer != ref->buffer) {
|
|
||||||
buffer->busy_count++;
|
|
||||||
wl_signal_add(&buffer->destroy_signal,
|
|
||||||
&ref->destroy_listener);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ref->buffer = buffer;
|
ref->buffer = buffer;
|
||||||
ref->destroy_listener.notify = weston_buffer_reference_handle_destroy;
|
|
||||||
|
if (!ref->buffer)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ref->buffer->busy_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
Reference in New Issue
Block a user