summaryrefslogtreecommitdiffstats
path: root/lock_free_queue.c
diff options
context:
space:
mode:
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;