diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2009-11-07 19:21:49 +0100 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2009-11-07 19:21:49 +0100 |
commit | 7d6c42c89447947de20e4b50390b6c3b3ee8ff9f (patch) | |
tree | 8d98aa697fb03ed7d39472bc1222f691c7677f4f /lock_free_queue.c | |
parent | 67f57ab2fb7932b1c43ad669e846b425f6fa1f2b (diff) | |
download | lock_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.c | 14 |
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; |