summaryrefslogtreecommitdiff
path: root/src/cairo-xlib-surface-shm.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-08-17 23:17:43 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-08-17 23:20:01 +0100
commit4af7a1c8637f3008a2265e063ab990eec07e02dd (patch)
tree909e8ef9713c82f07a2afa6dc482f21782ab69ca /src/cairo-xlib-surface-shm.c
parent1a87c526bfb7c35f5f207ca4aca7cf50a3b96765 (diff)
downloadcairo-4af7a1c8637f3008a2265e063ab990eec07e02dd.tar.gz
xlib/shm: Propagate the last-request to the synchronous create
If we optimise away the pending frees we must be careful to propagate the implied sync. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-xlib-surface-shm.c')
-rw-r--r--src/cairo-xlib-surface-shm.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/cairo-xlib-surface-shm.c b/src/cairo-xlib-surface-shm.c
index 5c23c9b7f..7d9a3e1b3 100644
--- a/src/cairo-xlib-surface-shm.c
+++ b/src/cairo-xlib-surface-shm.c
@@ -328,7 +328,8 @@ _cairo_xlib_shm_info_cleanup (cairo_xlib_display_t *display)
}
static cairo_xlib_shm_info_t *
-_cairo_xlib_shm_info_find (cairo_xlib_display_t *display, size_t size)
+_cairo_xlib_shm_info_find (cairo_xlib_display_t *display,
+ size_t size, unsigned long *last_request)
{
cairo_xlib_shm_info_t *info;
struct pqueue *pq = &display->shm->info;
@@ -343,6 +344,7 @@ _cairo_xlib_shm_info_find (cairo_xlib_display_t *display, size_t size)
if (info->size >= size && size <= 2*info->size)
return info;
+ *last_request = info->last_request;
_cairo_mempool_free (&info->pool->mem, info->mem);
free (info);
} while ((info = PQ_TOP(pq)));
@@ -456,10 +458,11 @@ _cairo_xlib_shm_info_create (cairo_xlib_display_t *display,
{
cairo_xlib_shm_info_t *info;
cairo_xlib_shm_t *pool;
+ unsigned long last_request = 0;
void *mem = NULL;
if (will_sync) {
- info = _cairo_xlib_shm_info_find (display, size);
+ info = _cairo_xlib_shm_info_find (display, size, &last_request);
if (info)
return info;
}
@@ -483,7 +486,7 @@ _cairo_xlib_shm_info_create (cairo_xlib_display_t *display,
info->pool = pool;
info->mem = mem;
info->size = size;
- info->last_request = 0;
+ info->last_request = last_request;
return info;
}