/* * Tencent is pleased to support the open source community by making * MMKV available. * * Copyright (C) 2018 THL A29 Limited, a Tencent company. * All rights reserved. * * Licensed under the BSD 3-Clause License (the "License"); you may not use * this file except in compliance with the License. You may obtain a copy of * the License at * * https://opensource.org/licenses/BSD-3-Clause * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MMKV_SCOPEDLOCK_HPP #define MMKV_SCOPEDLOCK_HPP #ifdef __cplusplus namespace mmkv { template class ScopedLock { T *m_lock; void lock() { if (m_lock) { m_lock->lock(); } } void unlock() { if (m_lock) { m_lock->unlock(); } } public: explicit ScopedLock(T *oLock) : m_lock(oLock) { MMKV_ASSERT(m_lock); lock(); } ~ScopedLock() { unlock(); m_lock = nullptr; } // just forbid it for possibly misuse explicit ScopedLock(const ScopedLock &other) = delete; ScopedLock &operator=(const ScopedLock &other) = delete; }; } // namespace mmkv #include #define SCOPED_LOCK(lock) _SCOPEDLOCK(lock, __COUNTER__) #define _SCOPEDLOCK(lock, counter) __SCOPEDLOCK(lock, counter) #define __SCOPEDLOCK(lock, counter) \ mmkv::ScopedLock::type> __scopedLock##counter(lock) #endif #endif //MMKV_SCOPEDLOCK_HPP