diff mbox series

[1/7] qemu/queue: add some useful QLIST_ and QTAILQ_ macros

Message ID 20210129165030.640169-2-vsementsov@virtuozzo.com
State New
Headers show
Series qcow2: compressed write cache | expand

Commit Message

Vladimir Sementsov-Ogievskiy Jan. 29, 2021, 4:50 p.m. UTC
Add QLIST_FOREACH_FUNC_SAFE(), QTAILQ_FOREACH_FUNC_SAFE() and
QTAILQ_POP_HEAD(), to be used in following commit.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 include/qemu/queue.h | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

Comments

Markus Armbruster Feb. 1, 2021, 8:29 a.m. UTC | #1
Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> Add QLIST_FOREACH_FUNC_SAFE(), QTAILQ_FOREACH_FUNC_SAFE() and
> QTAILQ_POP_HEAD(), to be used in following commit.
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
>  include/qemu/queue.h | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
>
> diff --git a/include/qemu/queue.h b/include/qemu/queue.h
> index e029e7bf66..03e1fce85f 100644
> --- a/include/qemu/queue.h
> +++ b/include/qemu/queue.h
> @@ -173,6 +173,13 @@ struct {                                                                \
>                  (var) && ((next_var) = ((var)->field.le_next), 1);      \
>                  (var) = (next_var))
>  
> +#define QLIST_FOREACH_FUNC_SAFE(head, field, func) do {                 \
> +    typeof(*QLIST_FIRST(head)) *qffs_var, *qffs_next_var;               \
> +    QLIST_FOREACH_SAFE(qffs_var, (head), field, qffs_next_var) {        \
> +        (func)(qffs_var);                                               \
> +    }                                                                   \
> +} while (/*CONSTCOND*/0)
> +
>  /*
>   * List access methods.
>   */
> @@ -490,6 +497,13 @@ union {                                                                 \
>               (var) && ((prev_var) = QTAILQ_PREV(var, field), 1);        \
>               (var) = (prev_var))
>  
> +#define QTAILQ_FOREACH_FUNC_SAFE(head, field, func) do {                \
> +    typeof(*QTAILQ_FIRST(head)) *qffs_var, *qffs_next_var;              \
> +    QTAILQ_FOREACH_SAFE(qffs_var, (head), field, qffs_next_var) {       \
> +        (func)(qffs_var);                                               \
> +    }                                                                   \
> +} while (/*CONSTCOND*/0)
> +
>  /*
>   * Tail queue access methods.
>   */

I wonder whether these are worth having.  Can you show the difference
they make in the next patch?
Vladimir Sementsov-Ogievskiy Feb. 1, 2021, 8:34 a.m. UTC | #2
01.02.2021 11:29, Markus Armbruster wrote:
> Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:
> 
>> Add QLIST_FOREACH_FUNC_SAFE(), QTAILQ_FOREACH_FUNC_SAFE() and
>> QTAILQ_POP_HEAD(), to be used in following commit.
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> ---
>>   include/qemu/queue.h | 14 ++++++++++++++
>>   1 file changed, 14 insertions(+)
>>
>> diff --git a/include/qemu/queue.h b/include/qemu/queue.h
>> index e029e7bf66..03e1fce85f 100644
>> --- a/include/qemu/queue.h
>> +++ b/include/qemu/queue.h
>> @@ -173,6 +173,13 @@ struct {                                                                \
>>                   (var) && ((next_var) = ((var)->field.le_next), 1);      \
>>                   (var) = (next_var))
>>   
>> +#define QLIST_FOREACH_FUNC_SAFE(head, field, func) do {                 \
>> +    typeof(*QLIST_FIRST(head)) *qffs_var, *qffs_next_var;               \
>> +    QLIST_FOREACH_SAFE(qffs_var, (head), field, qffs_next_var) {        \
>> +        (func)(qffs_var);                                               \
>> +    }                                                                   \
>> +} while (/*CONSTCOND*/0)
>> +
>>   /*
>>    * List access methods.
>>    */
>> @@ -490,6 +497,13 @@ union {                                                                 \
>>                (var) && ((prev_var) = QTAILQ_PREV(var, field), 1);        \
>>                (var) = (prev_var))
>>   
>> +#define QTAILQ_FOREACH_FUNC_SAFE(head, field, func) do {                \
>> +    typeof(*QTAILQ_FIRST(head)) *qffs_var, *qffs_next_var;              \
>> +    QTAILQ_FOREACH_SAFE(qffs_var, (head), field, qffs_next_var) {       \
>> +        (func)(qffs_var);                                               \
>> +    }                                                                   \
>> +} while (/*CONSTCOND*/0)
>> +
>>   /*
>>    * Tail queue access methods.
>>    */
> 
> I wonder whether these are worth having.  Can you show the difference
> they make in the next patch?
> 

