Merge "Check sp<>::clear() for data races" am: 59cd823752 am: 39ca279282
am: a6809b060e
Change-Id: Ibca4bcbdd438e2f90ba0fdc55a5950f0d046ff94
diff --git a/libutils/include/utils/StrongPointer.h b/libutils/include/utils/StrongPointer.h
index 360fce5..3abce17 100644
--- a/libutils/include/utils/StrongPointer.h
+++ b/libutils/include/utils/StrongPointer.h
@@ -228,8 +228,10 @@
template<typename T>
void sp<T>::clear() {
- if (m_ptr) {
- m_ptr->decStrong(this);
+ T* oldPtr(*const_cast<T* volatile*>(&m_ptr));
+ if (oldPtr) {
+ oldPtr->decStrong(this);
+ if (oldPtr != *const_cast<T* volatile*>(&m_ptr)) sp_report_race();
m_ptr = nullptr;
}
}