diff options
Diffstat (limited to 'mysys/lf_hash.cc')
-rw-r--r-- | mysys/lf_hash.cc | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/mysys/lf_hash.cc b/mysys/lf_hash.cc index bc3504bc0dd..c8f2e3f456f 100644 --- a/mysys/lf_hash.cc +++ b/mysys/lf_hash.cc @@ -103,8 +103,9 @@ retry: do { /* PTR() isn't necessary below, head is a dummy node */ cursor->curr= my_assume_aligned<sizeof(LF_SLIST *)>((LF_SLIST *)(*cursor->prev)); lf_pin(pins, 1, cursor->curr); - } while (my_atomic_loadptr((void **)my_assume_aligned<sizeof(LF_SLIST *)>(cursor->prev)) != cursor->curr && - LF_BACKOFF()); + } while (my_atomic_loadptr( + (void **)my_assume_aligned<sizeof(LF_SLIST *)>(cursor->prev)) + != cursor->curr && LF_BACKOFF()); for (;;) { if (unlikely(!cursor->curr)) @@ -114,14 +115,17 @@ retry: cur_keylen= cursor->curr->keylen; /* The key element needs to be aligned, not necessary what it points to */ my_assume_aligned<sizeof(const uchar *)>(&cursor->curr->key); - cur_key= cursor->curr->key; + cur_key= (const uchar *) my_atomic_loadptr_explicit((void **) &cursor->curr->key, + MY_MEMORY_ORDER_ACQUIRE); do { /* attempting to my_assume_aligned onlink below broke the implementation */ - link= cursor->curr->link; + link= (intptr) my_atomic_loadptr_explicit((void **) &cursor->curr->link, + MY_MEMORY_ORDER_RELAXED); cursor->next= my_assume_aligned<sizeof(LF_SLIST *)>(PTR(link)); lf_pin(pins, 0, cursor->next); - } while (link != cursor->curr->link && LF_BACKOFF()); + } while (link != (intptr) my_atomic_loadptr((void *volatile *) &cursor->curr->link) + && LF_BACKOFF()); if (!DELETED(link)) { |