Not big difference, so I can easily drop them. But I think it's a good idea and can be reused.. Why don't you like it?
Max Reitz Feb. 10, 2021, 5:07 p.m. UTC | #3
On 29.01.21 17:50, Vladimir Sementsov-Ogievskiy wrote:
> Add QLIST_FOREACH_FUNC_SAFE(), QTAILQ_FOREACH_FUNC_SAFE() and
> QTAILQ_POP_HEAD(), to be used in following commit.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
>   include/qemu/queue.h | 14 ++++++++++++++
>   1 file changed, 14 insertions(+)
> 
> diff --git a/include/qemu/queue.h b/include/qemu/queue.h
> index e029e7bf66..03e1fce85f 100644
> --- a/include/qemu/queue.h
> +++ b/include/qemu/queue.h
> @@ -173,6 +173,13 @@ struct {                                                                \
>                   (var) && ((next_var) = ((var)->field.le_next), 1);      \
>                   (var) = (next_var))
>   
> +#define QLIST_FOREACH_FUNC_SAFE(head, field, func) do {                 \
> +    typeof(*QLIST_FIRST(head)) *qffs_var, *qffs_next_var;               \
> +    QLIST_FOREACH_SAFE(qffs_var, (head), field, qffs_next_var) {        \
> +        (func)(qffs_var);                                               \
> +    }                                                                   \
> +} while (/*CONSTCOND*/0)
> +

On one hand I have inexplicable reservations against adding these macros 
if they’re only used one time in the next patch.

On the other, I have one clearly expressible reservation, and that’s the 
fact that perhaps some future functions that could make use of this want 
to take more arguments, like closures.

Could we make these function vararg macros?  I.e., e.g.,

#define QLIST_FOREACH_FUNC_SAFE(head, field, func, ...) do {
     ...
         (func)(qffs_var, ## __VA_ARGS__);
     ...

Max

>   /*
>    * List access methods.
>    */
> @@ -490,6 +497,13 @@ union {                                                                 \
>                (var) && ((prev_var) = QTAILQ_PREV(var, field), 1);        \
>                (var) = (prev_var))
>   
> +#define QTAILQ_FOREACH_FUNC_SAFE(head, field, func) do {                \
> +    typeof(*QTAILQ_FIRST(head)) *qffs_var, *qffs_next_var;              \
> +    QTAILQ_FOREACH_SAFE(qffs_var, (head), field, qffs_next_var) {       \
> +        (func)(qffs_var);                                               \
> +    }                                                                   \
> +} while (/*CONSTCOND*/0)
> +
>   /*
>    * Tail queue access methods.
>    */
>
diff mbox series

Patch

diff --git a/include/qemu/queue.h b/include/qemu/queue.h
index e029e7bf66..03e1fce85f 100644
--- a/include/qemu/queue.h
+++ b/include/qemu/queue.h
@@ -173,6 +173,13 @@  struct {                                                                \
                 (var) && ((next_var) = ((var)->field.le_next), 1);      \
                 (var) = (next_var))
 
+#define QLIST_FOREACH_FUNC_SAFE(head, field, func) do {                 \
+    typeof(*QLIST_FIRST(head)) *qffs_var, *qffs_next_var;               \
+    QLIST_FOREACH_SAFE(qffs_var, (head), field, qffs_next_var) {        \
+        (func)(qffs_var);                                               \
+    }                                                                   \
+} while (/*CONSTCOND*/0)
+
 /*
  * List access methods.
  */
@@ -490,6 +497,13 @@  union {                                                                 \
              (var) && ((prev_var) = QTAILQ_PREV(var, field), 1);        \
              (var) = (prev_var))
 
+#define QTAILQ_FOREACH_FUNC_SAFE(head, field, func) do {                \
+    typeof(*QTAILQ_FIRST(head)) *qffs_var, *qffs_next_var;              \
+    QTAILQ_FOREACH_SAFE(qffs_var, (head), field, qffs_next_var) {       \
+        (func)(qffs_var);                                               \
+    }                                                                   \
+} while (/*CONSTCOND*/0)
+
 /*
  * Tail queue access methods.
  */