[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