Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
33195266
Commit
33195266
authored
Nov 22, 2006
by
unknown
Browse files
Options
Browse Files
Download
Plain Diff
Merge gbichot@bk-internal.mysql.com:/home/bk/mysql-maria
into gbichot3.local:/home/mysql_src/mysql-maria
parents
4124839e
354d4a7e
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
101 additions
and
43 deletions
+101
-43
include/my_atomic.h
include/my_atomic.h
+98
-41
unittest/mysys/my_atomic-t.c
unittest/mysys/my_atomic-t.c
+3
-2
No files found.
include/my_atomic.h
View file @
33195266
...
...
@@ -61,70 +61,115 @@
#endif
#ifndef make_atomic_add_body
#define make_atomic_add_body(S)
\
#define make_atomic_add_body(S)
\
int ## S tmp=*a; \
while (!my_atomic_cas ## S(a, &tmp, tmp+v)); \
v=tmp;
#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
#define make_atomic_add(S)
\
STATIC_INLINE int ## S my_atomic_add ## S(
\
int ## S volatile *a, int ## S v)
\
{
\
make_atomic_add_body(S);
\
return v;
\
#define make_atomic_add(S)
\
STATIC_INLINE int ## S my_atomic_add ## S(
\
Uv_ ## S U_a, U_ ## S U_v)
\
{
\
make_atomic_add_body(S);
\
return v;
\
}
#define make_atomic_fas(S)
\
STATIC_INLINE int ## S my_atomic_fas ## S(
\
int ## S volatile *a, int ## S v)
\
{
\
make_atomic_fas_body(S);
\
return v;
\
#define make_atomic_fas(S)
\
STATIC_INLINE int ## S my_atomic_fas ## S(
\
Uv_ ## S U_a, U_ ## S U_v)
\
{
\
make_atomic_fas_body(S);
\
return v;
\
}
#define make_atomic_cas(S)
\
STATIC_INLINE int my_atomic_cas ## S(
int ## S volatile *a,
\
int ## S *cmp, int ## S set)
\
{
\
int8 ret;
\
make_atomic_cas_body(S);
\
return ret;
\
#define make_atomic_cas(S)
\
STATIC_INLINE int my_atomic_cas ## S(
Uv_ ## S U_a,
\
Uv_ ## S U_cmp, U_ ## S U_set)
\
{
\
int8 ret;
\
make_atomic_cas_body(S);
\
return ret;
\
}
#define make_atomic_load(S)
\
STATIC_INLINE int ## S my_atomic_load ## S(
int ## S volatile *a)
\
{
\
int ## S ret;
\
make_atomic_load_body(S);
\
return ret;
\
#define make_atomic_load(S)
\
STATIC_INLINE int ## S my_atomic_load ## S(
Uv_ ## S U_a)
\
{
\
int ## S ret;
\
make_atomic_load_body(S);
\
return ret;
\
}
#define make_atomic_store(S)
\
STATIC_INLINE void my_atomic_store ## S(
\
int ## S volatile *a, int ## S v)
\
{
\
make_atomic_store_body(S);
\
#define make_atomic_store(S)
\
STATIC_INLINE void my_atomic_store ## S(
\
Uv_ ## S U_a, U_ ## S U_v)
\
{
\
make_atomic_store_body(S);
\
}
#else
/* no inline functions */
#define make_atomic_add(S)
\
extern int ## S my_atomic_add ## S(
int ## S volatile *a, int ## S v
);
#define make_atomic_add(S)
\
extern int ## S my_atomic_add ## S(
Uv_ ## S, U_ ## S
);
#define make_atomic_fas(S)
\
extern int ## S my_atomic_fas ## S(
int ## S volatile *a, int ## S v
);
#define make_atomic_fas(S)
\
extern int ## S my_atomic_fas ## S(
Uv_ ## S, U_ ## S
);
#define make_atomic_cas(S)
\
extern int my_atomic_cas ## S(
int ## S volatile *a, int ## S *cmp, int ## S set
);
#define make_atomic_cas(S)
\
extern int my_atomic_cas ## S(
Uv_ ## S, Uv_ ## S, U_ ## S
);
#define make_atomic_load(S)
\
extern int ## S my_atomic_load ## S(
int ## S volatile *a
);
#define make_atomic_load(S)
\
extern int ## S my_atomic_load ## S(
Uv_ ## S
);
#define make_atomic_store(S)
\
extern void my_atomic_store ## S(
int ## S volatile *a, int ## S v
);
#define make_atomic_store(S)
\
extern void my_atomic_store ## S(
Uv_ ## S, U_ ## S
);
#endif
...
...
@@ -157,6 +202,18 @@ make_atomic_fas(ptr)
#undef _atomic_h_cleanup_
#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_cas
#undef make_atomic_load
...
...
unittest/mysys/my_atomic-t.c
View file @
33195266
...
...
@@ -21,7 +21,8 @@
#include <my_atomic.h>
#include <lf.h>
volatile
uint32
a32
,
b32
,
c32
,
N
;
volatile
uint32
a32
,
b32
;
volatile
int32
c32
,
N
;
my_atomic_rwlock_t
rwl
;
LF_ALLOCATOR
lf_allocator
;
LF_HASH
lf_hash
;
...
...
@@ -98,7 +99,7 @@ pthread_handler_t test_atomic_cas_handler(void *arg)
x
=
(
x
*
m
+
0x87654321
)
&
INT_MAX32
;
do
{
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
);
}
while
(
!
ok
)
;
do
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment