commit 3a416f3

Michael Forney  ·  2014-02-06 03:59:19 +0000 UTC
parent 48a50df
buffer: Add reference counting
5 files changed,  +26, -7
M wld.h
+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