mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
shut up signedness warnings in atomic ops in gcc
unittest/mysys/my_atomic-t.c: try both signed and unsigned arguments for atomic ops
This commit is contained in:
@@ -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)
|
|||||||
#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 @@
|
|||||||
#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)
|
|||||||
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 {
|
||||||
|
Reference in New Issue
Block a user