Browse Source

Merge pull request #102 from ShaneMcC/resetstatefix

Don't allow resetting state whilst socketClose events are still occuring
pull/105/head
Chris Smith 8 years ago
parent
commit
efebf1db61
1 changed files with 36 additions and 28 deletions
  1. 36
    28
      irc/src/com/dmdirc/parser/irc/IRCParser.java

+ 36
- 28
irc/src/com/dmdirc/parser/irc/IRCParser.java View File

@@ -231,6 +231,8 @@ public class IRCParser extends BaseSocketAwareParser implements SecureParser, En
231 231
     private final Map<String, CapabilityState> capabilities = new HashMap<>();
232 232
     /** Handler for whois responses. */
233 233
     private final WhoisResponseHandler whoisHandler;
234
+    /** Used to synchronize calls to resetState. */
235
+    private final Object resetStateSync = new Object();
234 236
 
235 237
     /**
236 238
      * Default constructor, ServerInfo and MyInfo need to be added separately (using IRC.me and IRC.server).
@@ -590,7 +592,11 @@ public class IRCParser extends BaseSocketAwareParser implements SecureParser, En
590 592
      * Callback to all objects implementing the SocketClosed Callback.
591 593
      */
592 594
     protected void callSocketClosed() {
593
-        getCallbackManager().publish(new SocketCloseEvent(this, new Date()));
595
+        // Don't allow state resetting whilst there may be handlers requiring
596
+        // state.
597
+        synchronized (resetStateSync) {
598
+            getCallbackManager().publish(new SocketCloseEvent(this, new Date()));
599
+        }
594 600
     }
595 601
 
596 602
     /**
@@ -643,36 +649,38 @@ public class IRCParser extends BaseSocketAwareParser implements SecureParser, En
643 649
     //---------------------------------------------------------------------------
644 650
     /** Reset internal state (use before doConnect). */
645 651
     private void resetState() {
646
-        // Reset General State info
647
-        got001 = false;
648
-        post005 = false;
649
-        // Clear the hash tables
650
-        channelList.clear();
651
-        clientList.clear();
652
-        h005Info.clear();
653
-        prefixModes.clear();
654
-        chanModesOther.clear();
655
-        chanModesBool.clear();
656
-        userModes.clear();
657
-        chanPrefix = DEFAULT_CHAN_PREFIX;
658
-        // Clear output queue.
659
-        if (out != null) {
660
-            out.clearQueue();
661
-        }
662
-        setServerName("");
663
-        networkName = "";
664
-        lastLine = null;
665
-        myself = new IRCClientInfo(this, userModes, "myself").setFake(true);
652
+        synchronized (resetStateSync) {
653
+            // Reset General State info
654
+            got001 = false;
655
+            post005 = false;
656
+            // Clear the hash tables
657
+            channelList.clear();
658
+            clientList.clear();
659
+            h005Info.clear();
660
+            prefixModes.clear();
661
+            chanModesOther.clear();
662
+            chanModesBool.clear();
663
+            userModes.clear();
664
+            chanPrefix = DEFAULT_CHAN_PREFIX;
665
+            // Clear output queue.
666
+            if (out != null) {
667
+                out.clearQueue();
668
+            }
669
+            setServerName("");
670
+            networkName = "";
671
+            lastLine = null;
672
+            myself = new IRCClientInfo(this, userModes, "myself").setFake(true);
666 673
 
667
-        synchronized (serverInformationLines) {
668
-            serverInformationLines.clear();
669
-        }
670
-        stopPingTimer();
674
+            synchronized (serverInformationLines) {
675
+                serverInformationLines.clear();
676
+            }
677
+            stopPingTimer();
671 678
 
672
-        currentSocketState = SocketState.CLOSED;
673
-        setEncoding(IRCEncoding.RFC1459);
679
+            currentSocketState = SocketState.CLOSED;
680
+            setEncoding(IRCEncoding.RFC1459);
674 681
 
675
-        whoisHandler.stop();
682
+            whoisHandler.stop();
683
+        }
676 684
     }
677 685
 
678 686
     /**

Loading…
Cancel
Save