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

[email protected]
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
From: Zhigang Gong <[email protected]>

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 <[email protected]>
---
 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

-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.