summaryrefslogtreecommitdiffstats
path: root/lock_free_queue.c
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2009-11-07 19:21:49 +0100
committerJérémy Zurcher <jeremy@asynk.ch>2009-11-07 19:21:49 +0100
commit7d6c42c89447947de20e4b50390b6c3b3ee8ff9f (patch)
tree8d98aa697fb03ed7d39472bc1222f691c7677f4f /lock_free_queue.c
parent67f57ab2fb7932b1c43ad669e846b425f6fa1f2b (diff)
downloadlock_free-7d6c42c89447947de20e4b50390b6c3b3ee8ff9f.zip
lock_free-7d6c42c89447947de20e4b50390b6c3b3ee8ff9f.tar.gz
cas and container tests
Diffstat (limited to 'lock_free_queue.c')
-rw-r--r--lock_free_queue.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/lock_free_queue.c b/lock_free_queue.c
index 217fb0b..e3e128f 100644
--- a/lock_free_queue.c
+++ b/lock_free_queue.c
@@ -6,12 +6,24 @@
*/
#include "stdlib.h"
-#include "cas.h"
#include "lock_free_queue.h"
#ifdef DEBUG
#include "stdio.h"
#endif
+/* CMPXCHG8B m64 Compare EDX:EAX with m64. If equal, set ZF and load ECX:EBX into m64. Else, clear ZF and load m64 into EDX:EAX. */
+static inline unsigned int compare_and_swap(volatile unsigned long long *mem,
+ volatile unsigned long long old,
+ volatile unsigned long long new) {
+ char result;
+ __asm__ __volatile__("lock; cmpxchg8b %0; setz %1;"
+ : "=m"(*mem), "=q"(result)
+ : "m"(*mem), "d" ((unsigned long)(old>>32)), "a" ((unsigned long)old),
+ "c" ((unsigned long)(new>>32)), "b" ((unsigned long)new)
+ : "memory");
+ return (int)result;
+}
+
void init( lfq_t *q ) {
node_t *node = (node_t*)malloc(sizeof(node_t));
node->next.split.ptr = NULL;