Explorar el Código

Don't allow resetting state whilst socketClose events are still occuring.

pull/102/head
Shane Mc Cormack hace 8 años
padre
commit
a23c571fdb
Se han modificado 1 ficheros con 8 adiciones y 0 borrados
  1. 8
    0
      irc/src/com/dmdirc/parser/irc/IRCParser.java

+ 8
- 0
irc/src/com/dmdirc/parser/irc/IRCParser.java Ver fichero

@@ -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
+    /** Semaphore for calls to resetState. */
235
+    private final Semaphore resetStateSem = new Semaphore(1);
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() {
595
+        // Don't allow state resetting whilst there may be handlers requiring
596
+        // state.
597
+        resetStateSem.acquireUninterruptibly();
593 598
         getCallbackManager().publish(new SocketCloseEvent(this, new Date()));
599
+        resetStateSem.release();
594 600
     }
595 601
 
596 602
     /**
@@ -643,6 +649,7 @@ public class IRCParser extends BaseSocketAwareParser implements SecureParser, En
643 649
     //---------------------------------------------------------------------------
644 650
     /** Reset internal state (use before doConnect). */
645 651
     private void resetState() {
652
+        resetStateSem.acquireUninterruptibly();
646 653
         // Reset General State info
647 654
         got001 = false;
648 655
         post005 = false;
@@ -673,6 +680,7 @@ public class IRCParser extends BaseSocketAwareParser implements SecureParser, En
673 680
         setEncoding(IRCEncoding.RFC1459);
674 681
 
675 682
         whoisHandler.stop();
683
+        resetStateSem.release();
676 684
     }
677 685
 
678 686
     /**

Loading…
Cancelar
Guardar