2000-09-18 14:18:43 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
|
|
|
* $RCSfile: mutex.hxx,v $
|
|
|
|
*
|
2002-10-15 12:32:34 +00:00
|
|
|
* $Revision: 1.8 $
|
2000-09-18 14:18:43 +00:00
|
|
|
*
|
2002-10-15 12:32:34 +00:00
|
|
|
* last change: $Author: hro $ $Date: 2002-10-15 13:32:34 $
|
2000-09-18 14:18:43 +00:00
|
|
|
*
|
|
|
|
* The Contents of this file are made available subject to the terms of
|
|
|
|
* either of the following licenses
|
|
|
|
*
|
|
|
|
* - GNU Lesser General Public License Version 2.1
|
|
|
|
* - Sun Industry Standards Source License Version 1.1
|
|
|
|
*
|
|
|
|
* Sun Microsystems Inc., October, 2000
|
|
|
|
*
|
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2000 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Sun Industry Standards Source License Version 1.1
|
|
|
|
* =================================================
|
|
|
|
* The contents of this file are subject to the Sun Industry Standards
|
|
|
|
* Source License Version 1.1 (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.openoffice.org/license.html.
|
|
|
|
*
|
|
|
|
* Software provided under this License is provided on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
|
|
|
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
|
|
|
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
|
|
|
* See the License for the specific provisions governing your rights and
|
|
|
|
* obligations concerning the Software.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* Copyright: 2000 by Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s): _______________________________________
|
|
|
|
*
|
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#ifndef _OSL_MUTEX_HXX_
|
|
|
|
#define _OSL_MUTEX_HXX_
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
|
|
|
#include <osl/mutex.h>
|
|
|
|
|
|
|
|
|
|
|
|
namespace osl
|
|
|
|
{
|
2001-11-12 13:40:49 +00:00
|
|
|
/** A mutual exclusion synchronization object
|
|
|
|
*/
|
2000-09-18 14:18:43 +00:00
|
|
|
class Mutex {
|
|
|
|
oslMutex mutex;
|
|
|
|
|
|
|
|
// these make no sense
|
2001-07-06 09:00:48 +00:00
|
|
|
Mutex( oslMutex );
|
|
|
|
Mutex( const Mutex & );
|
|
|
|
Mutex& operator= ( oslMutex );
|
|
|
|
Mutex& operator= ( const Mutex& );
|
2000-09-18 14:18:43 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
/** Create a thread-local mutex.
|
|
|
|
@return 0 if the mutex could not be created, otherwise a handle to the mutex.
|
2001-11-12 13:40:49 +00:00
|
|
|
@seealso ::osl_createMutex()
|
2000-09-18 14:18:43 +00:00
|
|
|
*/
|
|
|
|
Mutex()
|
|
|
|
{
|
|
|
|
mutex = osl_createMutex();
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Release the OS-structures and free mutex data-structure.
|
2001-11-12 13:40:49 +00:00
|
|
|
@seealso ::osl_destroyMutex()
|
2000-09-18 14:18:43 +00:00
|
|
|
*/
|
|
|
|
~Mutex()
|
|
|
|
{
|
|
|
|
osl_destroyMutex(mutex);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Acquire the mutex, block if already acquired by another thread.
|
2001-11-12 13:40:49 +00:00
|
|
|
@return sal_False if system-call fails.
|
|
|
|
@seealso ::osl_acquireMutex()
|
2000-09-18 14:18:43 +00:00
|
|
|
*/
|
|
|
|
sal_Bool acquire()
|
|
|
|
{
|
|
|
|
return osl_acquireMutex(mutex);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Try to acquire the mutex without blocking.
|
2001-11-12 13:40:49 +00:00
|
|
|
@return sal_False if it could not be acquired.
|
|
|
|
@seealso ::osl_tryToAcquireMutex()
|
2000-09-18 14:18:43 +00:00
|
|
|
*/
|
|
|
|
sal_Bool tryToAcquire()
|
|
|
|
{
|
|
|
|
return osl_tryToAcquireMutex(mutex);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Release the mutex.
|
2001-11-12 13:40:49 +00:00
|
|
|
@return sal_False if system-call fails.
|
|
|
|
@seealso ::osl_releaseMutex()
|
2000-09-18 14:18:43 +00:00
|
|
|
*/
|
|
|
|
sal_Bool release()
|
|
|
|
{
|
|
|
|
return osl_releaseMutex(mutex);
|
|
|
|
}
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Returns a global static mutex object.
|
|
|
|
The global and static mutex object can be used to initialize other
|
|
|
|
static objects in a thread safe manner.
|
|
|
|
@return the global mutex object
|
|
|
|
@seealso ::osl_getGlobalMutex()
|
|
|
|
*/
|
2000-09-18 14:18:43 +00:00
|
|
|
static Mutex * getGlobalMutex()
|
|
|
|
{
|
|
|
|
return (Mutex *)osl_getGlobalMutex();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** A helper class for mutex objects and interfaces.
|
|
|
|
*/
|
2000-09-18 14:18:43 +00:00
|
|
|
template<class T>
|
|
|
|
class Guard
|
|
|
|
{
|
2002-10-15 12:32:34 +00:00
|
|
|
private:
|
|
|
|
Guard( const Guard& );
|
|
|
|
const Guard& operator = ( const Guard& );
|
|
|
|
|
2000-09-18 14:18:43 +00:00
|
|
|
protected:
|
|
|
|
T * pT;
|
|
|
|
public:
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Acquires the object specified as parameter.
|
|
|
|
*/
|
2000-09-18 14:18:43 +00:00
|
|
|
Guard(T * pT) : pT(pT)
|
|
|
|
{
|
|
|
|
pT->acquire();
|
|
|
|
}
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Acquires the object specified as parameter.
|
|
|
|
*/
|
2000-09-18 14:18:43 +00:00
|
|
|
Guard(T & t) : pT(&t)
|
|
|
|
{
|
|
|
|
pT->acquire();
|
|
|
|
}
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Releases the mutex or interface. */
|
2000-09-18 14:18:43 +00:00
|
|
|
~Guard()
|
|
|
|
{
|
|
|
|
pT->release();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** A helper class for mutex objects and interfaces.
|
|
|
|
*/
|
2000-09-18 14:18:43 +00:00
|
|
|
template<class T>
|
|
|
|
class ClearableGuard
|
|
|
|
{
|
2002-10-15 12:32:34 +00:00
|
|
|
private:
|
|
|
|
ClearableGuard( const ClearableGuard& );
|
|
|
|
const ClearableGuard& operator = ( const ClearableGuard& );
|
2000-09-18 14:18:43 +00:00
|
|
|
protected:
|
|
|
|
T * pT;
|
|
|
|
public:
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Acquires the object specified as parameter.
|
|
|
|
*/
|
2000-09-18 14:18:43 +00:00
|
|
|
ClearableGuard(T * pT) : pT(pT)
|
|
|
|
{
|
|
|
|
pT->acquire();
|
|
|
|
}
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Acquires the object specified as parameter.
|
|
|
|
*/
|
2000-09-18 14:18:43 +00:00
|
|
|
ClearableGuard(T & t) : pT(&t)
|
|
|
|
{
|
|
|
|
pT->acquire();
|
|
|
|
}
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Releases the mutex or interface if not already released by clear().
|
|
|
|
*/
|
2000-09-18 14:18:43 +00:00
|
|
|
~ClearableGuard()
|
|
|
|
{
|
|
|
|
if (pT)
|
|
|
|
pT->release();
|
|
|
|
}
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Releases the mutex or interface.
|
|
|
|
*/
|
2000-09-18 14:18:43 +00:00
|
|
|
void clear()
|
|
|
|
{
|
|
|
|
if(pT)
|
|
|
|
{
|
|
|
|
pT->release();
|
|
|
|
pT = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** A helper class for mutex objects and interfaces.
|
|
|
|
*/
|
2001-06-22 09:49:45 +00:00
|
|
|
template< class T >
|
|
|
|
class ResettableGuard : public ClearableGuard< T >
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
T* pResetT;
|
|
|
|
public:
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Acquires the object specified as parameter.
|
|
|
|
*/
|
2001-06-22 09:49:45 +00:00
|
|
|
ResettableGuard( T* pT ) :
|
2001-06-29 10:31:49 +00:00
|
|
|
ClearableGuard<T>( pT ),
|
2001-06-22 09:49:45 +00:00
|
|
|
pResetT( pT )
|
|
|
|
{}
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Acquires the object specified as parameter.
|
|
|
|
*/
|
2001-06-22 09:49:45 +00:00
|
|
|
ResettableGuard( T& rT ) :
|
2001-06-29 10:31:49 +00:00
|
|
|
ClearableGuard<T>( rT ),
|
2001-06-22 09:49:45 +00:00
|
|
|
pResetT( &rT )
|
|
|
|
{}
|
|
|
|
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Re-aquires the mutex or interface.
|
|
|
|
*/
|
2001-06-22 09:49:45 +00:00
|
|
|
void reset()
|
|
|
|
{
|
|
|
|
if( pResetT )
|
|
|
|
{
|
|
|
|
pT = pResetT;
|
|
|
|
pT->acquire();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2000-09-18 14:18:43 +00:00
|
|
|
typedef Guard<Mutex> MutexGuard;
|
|
|
|
typedef ClearableGuard<Mutex> ClearableMutexGuard;
|
2001-06-22 09:49:45 +00:00
|
|
|
typedef ResettableGuard< Mutex > ResettableMutexGuard;
|
2000-09-18 14:18:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* _OSL_MUTEX_HXX_ */
|
|
|
|
|