Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
199 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
/************************************************************************ | ||
* This file has been generated automatically from * | ||
* * | ||
* src/core/qgsreadwritelocker.h * | ||
* * | ||
* Do not edit manually ! Edit header and run scripts/sipify.pl again * | ||
************************************************************************/ | ||
|
||
|
||
|
||
|
||
|
||
class QgsReadWriteLocker | ||
{ | ||
%Docstring | ||
The QgsReadWriteLocker class is a convenience class that simplifies locking and unlocking QReadWriteLocks. | ||
|
||
Locking and unlocking a QReadWriteLocks in complex functions and statements or in exception handling code | ||
is error-prone and difficult to debug. | ||
QgsReadWriteLocker can be used in such situations to ensure that the state of the lock is always well-defined. | ||
|
||
QgsReadWriteLocker should be created within a function where a QReadWriteLock needs to be locked. | ||
The lock may be locked when QgsReadWriteLocker is created or when changeMode is called. | ||
You can unlock and relock the lock with unlock() and changeMode(). | ||
If locked, the mutex will be unlocked when the QgsReadWriteLocker is destroyed. | ||
|
||
.. versionadded:: 3.4 | ||
%End | ||
|
||
%TypeHeaderCode | ||
#include "qgsreadwritelocker.h" | ||
%End | ||
public: | ||
enum Mode | ||
{ | ||
Read, | ||
Write, | ||
Unlocked | ||
}; | ||
|
||
QgsReadWriteLocker( QReadWriteLock &lock, Mode mode ); | ||
%Docstring | ||
Create a new QgsReadWriteLocker for ``lock`` and initialize in ``mode``. | ||
%End | ||
|
||
void changeMode( Mode mode ); | ||
%Docstring | ||
Change the mode of the lock to ``mode``. | ||
The lock will be unlocked and relocked as required. | ||
%End | ||
|
||
void unlock(); | ||
%Docstring | ||
Unlocks the lock. | ||
Equivalent to doing ``changeMode( QgsReadWriteLocker.Unlock );`` | ||
%End | ||
|
||
~QgsReadWriteLocker(); | ||
|
||
}; | ||
|
||
/************************************************************************ | ||
* This file has been generated automatically from * | ||
* * | ||
* src/core/qgsreadwritelocker.h * | ||
* * | ||
* Do not edit manually ! Edit header and run scripts/sipify.pl again * | ||
************************************************************************/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
/*************************************************************************** | ||
qgsreadwritelocker.cpp | ||
------------------------- | ||
begin : September 2018 | ||
copyright : (C) 2018 by Matthias Kuhn | ||
email : matthias@opengis.ch | ||
***************************************************************************/ | ||
|
||
/*************************************************************************** | ||
* * | ||
* This program is free software; you can redistribute it and/or modify * | ||
* it under the terms of the GNU General Public License as published by * | ||
* the Free Software Foundation; either version 2 of the License, or * | ||
* (at your option) any later version. * | ||
* * | ||
***************************************************************************/ | ||
|
||
#include "qgsreadwritelocker.h" | ||
|
||
QgsReadWriteLocker::QgsReadWriteLocker( QReadWriteLock &lock, QgsReadWriteLocker::Mode mode ) | ||
: mLock( lock ) | ||
, mMode( mode ) | ||
{ | ||
if ( mode == Read ) | ||
mLock.lockForRead(); | ||
else if ( mode == Write ) | ||
mLock.lockForWrite(); | ||
} | ||
|
||
void QgsReadWriteLocker::changeMode( QgsReadWriteLocker::Mode mode ) | ||
{ | ||
if ( mode == mMode ) | ||
return; | ||
|
||
unlock(); | ||
|
||
if ( mMode == Read ) | ||
mLock.lockForRead(); | ||
else if ( mMode == Write ) | ||
mLock.lockForWrite(); | ||
} | ||
|
||
void QgsReadWriteLocker::unlock() | ||
{ | ||
if ( mMode != Unlocked ) | ||
mLock.unlock(); | ||
|
||
mMode = Unlocked; | ||
} | ||
|
||
QgsReadWriteLocker::~QgsReadWriteLocker() | ||
{ | ||
unlock(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
/*************************************************************************** | ||
qgsreadwritelocker.cpp | ||
------------------------- | ||
begin : September 2018 | ||
copyright : (C) 2018 by Matthias Kuhn | ||
email : matthias@opengis.ch | ||
***************************************************************************/ | ||
|
||
/*************************************************************************** | ||
* * | ||
* This program is free software; you can redistribute it and/or modify * | ||
* it under the terms of the GNU General Public License as published by * | ||
* the Free Software Foundation; either version 2 of the License, or * | ||
* (at your option) any later version. * | ||
* * | ||
***************************************************************************/ | ||
|
||
#ifndef QGSREADWRITELOCKER_H | ||
#define QGSREADWRITELOCKER_H | ||
|
||
#include "qgis_core.h" | ||
|
||
#include <QReadWriteLock> | ||
|
||
/** | ||
* \ingroup core | ||
* The QgsReadWriteLocker class is a convenience class that simplifies locking and unlocking QReadWriteLocks. | ||
* | ||
* Locking and unlocking a QReadWriteLocks in complex functions and statements or in exception handling code | ||
* is error-prone and difficult to debug. | ||
* QgsReadWriteLocker can be used in such situations to ensure that the state of the lock is always well-defined. | ||
* | ||
* QgsReadWriteLocker should be created within a function where a QReadWriteLock needs to be locked. | ||
* The lock may be locked when QgsReadWriteLocker is created or when changeMode is called. | ||
* You can unlock and relock the lock with unlock() and changeMode(). | ||
* If locked, the mutex will be unlocked when the QgsReadWriteLocker is destroyed. | ||
* | ||
* \since QGIS 3.4 | ||
*/ | ||
class CORE_EXPORT QgsReadWriteLocker | ||
{ | ||
public: | ||
enum Mode | ||
{ | ||
Read, //!< Lock for read | ||
Write, //!< Lock for write | ||
Unlocked //!< Unlocked | ||
}; | ||
|
||
/** | ||
* Create a new QgsReadWriteLocker for \a lock and initialize in \a mode. | ||
*/ | ||
QgsReadWriteLocker( QReadWriteLock &lock, Mode mode ); | ||
|
||
/** | ||
* Change the mode of the lock to \a mode. | ||
* The lock will be unlocked and relocked as required. | ||
*/ | ||
void changeMode( Mode mode ); | ||
|
||
/** | ||
* Unlocks the lock. | ||
* Equivalent to doing ``changeMode( QgsReadWriteLocker::Unlock );`` | ||
*/ | ||
void unlock(); | ||
|
||
~QgsReadWriteLocker(); | ||
|
||
private: | ||
QReadWriteLock &mLock; | ||
Mode mMode = Unlocked; | ||
}; | ||
|
||
#endif // QGSREADWRITELOCKER_H |