|
@@ -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
|
/**
|