QSLIST: add lock-free operations
These operations are trivial to implement and do not have ABA problems. They are enough to implement simple multiple-producer, single consumer lock-free lists or, as in the next patch, the multiple consumers can steal a whole batch of elements and process them at their leisure. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Message-id: 1417518350-6167-5-git-send-email-pbonzini@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									6d86ae0824
								
							
						
					
					
						commit
						c740ad92d0
					
				| 
						 | 
				
			
			@ -191,8 +191,19 @@ struct {                                                                \
 | 
			
		|||
} while (/*CONSTCOND*/0)
 | 
			
		||||
 | 
			
		||||
#define QSLIST_INSERT_HEAD(head, elm, field) do {                        \
 | 
			
		||||
        (elm)->field.sle_next = (head)->slh_first;                      \
 | 
			
		||||
        (head)->slh_first = (elm);                                      \
 | 
			
		||||
        (elm)->field.sle_next = (head)->slh_first;                       \
 | 
			
		||||
        (head)->slh_first = (elm);                                       \
 | 
			
		||||
} while (/*CONSTCOND*/0)
 | 
			
		||||
 | 
			
		||||
#define QSLIST_INSERT_HEAD_ATOMIC(head, elm, field) do {                   \
 | 
			
		||||
        do {                                                               \
 | 
			
		||||
            (elm)->field.sle_next = (head)->slh_first;                     \
 | 
			
		||||
        } while (atomic_cmpxchg(&(head)->slh_first, (elm)->field.sle_next, \
 | 
			
		||||
                               (elm)) != (elm)->field.sle_next);           \
 | 
			
		||||
} while (/*CONSTCOND*/0)
 | 
			
		||||
 | 
			
		||||
#define QSLIST_MOVE_ATOMIC(dest, src) do {                               \
 | 
			
		||||
        (dest)->slh_first = atomic_xchg(&(src)->slh_first, NULL);        \
 | 
			
		||||
} while (/*CONSTCOND*/0)
 | 
			
		||||
 | 
			
		||||
#define QSLIST_REMOVE_HEAD(head, field) do {                             \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue