Daniele,

Thanks for spotting these. GCC error message may be cryptic, but using an 
atomic variable as the return value is an error regardless.

Acked-by: Jarno Rajahalme <jrajaha...@nicira.com>

Pushed to master,

  Jarno

On Aug 6, 2014, at 10:35 AM, Daniele Di Proietto <ddiproie...@vmware.com> wrote:

> There's no reason for the local variable 'old_count' to be atomic. In fact, if
> it is atomic it triggers a GCC4.9 warning (Wunused-value)
> The global variables 'a' and 'paux' could be static, according to sparse.
> 
> Signed-off-by: Daniele Di Proietto <ddiproie...@vmware.com>
> ---
> There's something interesting about the warning: GCC does not complain about
> 'old_count' being atomic, but about "right-hand operand of comma expression
> having no effect" (the comma comes from OVS macro atomic_add_explicit()).
> 
> I've isolated a test case to trigger the warning:
> 
> /* main.c */
> #include <stdatomic.h>
> #include <stdint.h>
> 
> int main()
> {
>    _Atomic(uint32_t) a = 0;
> #ifdef TEST_ATOMIC_DST
>    _Atomic(uint32_t) b = 0;
> #else
>    uint32_t b = 0;
> #endif
>    b = atomic_fetch_add_explicit ((&a), (1), (memory_order_seq_cst)),
>        (void) 0;
> 
>    return b;
> }
> 
> When compiled with
> 
>    gcc main.c -Wall
> 
> there's no warning. When compiled with 
> 
>    gcc main.c -Wall -DTEST_ATOMIC_DST
> 
> GCC complains with
> 
> main.c: In function ‘main’:
> main.c:13:70: warning: right-hand operand of comma expression has no effect
> [-Wunused-value]
>     b = atomic_fetch_add_explicit ((&a), (1), (memory_order_seq_cst)),
>                                                                      ^
> I'm using gcc (Debian 4.9.1-1) 4.9.1
> ---
> tests/test-atomic.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/tests/test-atomic.c b/tests/test-atomic.c
> index ca293ba..31c06fa 100644
> --- a/tests/test-atomic.c
> +++ b/tests/test-atomic.c
> @@ -167,7 +167,7 @@ test_atomic_flag(void)
>     ovs_assert(atomic_flag_test_and_set(&flag) == false);
> }
> 
> -uint32_t a;
> +static uint32_t a;
> 
> struct atomic_aux {
>     atomic_uint32_t count;
> @@ -175,7 +175,7 @@ struct atomic_aux {
>     ATOMIC(uint32_t *) data;
> };
> 
> -ATOMIC(struct atomic_aux *) paux = ATOMIC_VAR_INIT(NULL);
> +static ATOMIC(struct atomic_aux *) paux = ATOMIC_VAR_INIT(NULL);
> static struct atomic_aux *auxes = NULL;
> 
> #define ATOMIC_ITEM_COUNT 1000000
> @@ -273,7 +273,7 @@ static void *
> atomic_writer(void *aux_)
> {
>     struct atomic_aux *aux = aux_;
> -    atomic_uint32_t old_count;
> +    uint32_t old_count;
>     uint32_t *data;
>     size_t i;
> 
> -- 
> 2.0.1
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to