Skip to content

Commit 48c453a

Browse files
atomic ops:
my_atomic_XX_t -> intXX, no implicit locking anymore simplified framework, support for requested cleanups
1 parent 694c1db commit 48c453a

10 files changed

Lines changed: 243 additions & 362 deletions

File tree

dbug/dbug.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1728,7 +1728,7 @@ static void DoPrefix(CODE_STATE *cs, uint _line_)
17281728
struct tm *tm_p;
17291729
if (gettimeofday(&tv, NULL) != -1)
17301730
{
1731-
if ((tm_p= localtime(&tv.tv_sec)))
1731+
if ((tm_p= localtime((const time_t *)&tv.tv_sec)))
17321732
{
17331733
(void) fprintf (cs->stack->out_file,
17341734
/* "%04d-%02d-%02d " */

include/atomic/nolock.h

Lines changed: 2 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -27,137 +27,9 @@
2727
#endif
2828
#endif
2929

30-
#ifdef make_atomic_add_body8
30+
#ifdef make_atomic_add_body
3131

32-
#ifdef HAVE_INLINE
33-
34-
#define make_atomic_add(S) \
35-
static inline uint ## S _my_atomic_add ## S( \
36-
my_atomic_ ## S ## _t *a, uint ## S v) \
37-
{ \
38-
make_atomic_add_body ## S; \
39-
return v; \
40-
}
41-
42-
#define make_atomic_swap(S) \
43-
static inline uint ## S _my_atomic_swap ## S( \
44-
my_atomic_ ## S ## _t *a, uint ## S v) \
45-
{ \
46-
make_atomic_swap_body ## S; \
47-
return v; \
48-
}
49-
50-
#define make_atomic_cas(S) \
51-
static inline uint _my_atomic_cas ## S(my_atomic_ ## S ## _t *a,\
52-
uint ## S *cmp, uint ## S set) \
53-
{ \
54-
uint8 ret; \
55-
make_atomic_cas_body ## S; \
56-
return ret; \
57-
}
58-
59-
#define make_atomic_load(S) \
60-
static inline uint ## S _my_atomic_load ## S( \
61-
my_atomic_ ## S ## _t *a) \
62-
{ \
63-
uint ## S ret; \
64-
make_atomic_load_body ## S; \
65-
return ret; \
66-
}
67-
68-
#define make_atomic_store(S) \
69-
static inline void _my_atomic_store ## S( \
70-
my_atomic_ ## S ## _t *a, uint ## S v) \
71-
{ \
72-
make_atomic_store_body ## S; \
73-
}
74-
75-
#else /* no inline functions */
76-
77-
#define make_atomic_add(S) \
78-
extern uint ## S _my_atomic_add ## S( \
79-
my_atomic_ ## S ## _t *a, uint ## S v);
80-
81-
#define make_atomic_swap(S) \
82-
extern uint ## S _my_atomic_swap ## S( \
83-
my_atomic_ ## S ## _t *a, uint ## S v);
84-
85-
#define make_atomic_cas(S) \
86-
extern uint _my_atomic_cas ## S(my_atomic_ ## S ## _t *a, \
87-
uint ## S *cmp, uint ## S set);
88-
89-
#define make_atomic_load(S) \
90-
extern uint ## S _my_atomic_load ## S( \
91-
my_atomic_ ## S ## _t *a);
92-
93-
#define make_atomic_store(S) \
94-
extern void _my_atomic_store ## S( \
95-
my_atomic_ ## S ## _t *a, uint ## S v);
96-
97-
#endif
98-
99-
make_atomic_add( 8)
100-
make_atomic_add(16)
101-
make_atomic_add(32)
102-
103-
make_atomic_cas( 8)
104-
make_atomic_cas(16)
105-
make_atomic_cas(32)
106-
107-
make_atomic_load( 8)
108-
make_atomic_load(16)
109-
make_atomic_load(32)
110-
111-
make_atomic_store( 8)
112-
make_atomic_store(16)
113-
make_atomic_store(32)
114-
115-
make_atomic_swap( 8)
116-
make_atomic_swap(16)
117-
make_atomic_swap(32)
118-
119-
#undef make_atomic_add_body8
120-
#undef make_atomic_cas_body8
121-
#undef make_atomic_load_body8
122-
#undef make_atomic_store_body8
123-
#undef make_atomic_swap_body8
124-
#undef make_atomic_add_body16
125-
#undef make_atomic_cas_body16
126-
#undef make_atomic_load_body16
127-
#undef make_atomic_store_body16
128-
#undef make_atomic_swap_body16
129-
#undef make_atomic_add_body32
130-
#undef make_atomic_cas_body32
131-
#undef make_atomic_load_body32
132-
#undef make_atomic_store_body32
133-
#undef make_atomic_swap_body32
134-
#undef make_atomic_add
135-
#undef make_atomic_cas
136-
#undef make_atomic_load
137-
#undef make_atomic_store
138-
#undef make_atomic_swap
139-
140-
#define my_atomic_add8(a,v,L) _my_atomic_add8(a,v)
141-
#define my_atomic_add16(a,v,L) _my_atomic_add16(a,v)
142-
#define my_atomic_add32(a,v,L) _my_atomic_add32(a,v)
143-
144-
#define my_atomic_cas8(a,c,v,L) _my_atomic_cas8(a,c,v)
145-
#define my_atomic_cas16(a,c,v,L) _my_atomic_cas16(a,c,v)
146-
#define my_atomic_cas32(a,c,v,L) _my_atomic_cas32(a,c,v)
147-
148-
#define my_atomic_load8(a,L) _my_atomic_load8(a)
149-
#define my_atomic_load16(a,L) _my_atomic_load16(a)
150-
#define my_atomic_load32(a,L) _my_atomic_load32(a)
151-
152-
#define my_atomic_store8(a,v,L) _my_atomic_store8(a,v)
153-
#define my_atomic_store16(a,v,L) _my_atomic_store16(a,v)
154-
#define my_atomic_store32(a,v,L) _my_atomic_store32(a,v)
155-
156-
#define my_atomic_swap8(a,v,L) _my_atomic_swap8(a,v)
157-
#define my_atomic_swap16(a,v,L) _my_atomic_swap16(a,v)
158-
#define my_atomic_swap32(a,v,L) _my_atomic_swap32(a,v)
159-
160-
#define my_atomic_rwlock_t typedef int
32+
typedef struct { } my_atomic_rwlock_t;
16133
#define my_atomic_rwlock_destroy(name)
16234
#define my_atomic_rwlock_init(name)
16335
#define my_atomic_rwlock_rdlock(name)

include/atomic/rwlock.h

Lines changed: 7 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,6 @@
1616

1717
typedef struct {pthread_rwlock_t rw;} my_atomic_rwlock_t;
1818

19-
#ifdef MY_ATOMIC_EXTRA_DEBUG
20-
#define CHECK_RW if (rw) if (a->rw) assert(rw == a->rw); else a->rw=rw;
21-
#else
22-
#define CHECK_RW
23-
#endif
24-
2519
#ifdef MY_ATOMIC_MODE_DUMMY
2620
/*
2721
the following can never be enabled by ./configure, one need to put #define in
@@ -36,126 +30,20 @@ typedef struct {pthread_rwlock_t rw;} my_atomic_rwlock_t;
3630
#define my_atomic_rwlock_wrlock(name)
3731
#define my_atomic_rwlock_rdunlock(name)
3832
#define my_atomic_rwlock_wrunlock(name)
33+
#define MY_ATOMIC_MODE "dummy (non-atomic)"
3934
#else
4035
#define my_atomic_rwlock_destroy(name) pthread_rwlock_destroy(& (name)->rw)
4136
#define my_atomic_rwlock_init(name) pthread_rwlock_init(& (name)->rw, 0)
4237
#define my_atomic_rwlock_rdlock(name) pthread_rwlock_rdlock(& (name)->rw)
4338
#define my_atomic_rwlock_wrlock(name) pthread_rwlock_wrlock(& (name)->rw)
4439
#define my_atomic_rwlock_rdunlock(name) pthread_rwlock_unlock(& (name)->rw)
4540
#define my_atomic_rwlock_wrunlock(name) pthread_rwlock_unlock(& (name)->rw)
41+
#define MY_ATOMIC_MODE "rwlocks"
4642
#endif
4743

48-
#ifdef HAVE_INLINE
49-
50-
#define make_atomic_add(S) \
51-
static inline uint ## S my_atomic_add ## S( \
52-
my_atomic_ ## S ## _t *a, uint ## S v, my_atomic_rwlock_t *rw) \
53-
{ \
54-
uint ## S ret; \
55-
CHECK_RW; \
56-
if (rw) my_atomic_rwlock_wrlock(rw); \
57-
ret= a->val; \
58-
a->val+= v; \
59-
if (rw) my_atomic_rwlock_wrunlock(rw); \
60-
return ret; \
61-
}
62-
63-
#define make_atomic_swap(S) \
64-
static inline uint ## S my_atomic_swap ## S( \
65-
my_atomic_ ## S ## _t *a, uint ## S v, my_atomic_rwlock_t *rw) \
66-
{ \
67-
uint ## S ret; \
68-
CHECK_RW; \
69-
if (rw) my_atomic_rwlock_wrlock(rw); \
70-
ret= a->val; \
71-
a->val= v; \
72-
if (rw) my_atomic_rwlock_wrunlock(rw); \
73-
return ret; \
74-
}
75-
76-
#define make_atomic_cas(S) \
77-
static inline uint my_atomic_cas ## S(my_atomic_ ## S ## _t *a, \
78-
uint ## S *cmp, uint ## S set, my_atomic_rwlock_t *rw) \
79-
{ \
80-
uint ret; \
81-
CHECK_RW; \
82-
if (rw) my_atomic_rwlock_wrlock(rw); \
83-
if (ret= (a->val == *cmp)) a->val= set; else *cmp=a->val; \
84-
if (rw) my_atomic_rwlock_wrunlock(rw); \
85-
return ret; \
86-
}
87-
88-
#define make_atomic_load(S) \
89-
static inline uint ## S my_atomic_load ## S( \
90-
my_atomic_ ## S ## _t *a, my_atomic_rwlock_t *rw) \
91-
{ \
92-
uint ## S ret; \
93-
CHECK_RW; \
94-
if (rw) my_atomic_rwlock_wrlock(rw); \
95-
ret= a->val; \
96-
if (rw) my_atomic_rwlock_wrunlock(rw); \
97-
return ret; \
98-
}
99-
100-
#define make_atomic_store(S) \
101-
static inline void my_atomic_store ## S( \
102-
my_atomic_ ## S ## _t *a, uint ## S v, my_atomic_rwlock_t *rw) \
103-
{ \
104-
CHECK_RW; \
105-
if (rw) my_atomic_rwlock_rdlock(rw); \
106-
(a)->val= (v); \
107-
if (rw) my_atomic_rwlock_rdunlock(rw); \
108-
}
109-
110-
#else /* no inline functions */
111-
112-
#define make_atomic_add(S) \
113-
extern uint ## S my_atomic_add ## S( \
114-
my_atomic_ ## S ## _t *a, uint ## S v, my_atomic_rwlock_t *rw);
115-
116-
#define make_atomic_swap(S) \
117-
extern uint ## S my_atomic_swap ## S( \
118-
my_atomic_ ## S ## _t *a, uint ## S v, my_atomic_rwlock_t *rw);
119-
120-
#define make_atomic_cas(S) \
121-
extern uint my_atomic_cas ## S(my_atomic_ ## S ## _t *a, \
122-
uint ## S *cmp, uint ## S set, my_atomic_rwlock_t *rw);
123-
124-
#define make_atomic_load(S) \
125-
extern uint ## S my_atomic_load ## S( \
126-
my_atomic_ ## S ## _t *a, my_atomic_rwlock_t *rw);
127-
128-
#define make_atomic_store(S) \
129-
extern void my_atomic_store ## S( \
130-
my_atomic_ ## S ## _t *a, uint ## S v, my_atomic_rwlock_t *rw);
131-
132-
#endif
133-
134-
make_atomic_add( 8)
135-
make_atomic_add(16)
136-
make_atomic_add(32)
137-
make_atomic_add(64)
138-
make_atomic_cas( 8)
139-
make_atomic_cas(16)
140-
make_atomic_cas(32)
141-
make_atomic_cas(64)
142-
make_atomic_load( 8)
143-
make_atomic_load(16)
144-
make_atomic_load(32)
145-
make_atomic_load(64)
146-
make_atomic_store( 8)
147-
make_atomic_store(16)
148-
make_atomic_store(32)
149-
make_atomic_store(64)
150-
make_atomic_swap( 8)
151-
make_atomic_swap(16)
152-
make_atomic_swap(32)
153-
make_atomic_swap(64)
154-
#undef make_atomic_add
155-
#undef make_atomic_cas
156-
#undef make_atomic_load
157-
#undef make_atomic_store
158-
#undef make_atomic_swap
159-
#undef CHECK_RW
160-
44+
#define make_atomic_add_body(S) int ## S sav; sav= *a; *a+= v; v=sav;
45+
#define make_atomic_swap_body(S) int ## S sav; sav= *a; *a= v; v=sav;
46+
#define make_atomic_cas_body(S) if ((ret= (*a == *cmp))) *a= set; else *cmp=*a;
47+
#define make_atomic_load_body(S) ret= *a;
48+
#define make_atomic_store_body(S) *a= v;
16149

include/atomic/x86-gcc.h

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,44 +16,38 @@
1616

1717
/*
1818
XXX 64-bit atomic operations can be implemented using
19-
cmpxchg8b, if necessary
19+
cmpxchg8b, if necessary. Though I've heard that not all 64-bit
20+
architectures support double-word (128-bit) cas.
2021
*/
2122

23+
#define MY_ATOMIC_MODE "gcc-x86" ## LOCK
24+
2225
/* fix -ansi errors while maintaining readability */
26+
#ifndef asm
2327
#define asm __asm__
28+
#endif
2429

25-
#define make_atomic_add_body8 \
26-
asm volatile (LOCK "xadd %0, %1;" : "+r" (v) , "+m" (a->val))
27-
#define make_atomic_swap_body8 \
28-
asm volatile ("xchg %0, %1;" : "+r" (v) , "+m" (a->val))
29-
#define make_atomic_cas_body8 \
30+
#define make_atomic_add_body(S) \
31+
asm volatile (LOCK "xadd %0, %1;" : "+r" (v) , "+m" (*a))
32+
#define make_atomic_swap_body(S) \
33+
asm volatile ("xchg %0, %1;" : "+r" (v) , "+m" (*a))
34+
#define make_atomic_cas_body(S) \
3035
asm volatile (LOCK "cmpxchg %3, %0; setz %2;" \
31-
: "+m" (a->val), "+a" (*cmp), "=q" (ret): "r" (set))
36+
: "+m" (*a), "+a" (*cmp), "=q" (ret): "r" (set))
3237

3338
#ifdef MY_ATOMIC_MODE_DUMMY
34-
#define make_atomic_load_body8 ret=a->val
35-
#define make_atomic_store_body8 a->val=v
39+
#define make_atomic_load_body(S) ret=*a
40+
#define make_atomic_store_body(S) *a=v
3641
#else
3742
/*
3843
Actually 32-bit reads/writes are always atomic on x86
3944
But we add LOCK here anyway to force memory barriers
4045
*/
41-
#define make_atomic_load_body8 \
46+
#define make_atomic_load_body(S) \
4247
ret=0; \
4348
asm volatile (LOCK "cmpxchg %2, %0" \
44-
: "+m" (a->val), "+a" (ret): "r" (ret))
45-
#define make_atomic_store_body8 \
46-
asm volatile ("xchg %0, %1;" : "+m" (a->val) : "r" (v))
49+
: "+m" (*a), "+a" (ret): "r" (ret))
50+
#define make_atomic_store_body(S) \
51+
asm volatile ("xchg %0, %1;" : "+m" (*a) : "r" (v))
4752
#endif
4853

49-
#define make_atomic_add_body16 make_atomic_add_body8
50-
#define make_atomic_add_body32 make_atomic_add_body8
51-
#define make_atomic_cas_body16 make_atomic_cas_body8
52-
#define make_atomic_cas_body32 make_atomic_cas_body8
53-
#define make_atomic_load_body16 make_atomic_load_body8
54-
#define make_atomic_load_body32 make_atomic_load_body8
55-
#define make_atomic_store_body16 make_atomic_store_body8
56-
#define make_atomic_store_body32 make_atomic_store_body8
57-
#define make_atomic_swap_body16 make_atomic_swap_body8
58-
#define make_atomic_swap_body32 make_atomic_swap_body8
59-

0 commit comments

Comments
 (0)