summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeat Bolli <bbolli@ewanet.ch>2011-03-27 15:29:20 +0200
committerEric S. Raymond <esr@thyrsus.com>2011-03-27 11:13:52 -0400
commit8118ed642d8d2d046684d5ce596206698127dc4b (patch)
tree1ecbbb0312cce095f3904901b9f82f697b277c72
parenteb790f2bc68723811d1a6b0e4095c9fc1e0f75e5 (diff)
downloadgpsd-8118ed642d8d2d046684d5ce596206698127dc4b.tar.gz
Move the memory barrier instructions into the header file
This allows adding other compilers and/or architectures later as needed. Signed-off-by: Eric S. Raymond <esr@thyrsus.com>
-rw-r--r--gpsd.h-tail9
-rw-r--r--libgps_shm.c8
-rw-r--r--shmexport.c8
3 files changed, 13 insertions, 12 deletions
diff --git a/gpsd.h-tail b/gpsd.h-tail
index f0f01519..bd859e8f 100644
--- a/gpsd.h-tail
+++ b/gpsd.h-tail
@@ -758,6 +758,15 @@ void cfmakeraw(struct termios *);
#define DEVICEHOOKPATH SYSCONFDIR"/gpsd/device-hook"
+/* memory barriers */
+static inline void barrier(void) {
+#ifdef __GNUC__
+#ifndef S_SPLINT_S
+ asm volatile("sfence");
+#endif /* S_SPLINT_S */
+#endif /* __GNUC__ */
+}
+
#endif /* _GPSD_H_ */
// Local variables:
// mode: c
diff --git a/libgps_shm.c b/libgps_shm.c
index 56fe5e5a..8c90f524 100644
--- a/libgps_shm.c
+++ b/libgps_shm.c
@@ -66,15 +66,11 @@ int gps_shm_read(struct gps_data_t *gpsdata)
* get clobbered first and the data can be detected as bad.
*/
before = shared->bookend1;
-#ifndef S_SPLINT_S
- asm volatile("sfence");
-#endif /* S_SPLINT_S */
+ barrier();
(void)memcpy((void *)gpsdata,
(void *)&shared->gpsdata,
sizeof(struct gps_data_t));
-#ifndef S_SPLINT_S
- asm volatile("sfence");
-#endif /* S_SPLINT_S */
+ barrier();
after = shared->bookend2;
/*@i1@*/gpsdata->privdata = shared;
diff --git a/shmexport.c b/shmexport.c
index d9aad54c..4d615abf 100644
--- a/shmexport.c
+++ b/shmexport.c
@@ -77,15 +77,11 @@ void shm_update(struct gps_context_t *context, struct gps_data_t *gpsdata)
* get clobbered first and the data can be detected as bad.
*/
((struct shmexport_t *)context->shmexport)->bookend2 = tick;
-#ifndef S_SPLINT_S
- asm volatile("sfence");
-#endif /* S_SPLINT_S */
+ barrier();
memcpy((void *)(context->shmexport + offsetof(struct shmexport_t, gpsdata)),
(void *)gpsdata,
sizeof(struct gps_data_t));
-#ifndef S_SPLINT_S
- asm volatile("sfence");
-#endif /* S_SPLINT_S */
+ barrier();
((struct shmexport_t *)context->shmexport)->bookend1 = tick;
}
}