diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2020-02-20 11:38:28 +0100 |
|---|---|---|
| committer | Stefan Hajnoczi <stefanha@redhat.com> | 2020-02-22 08:26:47 +0000 |
| commit | 8c3570e33954d26675ec6fd224ede02763dfbd1d (patch) | |
| tree | 2ef7b13045dcc6a597bbbcb607d4a3ec30600282 /include/qemu/queue.h | |
| parent | f25c0b547916962d0b1be260b5b643287bea0851 (diff) | |
| download | focaccia-qemu-8c3570e33954d26675ec6fd224ede02763dfbd1d.tar.gz focaccia-qemu-8c3570e33954d26675ec6fd224ede02763dfbd1d.zip | |
rcu_queue: add QSLIST functions
QSLIST is the only family of lists for which we do not have RCU-friendly accessors, add them. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 20200220103828.24525-1-pbonzini@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'include/qemu/queue.h')
| -rw-r--r-- | include/qemu/queue.h | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/include/qemu/queue.h b/include/qemu/queue.h index 19425f973f..fcecb70228 100644 --- a/include/qemu/queue.h +++ b/include/qemu/queue.h @@ -211,9 +211,20 @@ struct { \ (head)->slh_first = (head)->slh_first->field.sle_next; \ } while (/*CONSTCOND*/0) -#define QSLIST_REMOVE_AFTER(slistelm, field) do { \ +#define QSLIST_REMOVE_AFTER(slistelm, field) do { \ (slistelm)->field.sle_next = \ - QSLIST_NEXT(QSLIST_NEXT((slistelm), field), field); \ + QSLIST_NEXT(QSLIST_NEXT((slistelm), field), field); \ +} while (/*CONSTCOND*/0) + +#define QSLIST_REMOVE(head, elm, type, field) do { \ + if ((head)->slh_first == (elm)) { \ + QSLIST_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->slh_first; \ + while (curelm->field.sle_next != (elm)) \ + curelm = curelm->field.sle_next; \ + curelm->field.sle_next = curelm->field.sle_next->field.sle_next; \ + } \ } while (/*CONSTCOND*/0) #define QSLIST_FOREACH(var, head, field) \ |