Path: blob/master/thirdparty/metal-cpp/Foundation/NSLock.hpp
21066 views
//-------------------------------------------------------------------------------------------------------------------------------------------------------------1//2// Foundation/NSLock.hpp3//4// Copyright 2020-2024 Apple Inc.5//6// Licensed under the Apache License, Version 2.0 (the "License");7// you may not use this file except in compliance with the License.8// You may obtain a copy of the License at9//10// http://www.apache.org/licenses/LICENSE-2.011//12// Unless required by applicable law or agreed to in writing, software13// distributed under the License is distributed on an "AS IS" BASIS,14// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.15// See the License for the specific language governing permissions and16// limitations under the License.17//18//-------------------------------------------------------------------------------------------------------------------------------------------------------------192021#pragma once2223//-------------------------------------------------------------------------------------------------------------------------------------------------------------2425#include "NSDefines.hpp"26#include "NSObject.hpp"27#include "NSPrivate.hpp"28#include "NSTypes.hpp"29#include "NSDate.hpp"3031//-------------------------------------------------------------------------------------------------------------------------------------------------------------3233namespace NS34{3536template <class _Class, class _Base = class Object>37class Locking : public _Base38{39public:40void lock();41void unlock();42};4344class Condition : public Locking<Condition>45{46public:47static Condition* alloc();4849Condition* init();5051void wait();52bool waitUntilDate(Date* pLimit);53void signal();54void broadcast();55};5657} // NS5859//-------------------------------------------------------------------------------------------------------------------------------------------------------------6061template<class _Class, class _Base /* = NS::Object */>62_NS_INLINE void NS::Locking<_Class, _Base>::lock()63{64NS::Object::sendMessage<void>(this, _NS_PRIVATE_SEL(lock));65}6667//-------------------------------------------------------------------------------------------------------------------------------------------------------------6869template<class _Class, class _Base /* = NS::Object */>70_NS_INLINE void NS::Locking<_Class, _Base>::unlock()71{72NS::Object::sendMessage<void>(this, _NS_PRIVATE_SEL(unlock));73}7475//-------------------------------------------------------------------------------------------------------------------------------------------------------------7677_NS_INLINE NS::Condition* NS::Condition::alloc()78{79return NS::Object::alloc<NS::Condition>(_NS_PRIVATE_CLS(NSCondition));80}8182//-------------------------------------------------------------------------------------------------------------------------------------------------------------8384_NS_INLINE NS::Condition* NS::Condition::init()85{86return NS::Object::init<NS::Condition>();87}8889//-------------------------------------------------------------------------------------------------------------------------------------------------------------9091_NS_INLINE void NS::Condition::wait()92{93NS::Object::sendMessage<void>(this, _NS_PRIVATE_SEL(wait));94}9596//-------------------------------------------------------------------------------------------------------------------------------------------------------------9798_NS_INLINE bool NS::Condition::waitUntilDate(NS::Date* pLimit)99{100return NS::Object::sendMessage<bool>(this, _NS_PRIVATE_SEL(waitUntilDate_), pLimit);101}102103//-------------------------------------------------------------------------------------------------------------------------------------------------------------104105_NS_INLINE void NS::Condition::signal()106{107NS::Object::sendMessage<void>(this, _NS_PRIVATE_SEL(signal));108}109110//-------------------------------------------------------------------------------------------------------------------------------------------------------------111112_NS_INLINE void NS::Condition::broadcast()113{114NS::Object::sendMessage<void>(this, _NS_PRIVATE_SEL(broadcast));115}116117//-------------------------------------------------------------------------------------------------------------------------------------------------------------118119