[PATCH 1/7] Change fence memory type from 'int32_t' to 'struct shmfence'

Keith Packard keithp at keithp.com
Wed Nov 20 11:55:55 PST 2013


This will allow other implementations to use alternate
representations, as well as providing additional typechecking.

Signed-off-by: Keith Packard <keithp at keithp.com>
---
 src/xshmfence.c    | 36 ++++++++++++++++++++----------------
 src/xshmfence.h    | 16 +++++++++-------
 src/xshmfenceint.h |  1 +
 3 files changed, 30 insertions(+), 23 deletions(-)

diff --git a/src/xshmfence.c b/src/xshmfence.c
index 521d3ad..83049de 100644
--- a/src/xshmfence.c
+++ b/src/xshmfence.c
@@ -22,6 +22,10 @@
 
 #include "xshmfenceint.h"
 
+struct xshmfence {
+    int32_t     v;
+};
+
 /**
  * xshmfence_trigger:
  * @f: An X fence
@@ -32,11 +36,11 @@
  * will be set as appropriate).
  **/
 int
-xshmfence_trigger(int32_t *f)
+xshmfence_trigger(struct xshmfence *f)
 {
-	if (__sync_val_compare_and_swap(f, 0, 1) == -1) {
-		atomic_store(f, 1);
-		if (futex_wake(f) < 0)
+	if (__sync_val_compare_and_swap(&f->v, 0, 1) == -1) {
+		atomic_store(&f->v, 1);
+		if (futex_wake(&f->v) < 0)
 			return -1;
 	}
 	return 0;
@@ -53,10 +57,10 @@ xshmfence_trigger(int32_t *f)
  * will be set as appropriate).
  **/
 int
-xshmfence_await(int32_t *f)
+xshmfence_await(struct xshmfence *f)
 {
-	while (__sync_val_compare_and_swap(f, 0, -1) != 1) {
-		if (futex_wait(f, -1)) {
+	while (__sync_val_compare_and_swap(&f->v, 0, -1) != 1) {
+		if (futex_wait(&f->v, -1)) {
 			if (errno != EWOULDBLOCK)
 				return -1;
 		}
@@ -71,9 +75,9 @@ xshmfence_await(int32_t *f)
  * Return value: 1 if @f is triggered, else returns 0.
  **/
 int
-xshmfence_query(int32_t *f)
+xshmfence_query(struct xshmfence *f)
 {
-	return atomic_fetch(f) == 1;
+	return atomic_fetch(&f->v) == 1;
 }
 
 /**
@@ -84,9 +88,9 @@ xshmfence_query(int32_t *f)
  * this function has no effect.
  **/
 void
-xshmfence_reset(int32_t *f)
+xshmfence_reset(struct xshmfence *f)
 {
-	__sync_bool_compare_and_swap(f, 1, 0);
+	__sync_bool_compare_and_swap(&f->v, 1, 0);
 }
 
 
@@ -120,11 +124,11 @@ xshmfence_alloc_shm(void)
  * Return value: the fence or NULL (in which case, errno will be set
  * as appropriate).
  **/
-int32_t *
+struct xshmfence *
 xshmfence_map_shm(int fd)
 {
-	void *addr;
-	addr = mmap (NULL, sizeof (int32_t) , PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+	struct xshmfence *addr;
+	addr = mmap (NULL, sizeof (struct xshmfence) , PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
 	if (addr == MAP_FAILED) {
 		close (fd);
 		return 0;
@@ -138,7 +142,7 @@ xshmfence_map_shm(int fd)
  * Unap a shared memory fence @f.
  **/
 void
-xshmfence_unmap_shm(int32_t *f)
+xshmfence_unmap_shm(struct xshmfence *f)
 {
-        munmap(f, sizeof (int32_t));
+        munmap(f, sizeof (struct xshmfence));
 }
diff --git a/src/xshmfence.h b/src/xshmfence.h
index f3cbad9..bbdbb53 100644
--- a/src/xshmfence.h
+++ b/src/xshmfence.h
@@ -23,27 +23,29 @@
 #ifndef _XSHMFENCE_H_
 #define _XSHMFENCE_H_
 
-#include <stdint.h>
+#define HAVE_STRUCT_XSHMFENCE   1
+
+struct xshmfence;
 
 int
-xshmfence_trigger(int32_t *f);
+xshmfence_trigger(struct xshmfence *f);
 
 int
-xshmfence_await(int32_t *f);
+xshmfence_await(struct xshmfence *f);
 
 int
-xshmfence_query(int32_t *f);
+xshmfence_query(struct xshmfence *f);
 
 void
-xshmfence_reset(int32_t *f);
+xshmfence_reset(struct xshmfence *f);
 
 int
 xshmfence_alloc_shm(void);
 
-int32_t *
+struct xshmfence *
 xshmfence_map_shm(int fd);
 
 void
-xshmfence_unmap_shm(int32_t *f);
+xshmfence_unmap_shm(struct xshmfence *f);
 
 #endif /* _XSHMFENCE_H_ */
diff --git a/src/xshmfenceint.h b/src/xshmfenceint.h
index 3f5c561..e7b8b2a 100644
--- a/src/xshmfenceint.h
+++ b/src/xshmfenceint.h
@@ -34,6 +34,7 @@
 #include <sys/mman.h>
 #include <errno.h>
 #include <values.h>
+#include "xshmfence.h"
 
 static inline long sys_futex(void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3)
 {
-- 
1.8.4.2



More information about the xorg-devel mailing list