/*
* Copyright (c) 2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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 META_API_LOCKING_H
#define META_API_LOCKING_H
#include
META_BEGIN_NAMESPACE()
/**
* @brief Helper class to acquire write lock and release it end of the scope.
*/
class InterfaceLock {
public:
META_NO_COPY(InterfaceLock)
explicit InterfaceLock(LockType type, const CORE_NS::IInterface* t) : type_(type), p_(interface_cast(t))
{
if (p_) {
if (type_ == LockType::UNIQUE_LOCK) {
p_->Lock();
} else if (type_ == LockType::SHARED_LOCK) {
p_->LockShared();
}
}
}
explicit InterfaceLock(LockType type, const CORE_NS::IInterface& t) : InterfaceLock(type, &t) {}
template
explicit InterfaceLock(LockType type, const BASE_NS::shared_ptr& t) : InterfaceLock(type, t.get())
{}
InterfaceLock(InterfaceLock&& l) noexcept : type_(l.type_), p_(l.p_)
{
l.p_ = nullptr;
}
InterfaceLock& operator=(InterfaceLock&& l) noexcept
{
type_ = l.type_;
p_ = l.p_;
l.p_ = nullptr;
return *this;
}
~InterfaceLock()
{
if (p_) {
if (type_ == LockType::UNIQUE_LOCK) {
p_->Unlock();
} else if (type_ == LockType::SHARED_LOCK) {
p_->UnlockShared();
}
}
}
explicit operator bool() const
{
return p_ != nullptr;
}
private:
LockType type_;
const ILockable* p_;
};
/**
* @brief Helper class to acquire write lock and release it end of the scope.
*/
class InterfaceUniqueLock {
public:
META_NO_COPY(InterfaceUniqueLock)
explicit InterfaceUniqueLock(const CORE_NS::IInterface* t) : p_(interface_cast(t))
{
if (p_) {
p_->Lock();
}
}
explicit InterfaceUniqueLock(const CORE_NS::IInterface& t) : InterfaceUniqueLock(&t) {}
template
explicit InterfaceUniqueLock(const BASE_NS::shared_ptr& t) : InterfaceUniqueLock(t.get())
{}
InterfaceUniqueLock(InterfaceUniqueLock&& l) noexcept : p_(l.p_)
{
l.p_ = nullptr;
}
InterfaceUniqueLock& operator=(InterfaceUniqueLock&& l) noexcept
{
p_ = l.p_;
l.p_ = nullptr;
return *this;
}
~InterfaceUniqueLock()
{
if (p_) {
p_->Unlock();
}
}
explicit operator bool() const
{
return p_ != nullptr;
}
private:
const ILockable* p_;
};
/**
* @brief Helper class to acquire read lock and release it end of the scope.
*/
class InterfaceSharedLock {
public:
META_NO_COPY(InterfaceSharedLock)
explicit InterfaceSharedLock(const CORE_NS::IInterface* t) : p_(interface_cast(t))
{
if (p_) {
p_->LockShared();
}
}
explicit InterfaceSharedLock(const CORE_NS::IInterface& t) : InterfaceSharedLock(&t) {}
template
explicit InterfaceSharedLock(const BASE_NS::shared_ptr& t) : InterfaceSharedLock(t.get())
{}
InterfaceSharedLock(InterfaceSharedLock&& l) noexcept : p_(l.p_)
{
l.p_ = nullptr;
}
InterfaceSharedLock& operator=(InterfaceSharedLock&& l) noexcept
{
p_ = l.p_;
l.p_ = nullptr;
return *this;
}
~InterfaceSharedLock()
{
if (p_) {
p_->UnlockShared();
}
}
explicit operator bool() const
{
return p_ != nullptr;
}
private:
const ILockable* p_;
};
META_END_NAMESPACE()
#endif