]> git.saurik.com Git - wxWidgets.git/commitdiff
Make wxSharedPtr::Release() really MT-safe.
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 31 May 2013 23:20:58 +0000 (23:20 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 31 May 2013 23:20:58 +0000 (23:20 +0000)
Using wxAtomicDec() is not enough, its result also must be checked as it will
return 0 only in one of the threads if multiple threads call it in parallel,
while the old test for m_count==0 could pass for more than one thread,
resulting in deleting the same pointer more than once.

Closes #15227.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74065 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/sharedptr.h

index f64bc4e691d2a9ea55ea955e5711c925e0b03328..4eba8dbd679dfe587f1c789cfc59f376ed5930a4 100644 (file)
@@ -596,6 +596,7 @@ All:
 - Add wxSocketBase::GetSocket() (Laurent Poujoulat).
 - Add IEEE 754 single/double precision support to wxDataStream classes (net147).
 - Add wxVector<>::const_reverse_iterator (troelsk).
+- Fix thread-safety issue in wxSharedPtr<> (plorkyeran).
 - Add Nepali translation (Him Prasad Gautam).
 
 All (GUI):
index 279e29b3a3b328982a1755bf8965cc2abde7b48a..290c610adce601592b5ced87307ad880191590db 100644 (file)
@@ -115,8 +115,7 @@ private:
     {
         if (m_ref)
         {
-            wxAtomicDec( m_ref->m_count );
-            if (m_ref->m_count == 0)
+            if (!wxAtomicDec( m_ref->m_count ))
             {
                 delete m_ref->m_ptr;
                 delete m_ref;