Add missing storeload memory fences
There is no synchronize with relationship between the monitor micro- lock and the onDeck microlock, so it is possible for an onDeck.load to move above a contendersList.store, or a contendersList.load to move above an ondeck.store. To fix this issue a full memory fence (mm_mfence on x86) is needed after the last store in the contendersList and onDeck critical regions. Change-Id: I5beb7dfe0d21010c5bf00cd65d59b9c7af58e919
This commit is contained in:
zatwierdzone przez
Saleel Kudchadker
rodzic
e11ef5ecd4
commit
f10435a1ef
@@ -205,6 +205,10 @@ void Monitor::finishUnlock() {
|
||||
return;
|
||||
}
|
||||
|
||||
// A StoreLoad barrier is required to make sure the onDeck_ store is published before
|
||||
// the contendersList_ micro-lock check.
|
||||
std::atomic_thread_fence(std::memory_order_seq_cst);
|
||||
|
||||
// We do not have an on-deck thread (semaphore == NULL). Return if
|
||||
// the contention list is empty or if the lock got acquired again.
|
||||
head = contendersList_;
|
||||
|
||||
Reference in New Issue
Block a user