diff options
author | Kevin Tang <zhikait@codeaurora.org> | 2017-05-17 18:14:20 -0700 |
---|---|---|
committer | Wyatt Riley <wyattriley@google.com> | 2017-05-19 14:43:27 -0700 |
commit | 60c72c0a4cec04c4a85255c6965d6493337b3c80 (patch) | |
tree | d872039b76feff39dc9c3d0398c81304cfc867ca | |
parent | fe54f03c362a39e88a5b4a77713b75be4becf965 (diff) | |
download | gps-oreo-dev.tar.gz |
make LocSharedLock::mRef ops atomicandroid-vts-8.0_r2android-vts-8.0_r1oreo-dev
The current share() and drop() calls are not thread
safe, which can cause memory heap correuption. This
changes the read / write ops to be atomic.
Bug: 37853905
Test: GPS incl. XTRA delete working on Pixel
Change-Id: Ic241d4573bdf2e58c4e264e97bd41b56f882c791
CRs-Fixed: 975372
-rw-r--r-- | msm8996/utils/LocSharedLock.h | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/msm8996/utils/LocSharedLock.h b/msm8996/utils/LocSharedLock.h index 6b9e27f..7fe6237 100644 --- a/msm8996/utils/LocSharedLock.h +++ b/msm8996/utils/LocSharedLock.h @@ -30,6 +30,7 @@ #define __LOC_SHARED_LOCK__ #include <stddef.h> +#include <cutils/atomic.h> #include <pthread.h> // This is a utility created for use cases such that there are more than @@ -39,16 +40,16 @@ // this share lock's share() method has to be called, so that the obj // can maintain an accurate client count. class LocSharedLock { - uint32_t mRef; + volatile int32_t mRef; pthread_mutex_t mMutex; inline ~LocSharedLock() { pthread_mutex_destroy(&mMutex); } public: // first client to create this LockSharedLock inline LocSharedLock() : mRef(1) { pthread_mutex_init(&mMutex, NULL); } // following client(s) are to *share()* this lock created by the first client - inline LocSharedLock* share() { mRef++; return this; } + inline LocSharedLock* share() { android_atomic_inc(&mRef); return this; } // whe a client no longer needs this shared lock, drop() shall be called. - inline void drop() { if (0 == --mRef) delete this; } + inline void drop() { if (1 == android_atomic_dec(&mRef)) delete this; } // locking the lock to enter critical section inline void lock() { pthread_mutex_lock(&mMutex); } // unlocking the lock to leave the critical section |