2000-09-18 14:18:43 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-10 09:30:15 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 14:18:43 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2000-09-18 14:18:43 +00:00
|
|
|
*
|
2008-04-10 09:30:15 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 14:18:43 +00:00
|
|
|
*
|
2008-04-10 09:30:15 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 14:18:43 +00:00
|
|
|
*
|
2008-04-10 09:30:15 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2000-09-18 14:18:43 +00:00
|
|
|
*
|
2008-04-10 09:30:15 +00:00
|
|
|
* OpenOffice.org 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 version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2000-09-18 14:18:43 +00:00
|
|
|
*
|
2008-04-10 09:30:15 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2000-09-18 14:18:43 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#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 {
|
|
|
|
|
|
|
|
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();
|
|
|
|
}
|
2003-10-20 15:10:59 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
oslMutex mutex;
|
|
|
|
|
|
|
|
/** The underlying oslMutex has no reference count.
|
|
|
|
|
|
|
|
Since the underlying oslMutex is not a reference counted object, copy
|
|
|
|
constructed Mutex may work on an already destructed oslMutex object.
|
|
|
|
|
|
|
|
*/
|
|
|
|
Mutex(const Mutex&);
|
|
|
|
|
|
|
|
/** The underlying oslMutex has no reference count.
|
|
|
|
|
|
|
|
When destructed, the Mutex object destroys the undelying oslMutex,
|
|
|
|
which might cause severe problems in case it's a temporary object.
|
|
|
|
|
|
|
|
*/
|
|
|
|
Mutex(oslMutex Mutex);
|
|
|
|
|
|
|
|
/** This assignment operator is private for the same reason as
|
|
|
|
the copy constructor.
|
|
|
|
*/
|
|
|
|
Mutex& operator= (const Mutex&);
|
|
|
|
|
|
|
|
/** This assignment operator is private for the same reason as
|
|
|
|
the constructor taking a oslMutex argument.
|
|
|
|
*/
|
|
|
|
Mutex& operator= (oslMutex);
|
2000-09-18 14:18:43 +00:00
|
|
|
};
|
|
|
|
|
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.
|
|
|
|
*/
|
2003-04-04 16:10:54 +00:00
|
|
|
Guard(T * pT_) : pT(pT_)
|
2000-09-18 14:18:43 +00:00
|
|
|
{
|
|
|
|
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.
|
|
|
|
*/
|
2003-04-04 16:10:54 +00:00
|
|
|
ClearableGuard(T * pT_) : pT(pT_)
|
2000-09-18 14:18:43 +00:00
|
|
|
{
|
|
|
|
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 >
|
|
|
|
{
|
2006-06-20 03:12:44 +00:00
|
|
|
private:
|
|
|
|
ResettableGuard(ResettableGuard &); // not defined
|
|
|
|
void operator =(ResettableGuard &); // not defined
|
|
|
|
|
2001-06-22 09:49:45 +00:00
|
|
|
protected:
|
|
|
|
T* pResetT;
|
|
|
|
public:
|
2001-11-12 13:40:49 +00:00
|
|
|
/** Acquires the object specified as parameter.
|
|
|
|
*/
|
2006-06-20 03:12:44 +00:00
|
|
|
ResettableGuard( T* pT_ ) :
|
|
|
|
ClearableGuard<T>( pT_ ),
|
|
|
|
pResetT( pT_ )
|
2001-06-22 09:49:45 +00:00
|
|
|
{}
|
|
|
|
|
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 )
|
|
|
|
{
|
2004-07-30 13:59:00 +00:00
|
|
|
this->pT = pResetT;
|
|
|
|
this->pT->acquire();
|
2001-06-22 09:49:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
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_ */
|
|
|
|
|