Compare commits

...

1 Commits

Author SHA1 Message Date
Mark Andrews
026d1149d1 Read write_completions earlier
as it should be stable before cnt_and_flag is updated.
2021-06-15 16:28:30 +10:00

View File

@@ -564,6 +564,7 @@ isc_rwlock_downgrade(isc_rwlock_t *rwl) {
isc_result_t
isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
int32_t prev_cnt;
int_fast32_t write_completions;
REQUIRE(VALID_RWLOCK(rwl));
@@ -572,6 +573,8 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
#endif /* ifdef ISC_RWLOCK_TRACE */
if (type == isc_rwlocktype_read) {
write_completions =
atomic_load_acquire(&rwl->write_completions);
prev_cnt = atomic_fetch_sub_release(&rwl->cnt_and_flag,
READER_INCR);
/*
@@ -580,7 +583,7 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
* FIFO order.
*/
if (prev_cnt == READER_INCR &&
atomic_load_acquire(&rwl->write_completions) !=
write_completions !=
atomic_load_acquire(&rwl->write_requests))
{
LOCK(&rwl->lock);