commit 3a416f3
Michael Forney
·
2014-02-06 03:59:19 +0000 UTC
parent 48a50df
buffer: Add reference counting
5 files changed,
+26,
-7
M
buffer.c
+13,
-1
1@@ -34,6 +34,7 @@ void buffer_initialize(struct buffer * buffer,
2 buffer->base.format = format;
3 buffer->base.pitch = pitch;
4 buffer->base.map = NULL;
5+ buffer->references = 1;
6 buffer->map_references = 0;
7 buffer->exporters = NULL;
8 pixman_region32_init_rect(&buffer->base.damage, 0, 0, width, height);
9@@ -101,11 +102,22 @@ void wld_buffer_add_exporter(struct wld_buffer * base,
10 }
11
12 EXPORT
13-void wld_destroy_buffer(struct wld_buffer * base)
14+void wld_buffer_reference(struct wld_buffer * base)
15+{
16+ struct buffer * buffer = (void *) base;
17+
18+ ++buffer->references;
19+}
20+
21+EXPORT
22+void wld_buffer_unreference(struct wld_buffer * base)
23 {
24 struct buffer * buffer = (void *) base;
25 struct wld_exporter * exporter, * next;
26
27+ if (--buffer->references > 0)
28+ return;
29+
30 if (buffer->map_references > 0)
31 buffer->base.impl->unmap(buffer);
32
+2,
-2
1@@ -149,7 +149,7 @@ struct buffer * surface_back(struct wld_surface * base)
2 return buffer;
3
4 error1:
5- wld_destroy_buffer(&buffer->base);
6+ wld_buffer_unreference(&buffer->base);
7 error0:
8 return NULL;
9 }
10@@ -216,7 +216,7 @@ void surface_destroy(struct wld_surface * base)
11 surface->buffer_socket->impl->destroy(surface->buffer_socket);
12
13 for (index = 0; index < surface->entries_size; ++index)
14- wld_destroy_buffer(&surface->entries[index].buffer->base);
15+ wld_buffer_unreference(&surface->entries[index].buffer->base);
16
17 free(surface->entries);
18 free(surface);
+1,
-1
1@@ -228,7 +228,7 @@ struct buffer * context_create_buffer(struct wld_context * base,
2 error2:
3 wl_buffer_destroy(wl);
4 error1:
5- wld_destroy_buffer(&buffer->base);
6+ wld_buffer_unreference(&buffer->base);
7 error0:
8 return NULL;
9 }
+1,
-1
1@@ -125,7 +125,7 @@ struct buffer
2 {
3 struct wld_buffer base;
4
5- unsigned map_references;
6+ unsigned references, map_references;
7 struct wld_exporter * exporters;
8 };
9
M
wld.h
+9,
-2
1@@ -191,9 +191,16 @@ void wld_buffer_add_exporter(struct wld_buffer * buffer,
2 struct wld_exporter * exporter);
3
4 /**
5- * Destroy a buffer.
6+ * Increase the reference count of a buffer.
7 */
8-void wld_destroy_buffer(struct wld_buffer * buffer);
9+void wld_buffer_reference(struct wld_buffer * buffer);
10+
11+/**
12+ * Decrease the reference count of a buffer.
13+ *
14+ * When the reference count drops to zero, the buffer will be destroyed.
15+ */
16+void wld_buffer_unreference(struct wld_buffer * buffer);
17
18 /**** Surfaces ****/
19