Commit 354d4a7e authored by unknown's avatar unknown

shut up signedness warnings in atomic ops in gcc


unittest/mysys/my_atomic-t.c:
  try both signed and unsigned arguments for atomic ops
parent 5c796096
...@@ -61,70 +61,115 @@ ...@@ -61,70 +61,115 @@
#endif #endif
#ifndef make_atomic_add_body #ifndef make_atomic_add_body
#define make_atomic_add_body(S) \ #define make_atomic_add_body(S) \
int ## S tmp=*a; \ int ## S tmp=*a; \
while (!my_atomic_cas ## S(a, &tmp, tmp+v)); \ while (!my_atomic_cas ## S(a, &tmp, tmp+v)); \
v=tmp; v=tmp;
#endif #endif
#ifdef __GNUC__
/*
we want to be able to use my_atomic_xxx functions with
both signed and unsigned integers. But gcc will issue a warning
"passing arg N of `my_atomic_XXX' as [un]signed due to prototype"
if the signedness of the argument doesn't match the prototype, or
"pointer targets in passing argument N of my_atomic_XXX differ in signedness"
if int* is used where uint* is expected (or vice versa).
Let's shut these warnings up
*/
#define make_transparent_unions(S) \
typedef union { \
int ## S i; \
uint ## S u; \
} U_ ## S __attribute__ ((transparent_union)); \
typedef union { \
int ## S volatile *i; \
uint ## S volatile *u; \
} Uv_ ## S __attribute__ ((transparent_union));
#define uintptr intptr
make_transparent_unions(8)
make_transparent_unions(16)
make_transparent_unions(32)
make_transparent_unions(ptr)
#undef uintptr
#undef make_transparent_unions
#define a U_a.i
#define cmp U_cmp.i
#define v U_v.i
#define set U_set.i
#else
#define U_8 int8
#define U_16 int16
#define U_32 int32
#define U_ptr intptr
#define Uv_8 int8
#define Uv_16 int16
#define Uv_32 int32
#define Uv_ptr intptr
#define U_a volatile *a
#define U_cmp *cmp
#define U_v v
#define U_set set
#endif /* __GCC__ transparent_union magic */
#ifdef HAVE_INLINE #ifdef HAVE_INLINE
#define make_atomic_add(S) \ #define make_atomic_add(S) \
STATIC_INLINE int ## S my_atomic_add ## S( \ STATIC_INLINE int ## S my_atomic_add ## S( \
int ## S volatile *a, int ## S v) \ Uv_ ## S U_a, U_ ## S U_v) \
{ \ { \
make_atomic_add_body(S); \ make_atomic_add_body(S); \
return v; \ return v; \
} }
#define make_atomic_fas(S) \ #define make_atomic_fas(S) \
STATIC_INLINE int ## S my_atomic_fas ## S( \ STATIC_INLINE int ## S my_atomic_fas ## S( \
int ## S volatile *a, int ## S v) \ Uv_ ## S U_a, U_ ## S U_v) \
{ \ { \
make_atomic_fas_body(S); \ make_atomic_fas_body(S); \
return v; \ return v; \
} }
#define make_atomic_cas(S) \ #define make_atomic_cas(S) \
STATIC_INLINE int my_atomic_cas ## S(int ## S volatile *a, \ STATIC_INLINE int my_atomic_cas ## S(Uv_ ## S U_a, \
int ## S *cmp, int ## S set) \ Uv_ ## S U_cmp, U_ ## S U_set) \
{ \ { \
int8 ret; \ int8 ret; \
make_atomic_cas_body(S); \ make_atomic_cas_body(S); \
return ret; \ return ret; \
} }
#define make_atomic_load(S) \ #define make_atomic_load(S) \
STATIC_INLINE int ## S my_atomic_load ## S(int ## S volatile *a) \ STATIC_INLINE int ## S my_atomic_load ## S(Uv_ ## S U_a) \
{ \ { \
int ## S ret; \ int ## S ret; \
make_atomic_load_body(S); \ make_atomic_load_body(S); \
return ret; \ return ret; \
} }
#define make_atomic_store(S) \ #define make_atomic_store(S) \
STATIC_INLINE void my_atomic_store ## S( \ STATIC_INLINE void my_atomic_store ## S( \
int ## S volatile *a, int ## S v) \ Uv_ ## S U_a, U_ ## S U_v) \
{ \ { \
make_atomic_store_body(S); \ make_atomic_store_body(S); \
} }
#else /* no inline functions */ #else /* no inline functions */
#define make_atomic_add(S) \ #define make_atomic_add(S) \
extern int ## S my_atomic_add ## S(int ## S volatile *a, int ## S v); extern int ## S my_atomic_add ## S(Uv_ ## S, U_ ## S);
#define make_atomic_fas(S) \ #define make_atomic_fas(S) \
extern int ## S my_atomic_fas ## S(int ## S volatile *a, int ## S v); extern int ## S my_atomic_fas ## S(Uv_ ## S, U_ ## S);
#define make_atomic_cas(S) \ #define make_atomic_cas(S) \
extern int my_atomic_cas ## S(int ## S volatile *a, int ## S *cmp, int ## S set); extern int my_atomic_cas ## S(Uv_ ## S, Uv_ ## S, U_ ## S);
#define make_atomic_load(S) \ #define make_atomic_load(S) \
extern int ## S my_atomic_load ## S(int ## S volatile *a); extern int ## S my_atomic_load ## S(Uv_ ## S);
#define make_atomic_store(S) \ #define make_atomic_store(S) \
extern void my_atomic_store ## S(int ## S volatile *a, int ## S v); extern void my_atomic_store ## S(Uv_ ## S, U_ ## S);
#endif #endif
...@@ -157,6 +202,18 @@ make_atomic_fas(ptr) ...@@ -157,6 +202,18 @@ make_atomic_fas(ptr)
#undef _atomic_h_cleanup_ #undef _atomic_h_cleanup_
#endif #endif
#undef U_8
#undef U_16
#undef U_32
#undef U_ptr
#undef a
#undef cmp
#undef v
#undef set
#undef U_a
#undef U_cmp
#undef U_v
#undef U_set
#undef make_atomic_add #undef make_atomic_add
#undef make_atomic_cas #undef make_atomic_cas
#undef make_atomic_load #undef make_atomic_load
......
...@@ -21,7 +21,8 @@ ...@@ -21,7 +21,8 @@
#include <my_atomic.h> #include <my_atomic.h>
#include <lf.h> #include <lf.h>
volatile uint32 a32,b32,c32, N; volatile uint32 a32,b32;
volatile int32 c32, N;
my_atomic_rwlock_t rwl; my_atomic_rwlock_t rwl;
LF_ALLOCATOR lf_allocator; LF_ALLOCATOR lf_allocator;
LF_HASH lf_hash; LF_HASH lf_hash;
...@@ -98,7 +99,7 @@ pthread_handler_t test_atomic_cas_handler(void *arg) ...@@ -98,7 +99,7 @@ pthread_handler_t test_atomic_cas_handler(void *arg)
x= (x*m+0x87654321) & INT_MAX32; x= (x*m+0x87654321) & INT_MAX32;
do { do {
my_atomic_rwlock_wrlock(&rwl); my_atomic_rwlock_wrlock(&rwl);
ok= my_atomic_cas32(&a32, &y, y+x); ok= my_atomic_cas32(&a32, &y, (uint32)y+x);
my_atomic_rwlock_wrunlock(&rwl); my_atomic_rwlock_wrunlock(&rwl);
} while (!ok) ; } while (!ok) ;
do { do {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment