13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef _DEMUTEX_HPP
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define _DEMUTEX_HPP
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements C++ Base Library
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -----------------------------
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief deMutex C++ wrapper.
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deDefs.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMutex.h"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace de
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Mutual exclusion lock
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Mutex class provides standard mutual exclusion lock functionality.
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Mutex
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					Mutex			(deUint32 flags = 0);
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					~Mutex			(void);
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void			lock			(void) throw();
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void			unlock			(void) throw();
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool			tryLock			(void) throw();
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					Mutex			(const Mutex& other); // Not allowed!
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Mutex&			operator=		(const Mutex& other); // Not allowed!
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deMutex			m_mutex;
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Scoped mutex lock.
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ScopedLock provides helper for maintaining Mutex lock for the duration
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * of current scope. The lock is acquired in constructor and released
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * when ScopedLock goes out of scope.
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ScopedLock
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					ScopedLock		(Mutex& mutex);
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					~ScopedLock		(void) { m_mutex.unlock(); }
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					ScopedLock		(const ScopedLock& other); // Not allowed!
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ScopedLock&		operator=		(const ScopedLock& other); // Not allowed!
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Mutex&			m_mutex;
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Mutex inline implementations.
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Acquire mutex lock.
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \note This method will never report failure. If an error occurs due
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *		 to misuse or other reason it will lead to process termination
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry*		 in debug build.
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * If mutex is currently locked the function will block until current
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * lock is released.
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * In recursive mode further calls from the thread owning the mutex will
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * succeed and increment lock count.
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline void Mutex::lock (void) throw()
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deMutex_lock(m_mutex);
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Release mutex lock.
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \note This method will never report failure. If an error occurs due
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *		 to misuse or other reason it will lead to process termination
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry*		 in debug build.
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * In recursive mode the mutex will be released once the lock count reaches
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * zero.
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline void Mutex::unlock (void) throw()
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deMutex_unlock(m_mutex);
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Try to acquire lock.
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Returns true if lock was acquired and false otherwise.
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * This function will never block, i.e. it will return false if mutex
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * is currently locked.
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool Mutex::tryLock (void) throw()
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return deMutex_tryLock(m_mutex) == DE_TRUE;
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// ScopedLock inline implementations.
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Acquire scoped lock to mutex.
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param mutex Mutex to be locked.
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline ScopedLock::ScopedLock (Mutex& mutex)
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_mutex(mutex)
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_mutex.lock();
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // de
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif // _DEMUTEX_HPP
134