summaryrefslogtreecommitdiffstats
path: root/server/red_worker.h
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2011-04-22 13:31:48 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2011-05-03 14:44:11 +0200
commitf88dc6eecb56222688275893e2a891d8ec23d1d6 (patch)
treea43ef42e7d38f64bffb1585388b9bf93d7590073 /server/red_worker.h
parent1caee1f21691e954c96fa31ba7c9baf97d896784 (diff)
downloadspice-f88dc6eecb56222688275893e2a891d8ec23d1d6.tar.gz
spice-f88dc6eecb56222688275893e2a891d8ec23d1d6.tar.xz
spice-f88dc6eecb56222688275893e2a891d8ec23d1d6.zip
server: use gcc builtin for atomic get/set bit
Diffstat (limited to 'server/red_worker.h')
-rw-r--r--server/red_worker.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/server/red_worker.h b/server/red_worker.h
index ae2eaeec..b4e2ed2e 100644
--- a/server/red_worker.h
+++ b/server/red_worker.h
@@ -23,12 +23,14 @@
static inline void set_bit(int index, uint32_t *addr)
{
- __asm__ __volatile__ ("lock btsl %1, %0": : "m" (*addr), "r" (index));
+ uint32_t mask = 1 << index;
+ __sync_or_and_fetch(addr, mask);
}
static inline void clear_bit(int index, uint32_t *addr)
{
- __asm__ __volatile__ ("lock btrl %1, %0": : "m" (*addr), "r" (index));
+ uint32_t mask = ~(1 << index);
+ __sync_and_and_fetch(addr, mask);
}
static inline int test_bit(int index, uint32_t val)