Skip to content

Commit bbfd18c

Browse files
kevgssvoj
authored andcommitted
fix unsynchronized read (#463)
* fix unsynchronized read * use relaxed atomic instead of seq_cst
1 parent b3027d4 commit bbfd18c

File tree

3 files changed

+6
-1
lines changed

3 files changed

+6
-1
lines changed

include/my_atomic.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,12 +235,14 @@ make_atomic_store(ptr)
235235
#if SIZEOF_LONG == 4
236236
#define my_atomic_addlong(A,B) my_atomic_add32((int32*) (A), (B))
237237
#define my_atomic_loadlong(A) my_atomic_load32((int32*) (A))
238+
#define my_atomic_loadlong_explicit(A,O) my_atomic_load32_explicit((int32*) (A), (O))
238239
#define my_atomic_storelong(A,B) my_atomic_store32((int32*) (A), (B))
239240
#define my_atomic_faslong(A,B) my_atomic_fas32((int32*) (A), (B))
240241
#define my_atomic_caslong(A,B,C) my_atomic_cas32((int32*) (A), (int32*) (B), (C))
241242
#else
242243
#define my_atomic_addlong(A,B) my_atomic_add64((int64*) (A), (B))
243244
#define my_atomic_loadlong(A) my_atomic_load64((int64*) (A))
245+
#define my_atomic_loadlong_explicit(A,O) my_atomic_load64_explicit((int64*) (A), (O))
244246
#define my_atomic_storelong(A,B) my_atomic_store64((int64*) (A), (B))
245247
#define my_atomic_faslong(A,B) my_atomic_fas64((int64*) (A), (B))
246248
#define my_atomic_caslong(A,B,C) my_atomic_cas64((int64*) (A), (int64*) (B), (C))

storage/innobase/include/sync0rw.ic

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ rw_lock_lock_word_decr(
213213
{
214214
lint local_lock_word;
215215

216-
local_lock_word = lock->lock_word;
216+
local_lock_word = my_atomic_loadlint_explicit(&lock->lock_word,
217+
MY_MEMORY_ORDER_RELAXED);
217218
while (local_lock_word > threshold) {
218219
if (my_atomic_caslint(&lock->lock_word,
219220
&local_lock_word,

storage/innobase/include/sync0types.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,11 +1163,13 @@ enum rw_lock_flag_t {
11631163
#ifdef _WIN64
11641164
#define my_atomic_addlint(A,B) my_atomic_add64((int64*) (A), (B))
11651165
#define my_atomic_loadlint(A) my_atomic_load64((int64*) (A))
1166+
#define my_atomic_loadlint_explicit(A,O) my_atomic_load64_explicit((int64*) (A), (O))
11661167
#define my_atomic_storelint(A,B) my_atomic_store64((int64*) (A), (B))
11671168
#define my_atomic_caslint(A,B,C) my_atomic_cas64((int64*) (A), (int64*) (B), (C))
11681169
#else
11691170
#define my_atomic_addlint my_atomic_addlong
11701171
#define my_atomic_loadlint my_atomic_loadlong
1172+
#define my_atomic_loadlint_explicit my_atomic_loadlong_explicit
11711173
#define my_atomic_storelint my_atomic_storelong
11721174
#define my_atomic_caslint my_atomic_caslong
11731175
#endif

0 commit comments

Comments
 (0)