[cairo] [PATCH 2/3] cairo_snapshot: Use rwlock to replace mutex.

Zhigang Gong zhigang.gong at linux.intel.com
Fri May 25 02:13:48 PDT 2012


As we will use rwlock to fix the COW/replaying race condition,
we prefer to use one lock rather than two locks for one snapshot.

Signed-off-by: Zhigang Gong <zhigang.gong at linux.intel.com>
---
 src/cairo-surface-snapshot-inline.h  |    4 ++--
 src/cairo-surface-snapshot-private.h |    4 ++--
 src/cairo-surface-snapshot.c         |    8 ++++----
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/cairo-surface-snapshot-inline.h b/src/cairo-surface-snapshot-inline.h
index bf89c77..48b24a4 100644
--- a/src/cairo-surface-snapshot-inline.h
+++ b/src/cairo-surface-snapshot-inline.h
@@ -51,9 +51,9 @@ _cairo_surface_snapshot_get_target (cairo_surface_t *surface)
     cairo_surface_snapshot_t *snapshot = (cairo_surface_snapshot_t *) surface;
     cairo_surface_t *target;
 
-    CAIRO_MUTEX_LOCK (snapshot->mutex);
+    CAIRO_RWLOCK_WRLOCK (snapshot->rwlock);
     target = _cairo_surface_reference (snapshot->target);
-    CAIRO_MUTEX_UNLOCK (snapshot->mutex);
+    CAIRO_RWLOCK_UNLOCK (snapshot->rwlock);
 
     return target;
 }
diff --git a/src/cairo-surface-snapshot-private.h b/src/cairo-surface-snapshot-private.h
index 58bee7b..43988bc 100644
--- a/src/cairo-surface-snapshot-private.h
+++ b/src/cairo-surface-snapshot-private.h
@@ -36,14 +36,14 @@
 #ifndef CAIRO_SURFACE_SNAPSHOT_PRIVATE_H
 #define CAIRO_SURFACE_SNAPSHOT_PRIVATE_H
 
-#include "cairo-mutex-private.h"
+#include "cairo-rwlock-private.h"
 #include "cairo-surface-private.h"
 #include "cairo-surface-backend-private.h"
 
 struct _cairo_surface_snapshot {
     cairo_surface_t base;
 
-    cairo_mutex_t mutex;
+    cairo_rwlock_t rwlock;
     cairo_surface_t *target;
     cairo_surface_t *clone;
 };
diff --git a/src/cairo-surface-snapshot.c b/src/cairo-surface-snapshot.c
index 9471e47..30e58fd 100644
--- a/src/cairo-surface-snapshot.c
+++ b/src/cairo-surface-snapshot.c
@@ -58,7 +58,7 @@ _cairo_surface_snapshot_finish (void *abstract_surface)
 	cairo_surface_destroy (surface->clone);
     }
 
-    CAIRO_MUTEX_FINI (surface->mutex);
+    CAIRO_RWLOCK_FINI (surface->rwlock);
 
     return status;
 }
@@ -184,7 +184,7 @@ _cairo_surface_snapshot_copy_on_write (cairo_surface_t *surface)
      * been lost.
      */
 
-    CAIRO_MUTEX_LOCK (snapshot->mutex);
+    CAIRO_RWLOCK_WRLOCK (snapshot->rwlock);
 
     if (snapshot->target->backend->snapshot != NULL) {
 	clone = snapshot->target->backend->snapshot (snapshot->target);
@@ -212,7 +212,7 @@ done:
     snapshot->target = snapshot->clone = clone;
     snapshot->base.type = clone->type;
 unlock:
-    CAIRO_MUTEX_UNLOCK (snapshot->mutex);
+    CAIRO_RWLOCK_UNLOCK (snapshot->rwlock);
 }
 
 /**
@@ -269,7 +269,7 @@ _cairo_surface_snapshot (cairo_surface_t *surface)
 			 surface->content);
     snapshot->base.type = surface->type;
 
-    CAIRO_MUTEX_INIT (snapshot->mutex);
+    CAIRO_RWLOCK_INIT (snapshot->rwlock);
     snapshot->target = surface;
     snapshot->clone = NULL;
 
-- 
1.7.4.4



More information about the cairo mailing list