aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2016-07-20 00:35:35 +1200
committerGitHub <noreply@github.com>2016-07-20 00:35:35 +1200
commitd98cd05a989bd0cd3f6dd4c581e46b0cbbd6424a (patch)
tree6b73770f8e8e27051dc0efadd3afafa1517d2842
parent00e2f8a3575855a8b863e245005b8f83b3314bfb (diff)
parent6ef76c9e22ada4ed5d89d0a3bd43d759b56bebe0 (diff)
downloadtraccar-server-d98cd05a989bd0cd3f6dd4c581e46b0cbbd6424a.tar.gz
traccar-server-d98cd05a989bd0cd3f6dd4c581e46b0cbbd6424a.tar.bz2
traccar-server-d98cd05a989bd0cd3f6dd4c581e46b0cbbd6424a.zip
Merge pull request #2129 from Abyss777/fix_locks_in_geofense_refresh
Split locks in GeofenceManager to avoid dead locks
-rw-r--r--src/org/traccar/database/GeofenceManager.java20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/org/traccar/database/GeofenceManager.java b/src/org/traccar/database/GeofenceManager.java
index dc31172b9..930008082 100644
--- a/src/org/traccar/database/GeofenceManager.java
+++ b/src/org/traccar/database/GeofenceManager.java
@@ -155,25 +155,35 @@ public class GeofenceManager {
public final void refresh() {
if (dataManager != null) {
try {
+
+ Collection<GroupGeofence> databaseGroupGeofences = dataManager.getGroupGeofences();
groupGeofencesLock.writeLock().lock();
- deviceGeofencesLock.writeLock().lock();
try {
groupGeofences.clear();
- for (GroupGeofence groupGeofence : dataManager.getGroupGeofences()) {
+ for (GroupGeofence groupGeofence : databaseGroupGeofences) {
getGroupGeofences(groupGeofence.getGroupId()).add(groupGeofence.getGeofenceId());
}
+ } finally {
+ groupGeofencesLock.writeLock().unlock();
+ }
+ Collection<DeviceGeofence> databaseDeviceGeofences = dataManager.getDeviceGeofences();
+ Collection<Device> allDevices = Context.getDeviceManager().getAllDevices();
+
+ groupGeofencesLock.readLock().lock();
+ deviceGeofencesLock.writeLock().lock();
+ try {
deviceGeofences.clear();
deviceGeofencesWithGroups.clear();
- for (DeviceGeofence deviceGeofence : dataManager.getDeviceGeofences()) {
+ for (DeviceGeofence deviceGeofence : databaseDeviceGeofences) {
getDeviceGeofences(deviceGeofences, deviceGeofence.getDeviceId())
.add(deviceGeofence.getGeofenceId());
getDeviceGeofences(deviceGeofencesWithGroups, deviceGeofence.getDeviceId())
.add(deviceGeofence.getGeofenceId());
}
- for (Device device : Context.getDeviceManager().getAllDevices()) {
+ for (Device device : allDevices) {
long groupId = device.getGroupId();
while (groupId != 0) {
getDeviceGeofences(deviceGeofencesWithGroups,
@@ -204,8 +214,8 @@ public class GeofenceManager {
}
} finally {
- groupGeofencesLock.writeLock().unlock();
deviceGeofencesLock.writeLock().unlock();
+ groupGeofencesLock.readLock().unlock();
}
} catch (SQLException error) {