21
21
#include " qgsvectorlayer.h"
22
22
#include " qgsvectordataprovider.h"
23
23
#include " qgsvectorlayerutils.h"
24
+ #include " qgsreadwritelocker.h"
24
25
25
26
#include < QMutexLocker>
26
27
28
+
27
29
QgsFeaturePool::QgsFeaturePool ( QgsVectorLayer *layer, double layerToMapUnits, const QgsCoordinateTransform &layerToMapTransform )
28
30
: mFeatureCache( CACHE_SIZE )
29
31
, mLayer( layer )
@@ -37,7 +39,7 @@ QgsFeaturePool::QgsFeaturePool( QgsVectorLayer *layer, double layerToMapUnits, c
37
39
38
40
bool QgsFeaturePool::get ( QgsFeatureId id, QgsFeature &feature )
39
41
{
40
- mCacheLock . lockForRead ( );
42
+ QgsReadWriteLocker locker ( mCacheLock , QgsReadWriteLocker::Read );
41
43
QgsFeature *cachedFeature = mFeatureCache .object ( id );
42
44
if ( cachedFeature )
43
45
{
@@ -54,11 +56,9 @@ bool QgsFeaturePool::get( QgsFeatureId id, QgsFeature &feature )
54
56
{
55
57
return false ;
56
58
}
57
- mCacheLock .unlock ();
58
- mCacheLock .lockForWrite ();
59
+ locker.changeMode ( QgsReadWriteLocker::Write );
59
60
mFeatureCache .insert ( id, new QgsFeature ( feature ) );
60
61
}
61
- mCacheLock .unlock ();
62
62
return true ;
63
63
}
64
64
@@ -69,9 +69,8 @@ QgsFeatureIds QgsFeaturePool::getFeatureIds() const
69
69
70
70
QgsFeatureIds QgsFeaturePool::getIntersects ( const QgsRectangle &rect ) const
71
71
{
72
- mIndexLock . lockForRead ( );
72
+ QgsReadWriteLocker locker ( mIndexLock , QgsReadWriteLocker::Read );
73
73
QgsFeatureIds ids = QgsFeatureIds::fromList ( mIndex .intersects ( rect ) );
74
- mIndexLock .unlock ();
75
74
return ids;
76
75
}
77
76
@@ -84,32 +83,31 @@ QgsVectorLayer *QgsFeaturePool::layer() const
84
83
85
84
void QgsFeaturePool::insertFeature ( const QgsFeature &feature )
86
85
{
87
- mCacheLock . lockForWrite ( );
86
+ QgsReadWriteLocker locker ( mIndexLock , QgsReadWriteLocker::Write );
88
87
mFeatureCache .insert ( feature.id (), new QgsFeature ( feature ) );
89
88
mIndex .insertFeature ( feature );
90
- mCacheLock .unlock ();
91
89
}
92
90
93
91
void QgsFeaturePool::changeFeature ( const QgsFeature &feature )
94
92
{
95
- mCacheLock . lockForWrite ( );
93
+ QgsReadWriteLocker locker ( mIndexLock , QgsReadWriteLocker::Write );
96
94
mFeatureCache .remove ( feature.id () );
97
95
mFeatureCache .insert ( feature.id (), new QgsFeature ( feature ) );
98
96
mIndex .deleteFeature ( feature );
99
97
mIndex .insertFeature ( feature );
100
- mCacheLock .unlock ();
101
98
}
102
99
103
100
void QgsFeaturePool::removeFeature ( const QgsFeatureId featureId )
104
101
{
105
102
QgsFeature origFeature;
106
- mCacheLock . lockForWrite ( );
103
+ QgsReadWriteLocker locker ( mIndexLock , QgsReadWriteLocker::Unlocked );
107
104
if ( get ( featureId, origFeature ) )
108
105
{
106
+ locker.changeMode ( QgsReadWriteLocker::Write );
109
107
mIndex .deleteFeature ( origFeature );
110
108
}
109
+ locker.changeMode ( QgsReadWriteLocker::Write );
111
110
mFeatureCache .remove ( origFeature.id () );
112
- mCacheLock .unlock ();
113
111
}
114
112
115
113
void QgsFeaturePool::setFeatureIds ( const QgsFeatureIds &ids )
0 commit comments