kernel: Fix ABA problem in try_acquire_read_spinlock()
This commit is contained in:
@@ -210,10 +210,7 @@ static inline bool
|
|||||||
try_acquire_read_spinlock_inline(rw_spinlock* lock)
|
try_acquire_read_spinlock_inline(rw_spinlock* lock)
|
||||||
{
|
{
|
||||||
uint32 previous = atomic_add(&lock->lock, 1);
|
uint32 previous = atomic_add(&lock->lock, 1);
|
||||||
if ((previous & (1u << 31)) == 0)
|
return (previous & (1u << 31)) == 0;
|
||||||
return true;
|
|
||||||
atomic_test_and_set(&lock->lock, 1u << 31, previous);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -617,11 +617,7 @@ try_acquire_read_spinlock(rw_spinlock* lock)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32 previous = atomic_add(&lock->lock, 1);
|
uint32 previous = atomic_add(&lock->lock, 1);
|
||||||
if ((previous & (1u << 31)) == 0)
|
return (previous & (1u << 31)) == 0;
|
||||||
return true;
|
|
||||||
|
|
||||||
atomic_test_and_set(&lock->lock, 1u << 31, previous);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user