1+ #ifndef ATOMIC_RWLOCK_INCLUDED
2+ #define ATOMIC_RWLOCK_INCLUDED
3+
14/* Copyright (C) 2006 MySQL AB
25
36 This program is free software; you can redistribute it and/or modify
1316 along with this program; if not, write to the Free Software
1417 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
1518
16- typedef struct {pthread_rwlock_t rw ;} my_atomic_rwlock_t ;
19+ typedef struct {pthread_mutex_t rw ;} my_atomic_rwlock_t ;
20+ #define MY_ATOMIC_MODE_RWLOCKS 1
1721
1822#ifdef MY_ATOMIC_MODE_DUMMY
1923/*
@@ -31,18 +35,27 @@ typedef struct {pthread_rwlock_t rw;} my_atomic_rwlock_t;
3135#define my_atomic_rwlock_wrunlock (name )
3236#define MY_ATOMIC_MODE "dummy (non-atomic)"
3337#else
34- #define my_atomic_rwlock_destroy (name ) pthread_rwlock_destroy(& (name)->rw)
35- #define my_atomic_rwlock_init (name ) pthread_rwlock_init(& (name)->rw, 0)
36- #define my_atomic_rwlock_rdlock (name ) pthread_rwlock_rdlock(& (name)->rw)
37- #define my_atomic_rwlock_wrlock (name ) pthread_rwlock_wrlock(& (name)->rw)
38- #define my_atomic_rwlock_rdunlock (name ) pthread_rwlock_unlock(& (name)->rw)
39- #define my_atomic_rwlock_wrunlock (name ) pthread_rwlock_unlock(& (name)->rw)
40- #define MY_ATOMIC_MODE "rwlocks"
38+ /*
39+ we're using read-write lock macros but map them to mutex locks, and they're
40+ faster. Still, having semantically rich API we can change the
41+ underlying implementation, if necessary.
42+ */
43+ #define my_atomic_rwlock_destroy (name ) pthread_mutex_destroy(& (name)->rw)
44+ #define my_atomic_rwlock_init (name ) pthread_mutex_init(& (name)->rw, 0)
45+ #define my_atomic_rwlock_rdlock (name ) pthread_mutex_lock(& (name)->rw)
46+ #define my_atomic_rwlock_wrlock (name ) pthread_mutex_lock(& (name)->rw)
47+ #define my_atomic_rwlock_rdunlock (name ) pthread_mutex_unlock(& (name)->rw)
48+ #define my_atomic_rwlock_wrunlock (name ) pthread_mutex_unlock(& (name)->rw)
49+ #define MY_ATOMIC_MODE "mutex"
50+ #ifndef MY_ATOMIC_MODE_RWLOCKS
51+ #define MY_ATOMIC_MODE_RWLOCKS 1
52+ #endif
4153#endif
4254
4355#define make_atomic_add_body (S ) int ## S sav; sav= *a; *a+= v; v=sav;
44- #define make_atomic_swap_body (S ) int ## S sav; sav= *a; *a= v; v=sav;
56+ #define make_atomic_fas_body (S ) int ## S sav; sav= *a; *a= v; v=sav;
4557#define make_atomic_cas_body (S ) if ((ret= (*a == *cmp))) *a= set; else *cmp=*a;
4658#define make_atomic_load_body (S ) ret= *a;
4759#define make_atomic_store_body (S ) *a= v;
4860
61+ #endif /* ATOMIC_RWLOCK_INCLUDED */
0 commit comments