summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cairo-xlib-source.c2
-rw-r--r--src/cairo-xlib-surface-shm.c20
2 files changed, 17 insertions, 5 deletions
diff --git a/src/cairo-xlib-source.c b/src/cairo-xlib-source.c
index 0cc32e8e..56dff657 100644
--- a/src/cairo-xlib-source.c
+++ b/src/cairo-xlib-source.c
@@ -87,10 +87,10 @@ _cairo_xlib_proxy_finish (void *abstract_surface)
{
cairo_xlib_proxy_t *proxy = abstract_surface;
+ _cairo_xlib_shm_surface_mark_active (proxy->owner);
XRenderFreePicture (proxy->source.dpy, proxy->source.picture);
if (proxy->source.pixmap)
XFreePixmap (proxy->source.dpy, proxy->source.pixmap);
- _cairo_xlib_shm_surface_mark_active (proxy->owner);
cairo_surface_destroy (proxy->owner);
return CAIRO_STATUS_SUCCESS;
}
diff --git a/src/cairo-xlib-surface-shm.c b/src/cairo-xlib-surface-shm.c
index 32c70330..8ac765e6 100644
--- a/src/cairo-xlib-surface-shm.c
+++ b/src/cairo-xlib-surface-shm.c
@@ -221,6 +221,18 @@ seqno_passed (unsigned long a, unsigned long b)
return (long)(b - a) >= 0;
}
+static inline cairo_bool_t
+seqno_before (unsigned long a, unsigned long b)
+{
+ return (long)(b - a) > 0;
+}
+
+static inline cairo_bool_t
+seqno_after (unsigned long a, unsigned long b)
+{
+ return (long)(a - b) > 0;
+}
+
static inline cairo_status_t
_pqueue_init (struct pqueue *pq)
{
@@ -424,7 +436,7 @@ static void send_event(cairo_xlib_display_t *display,
{
XShmCompletionEvent ev;
- if (seqno_passed (seqno, display->shm->last_event))
+ if (seqno_before (seqno, display->shm->last_event))
return;
ev.type = display->shm->event;
@@ -471,7 +483,7 @@ _cairo_xlib_shm_info_cleanup (cairo_xlib_display_t *display)
info = PQ_TOP(pq);
do {
- if (! seqno_passed (info->last_request, processed)) {
+ if (seqno_after (info->last_request, processed)) {
send_event (display, info, display->shm->last_request);
return;
}
@@ -544,7 +556,7 @@ _cairo_xlib_shm_pool_cleanup (cairo_xlib_display_t *display)
cairo_list_foreach_entry_safe (pool, next, cairo_xlib_shm_t,
&display->shm->pool, link) {
- if (! seqno_passed (pool->attached, processed))
+ if (seqno_before (pool->attached, processed))
break;
if (pool->mem.free_bytes == pool->mem.max_bytes)
@@ -720,7 +732,7 @@ _cairo_xlib_shm_surface_finish (void *abstract_surface)
if (active (shm, display->display)) {
shm->info->last_request = shm->active;
_pqueue_push (&display->shm->info, shm->info);
- if (! seqno_passed (display->shm->last_request, shm->active))
+ if (seqno_before (display->shm->last_request, shm->active))
display->shm->last_request = shm->active;
} else {
_cairo_mempool_free (&shm->info->pool->mem, shm->info->mem);