123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #ifndef __LOC_SHARED_LOCK__
- #define __LOC_SHARED_LOCK__
- #include <stddef.h>
- #ifndef FEATURE_EXTERNAL_AP
- #include <cutils/atomic.h>
- #endif
- #include <pthread.h>
- #ifdef FEATURE_EXTERNAL_AP
- #include <atomic>
- inline int32_t android_atomic_inc(volatile int32_t *addr)
- {
- volatile std::atomic_int_least32_t* a = (volatile std::atomic_int_least32_t*)addr;
- return std::atomic_fetch_add_explicit(a, 1, std::memory_order_release);
- }
- inline int32_t android_atomic_dec(volatile int32_t *addr)
- {
- volatile std::atomic_int_least32_t* a = (volatile std::atomic_int_least32_t*)addr;
- return std::atomic_fetch_sub_explicit(a, 1, std::memory_order_release);
- }
- #endif
- namespace loc_util {
- class LocSharedLock {
- volatile int32_t mRef;
- pthread_mutex_t mMutex;
- inline ~LocSharedLock() { pthread_mutex_destroy(&mMutex); }
- public:
-
- inline LocSharedLock() : mRef(1) { pthread_mutex_init(&mMutex, NULL); }
-
- inline LocSharedLock* share() { android_atomic_inc(&mRef); return this; }
-
- inline void drop() { if (1 == android_atomic_dec(&mRef)) delete this; }
-
- inline void lock() { pthread_mutex_lock(&mMutex); }
-
- inline void unlock() { pthread_mutex_unlock(&mMutex); }
- };
- }
- #endif
|