From 28f49cce7fd77194a406bb87b20155b7872ccb62 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 26 Sep 2015 18:15:51 +1200 Subject: Fix async session deadlock (fix #1428) --- src/org/traccar/web/AsyncServlet.java | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'src/org/traccar/web') diff --git a/src/org/traccar/web/AsyncServlet.java b/src/org/traccar/web/AsyncServlet.java index 20a71ec1c..a62b98c59 100644 --- a/src/org/traccar/web/AsyncServlet.java +++ b/src/org/traccar/web/AsyncServlet.java @@ -110,12 +110,12 @@ public class AsyncServlet extends BaseServlet { public void run(Timeout tmt) throws Exception { synchronized (AsyncSession.this) { logEvent("sessionTimeout"); - Context.getConnectionManager().removeListener(devices, dataListener); - synchronized (asyncSessions) { - asyncSessions.remove(userId); - } destroyed = true; } + Context.getConnectionManager().removeListener(devices, dataListener); + synchronized (asyncSessions) { + asyncSessions.remove(userId); + } } }; @@ -180,14 +180,18 @@ public class AsyncServlet extends BaseServlet { private static final Map asyncSessions = new HashMap<>(); public static void sessionRefreshUser(long userId) { - asyncSessions.remove(userId); + synchronized (asyncSessions) { + asyncSessions.remove(userId); + } } public static void sessionRefreshDevice(long deviceId) { - Iterator> iterator = asyncSessions.entrySet().iterator(); - while (iterator.hasNext()) { - if (iterator.next().getValue().hasDevice(deviceId)) { - iterator.remove(); + synchronized (asyncSessions) { + Iterator> iterator = asyncSessions.entrySet().iterator(); + while (iterator.hasNext()) { + if (iterator.next().getValue().hasDevice(deviceId)) { + iterator.remove(); + } } } } -- cgit v1.2.3