Files
libreoffice/include/osl/mutex.hxx
Stephan Bergmann 189abcf0db loplugin:includeform: UNO API include files
Change these back to consistently use the "..." form to include other UNO API
include files, for the benefit of external users of this API.

Change-Id: I9c9188e895eb3495e20a71ad44abfa2f6061fa94
2017-10-23 22:22:50 +02:00

232 lines
6.0 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you 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 .
*/
#ifndef INCLUDED_OSL_MUTEX_HXX
#define INCLUDED_OSL_MUTEX_HXX
#include "osl/mutex.h"
namespace osl
{
/** A mutual exclusion synchronization object
*/
class SAL_WARN_UNUSED Mutex {
public:
/** Create a mutex.
@return 0 if the mutex could not be created, otherwise a handle to the mutex.
@see ::osl_createMutex()
*/
Mutex()
{
mutex = osl_createMutex();
}
/** Release the OS-structures and free mutex data-structure.
@see ::osl_destroyMutex()
*/
~Mutex()
{
osl_destroyMutex(mutex);
}
/** Acquire the mutex, block if already acquired by another thread.
@return false if system-call fails.
@see ::osl_acquireMutex()
*/
bool acquire()
{
return osl_acquireMutex(mutex);
}
/** Try to acquire the mutex without blocking.
@return false if it could not be acquired.
@see ::osl_tryToAcquireMutex()
*/
bool tryToAcquire()
{
return osl_tryToAcquireMutex(mutex);
}
/** Release the mutex.
@return false if system-call fails.
@see ::osl_releaseMutex()
*/
bool release()
{
return osl_releaseMutex(mutex);
}
/** 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
@see ::osl_getGlobalMutex()
*/
static Mutex * getGlobalMutex()
{
return reinterpret_cast<Mutex *>(osl_getGlobalMutex());
}
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&) SAL_DELETED_FUNCTION;
/** This assignment operator is deleted for the same reason as
the copy constructor.
*/
Mutex& operator= (const Mutex&) SAL_DELETED_FUNCTION;
};
/** A helper class for mutex objects and interfaces.
*/
template<class T>
class Guard
{
private:
Guard( const Guard& ) SAL_DELETED_FUNCTION;
const Guard& operator = ( const Guard& ) SAL_DELETED_FUNCTION;
protected:
T * pT;
public:
/** Acquires the object specified as parameter.
*/
Guard(T * pT_) : pT(pT_)
{
pT->acquire();
}
/** Acquires the object specified as parameter.
*/
Guard(T & t) : pT(&t)
{
pT->acquire();
}
/** Releases the mutex or interface. */
~Guard()
{
pT->release();
}
};
/** A helper class for mutex objects and interfaces.
*/
template<class T>
class ClearableGuard
{
private:
ClearableGuard( const ClearableGuard& ) SAL_DELETED_FUNCTION;
const ClearableGuard& operator = ( const ClearableGuard& )
SAL_DELETED_FUNCTION;
protected:
T * pT;
public:
/** Acquires the object specified as parameter.
*/
ClearableGuard(T * pT_) : pT(pT_)
{
pT->acquire();
}
/** Acquires the object specified as parameter.
*/
ClearableGuard(T & t) : pT(&t)
{
pT->acquire();
}
/** Releases the mutex or interface if not already released by clear().
*/
~ClearableGuard()
{
if (pT)
pT->release();
}
/** Releases the mutex or interface.
*/
void clear()
{
if(pT)
{
pT->release();
pT = NULL;
}
}
};
/** A helper class for mutex objects and interfaces.
*/
template< class T >
class ResettableGuard : public ClearableGuard< T >
{
private:
ResettableGuard(ResettableGuard &) SAL_DELETED_FUNCTION;
void operator =(ResettableGuard &) SAL_DELETED_FUNCTION;
protected:
T* pResetT;
public:
/** Acquires the object specified as parameter.
*/
ResettableGuard( T* pT_ ) :
ClearableGuard<T>( pT_ ),
pResetT( pT_ )
{}
/** Acquires the object specified as parameter.
*/
ResettableGuard( T& rT ) :
ClearableGuard<T>( rT ),
pResetT( &rT )
{}
/** Re-acquires the mutex or interface.
*/
void reset()
{
if( pResetT )
{
this->pT = pResetT;
this->pT->acquire();
}
}
};
typedef Guard<Mutex> MutexGuard;
typedef ClearableGuard<Mutex> ClearableMutexGuard;
typedef ResettableGuard< Mutex > ResettableMutexGuard;
}
#endif // INCLUDED_OSL_MUTEX_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */