mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Fix RunQueue race condition on weak memory architectures (ARM64)
libeigen/eigen!2121
This commit is contained in:
committed by
Charles Schlosser
parent
c648296368
commit
afb4380534
@@ -57,7 +57,7 @@ class RunQueue {
|
|||||||
Elem* e = &array_[front & kMask];
|
Elem* e = &array_[front & kMask];
|
||||||
uint8_t s = e->state.load(std::memory_order_relaxed);
|
uint8_t s = e->state.load(std::memory_order_relaxed);
|
||||||
if (s != kEmpty || !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire)) return w;
|
if (s != kEmpty || !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire)) return w;
|
||||||
front_.store(front + 1 + (kSize << 1), std::memory_order_relaxed);
|
front_.store(front + 1 + (kSize << 1), std::memory_order_release);
|
||||||
e->w = std::move(w);
|
e->w = std::move(w);
|
||||||
e->state.store(kReady, std::memory_order_release);
|
e->state.store(kReady, std::memory_order_release);
|
||||||
return Work();
|
return Work();
|
||||||
@@ -73,7 +73,7 @@ class RunQueue {
|
|||||||
Work w = std::move(e->w);
|
Work w = std::move(e->w);
|
||||||
e->state.store(kEmpty, std::memory_order_release);
|
e->state.store(kEmpty, std::memory_order_release);
|
||||||
front = ((front - 1) & kMask2) | (front & ~kMask2);
|
front = ((front - 1) & kMask2) | (front & ~kMask2);
|
||||||
front_.store(front, std::memory_order_relaxed);
|
front_.store(front, std::memory_order_release);
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +86,7 @@ class RunQueue {
|
|||||||
uint8_t s = e->state.load(std::memory_order_relaxed);
|
uint8_t s = e->state.load(std::memory_order_relaxed);
|
||||||
if (s != kEmpty || !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire)) return w;
|
if (s != kEmpty || !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire)) return w;
|
||||||
back = ((back - 1) & kMask2) | (back & ~kMask2);
|
back = ((back - 1) & kMask2) | (back & ~kMask2);
|
||||||
back_.store(back, std::memory_order_relaxed);
|
back_.store(back, std::memory_order_release);
|
||||||
e->w = std::move(w);
|
e->w = std::move(w);
|
||||||
e->state.store(kReady, std::memory_order_release);
|
e->state.store(kReady, std::memory_order_release);
|
||||||
return Work();
|
return Work();
|
||||||
@@ -102,7 +102,7 @@ class RunQueue {
|
|||||||
if (s != kReady || !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire)) return Work();
|
if (s != kReady || !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire)) return Work();
|
||||||
Work w = std::move(e->w);
|
Work w = std::move(e->w);
|
||||||
e->state.store(kEmpty, std::memory_order_release);
|
e->state.store(kEmpty, std::memory_order_release);
|
||||||
back_.store(back + 1 + (kSize << 1), std::memory_order_relaxed);
|
back_.store(back + 1 + (kSize << 1), std::memory_order_release);
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ class RunQueue {
|
|||||||
e->state.store(kEmpty, std::memory_order_release);
|
e->state.store(kEmpty, std::memory_order_release);
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
if (n != 0) back_.store(start + 1 + (kSize << 1), std::memory_order_relaxed);
|
if (n != 0) back_.store(start + 1 + (kSize << 1), std::memory_order_release);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user