From 513dad51f1f6f83e868e286bd0e0837a67e9ac94 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Sun, 20 Jan 2013 02:03:10 +0000 Subject: [PATCH] Finxing possible dead-lock. --- .../lotro/async/handler/ChatRequestHandler.java | 1 + .../lotro/async/handler/GameRequestHandler.java | 15 +++++---------- .../lotro/async/handler/HallRequestHandler.java | 14 +++++--------- .../lotro/hall/HallCommunicationChannel.java | 12 +++--------- 4 files changed, 14 insertions(+), 28 deletions(-) diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/ChatRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/ChatRequestHandler.java index 332860a4e..82d0f78de 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/ChatRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/ChatRequestHandler.java @@ -77,6 +77,7 @@ public class ChatRequestHandler extends LotroServerRequestHandler implements Uri } private class ChatUpdateLongPollingResource implements LongPollingResource { + private ChatCommunicationChannel _chatCommunicationChannel; private ChatRoomMediator _chatRoom; private String _room; private String _playerId; diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/GameRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/GameRequestHandler.java index 7906be92f..c2935b5cb 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/GameRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/GameRequestHandler.java @@ -87,7 +87,7 @@ public class GameRequestHandler extends LotroServerRequestHandler implements Uri try { GameCommunicationChannel pollableResource = gameMediator.getCommunicationChannel(resourceOwner, channelNumber); - GameUpdateLongPollingResource pollingResource = new GameUpdateLongPollingResource(channelNumber, gameMediator, resourceOwner, responseWriter); + GameUpdateLongPollingResource pollingResource = new GameUpdateLongPollingResource(pollableResource, channelNumber, gameMediator, resourceOwner, responseWriter); _longPollingSystem.processLongPollingResource(pollingResource, pollableResource); } catch (SubscriptionConflictException exp) { responseWriter.writeError(409); @@ -99,13 +99,15 @@ public class GameRequestHandler extends LotroServerRequestHandler implements Uri } private class GameUpdateLongPollingResource implements LongPollingResource { + private GameCommunicationChannel _gameCommunicationChannel; private LotroGameMediator _gameMediator; private Player _resourceOwner; private int _channelNumber; private ResponseWriter _responseWriter; private boolean _processed; - private GameUpdateLongPollingResource(int channelNumber, LotroGameMediator gameMediator, Player resourceOwner, ResponseWriter responseWriter) { + private GameUpdateLongPollingResource(GameCommunicationChannel gameCommunicationChannel, int channelNumber, LotroGameMediator gameMediator, Player resourceOwner, ResponseWriter responseWriter) { + _gameCommunicationChannel = gameCommunicationChannel; _channelNumber = channelNumber; _gameMediator = gameMediator; _resourceOwner = resourceOwner; @@ -127,18 +129,11 @@ public class GameRequestHandler extends LotroServerRequestHandler implements Uri Document doc = documentBuilder.newDocument(); Element update = doc.createElement("update"); - GameCommunicationChannel communicationChannel = _gameMediator.getCommunicationChannel(_resourceOwner, _channelNumber); - _gameMediator.processVisitor(communicationChannel, _channelNumber, _resourceOwner.getName(), new SerializationVisitor(doc, update)); + _gameMediator.processVisitor(_gameCommunicationChannel, _channelNumber, _resourceOwner.getName(), new SerializationVisitor(doc, update)); doc.appendChild(update); _responseWriter.writeXmlResponse(doc); - } catch (SubscriptionConflictException exp) { - _responseWriter.writeError(409); - } catch (PrivateInformationException e) { - _responseWriter.writeError(403); - } catch (SubscriptionExpiredException e) { - _responseWriter.writeError(410); } catch (Exception e) { _responseWriter.writeError(500); } diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java index c9aad8de7..1f49a4423 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java @@ -442,7 +442,7 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri try { HallCommunicationChannel pollableResource = _hallServer.getCommunicationChannel(resourceOwner, channelNumber); - HallUpdateLongPollingResource polledResource = new HallUpdateLongPollingResource(request, resourceOwner, channelNumber, responseWriter); + HallUpdateLongPollingResource polledResource = new HallUpdateLongPollingResource(pollableResource, request, resourceOwner, responseWriter); _longPollingSystem.processLongPollingResource(polledResource, pollableResource); } catch (SubscriptionExpiredException exp) { responseWriter.writeError(410); @@ -453,15 +453,15 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri private class HallUpdateLongPollingResource implements LongPollingResource { private HttpRequest _request; + private HallCommunicationChannel _hallCommunicationChannel; private Player _resourceOwner; - private int _channelNumber; private ResponseWriter _responseWriter; private boolean _processed; - private HallUpdateLongPollingResource(HttpRequest request, Player resourceOwner, int channelNumber, ResponseWriter responseWriter) { + private HallUpdateLongPollingResource(HallCommunicationChannel hallCommunicationChannel, HttpRequest request, Player resourceOwner, ResponseWriter responseWriter) { + _hallCommunicationChannel = hallCommunicationChannel; _request = request; _resourceOwner = resourceOwner; - _channelNumber = channelNumber; _responseWriter = responseWriter; } @@ -480,7 +480,7 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri Document doc = documentBuilder.newDocument(); Element hall = doc.createElement("hall"); - _hallServer.getCommunicationChannel(_resourceOwner, _channelNumber).processCommunicationChannel(_hallServer, _resourceOwner, new SerializeHallInfoVisitor(doc, hall)); + _hallCommunicationChannel.processCommunicationChannel(_hallServer, _resourceOwner, new SerializeHallInfoVisitor(doc, hall)); hall.setAttribute("currency", String.valueOf(_collectionManager.getPlayerCollection(_resourceOwner, "permanent").getCurrency())); doc.appendChild(hall); @@ -489,10 +489,6 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri processDeliveryServiceNotification(_request, headers); _responseWriter.writeXmlResponse(doc, headers); - } catch (SubscriptionExpiredException exp) { - _responseWriter.writeError(410); - } catch (SubscriptionConflictException exp) { - _responseWriter.writeError(409); } catch (Exception exp) { _responseWriter.writeError(500); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallCommunicationChannel.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallCommunicationChannel.java index 3a67c3c6d..670a17e16 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallCommunicationChannel.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallCommunicationChannel.java @@ -16,7 +16,7 @@ public class HallCommunicationChannel implements LongPollableResource { private Map> _tournamentPropsOnClient = new LinkedHashMap>(); private Map> _tablePropsOnClient = new LinkedHashMap>(); private Set _playedGames = new HashSet(); - private boolean _changed; + private volatile boolean _changed; private WaitingRequest _waitingRequest; public HallCommunicationChannel(int channelNumber) { @@ -29,7 +29,7 @@ public class HallCommunicationChannel implements LongPollableResource { } @Override - public boolean registerRequest(WaitingRequest waitingRequest) { + public synchronized boolean registerRequest(WaitingRequest waitingRequest) { if (_changed) return true; @@ -55,13 +55,7 @@ public class HallCommunicationChannel implements LongPollableResource { return _lastConsumed; } - public synchronized boolean hasChangesInCommunicationChannel() { - updateLastAccess(); - - return _changed; - } - - public synchronized void processCommunicationChannel(HallServer hallServer, final Player player, final HallChannelVisitor hallChannelVisitor) { + public void processCommunicationChannel(HallServer hallServer, final Player player, final HallChannelVisitor hallChannelVisitor) { updateLastAccess(); hallChannelVisitor.channelNumber(_channelNumber);