mirror of
https://github.com/correl/SleekXMPP.git
synced 2024-12-22 11:09:11 +00:00
race condition where we were transitioning to 'disconnected' and immediately reconnecting in another thread before the socket.close call occurred. Now we're locking the state machine until the disconnect routine completes.
This commit is contained in:
parent
e8d37b409c
commit
15ac3e9fba
1 changed files with 20 additions and 19 deletions
|
@ -59,7 +59,7 @@ class XMLStream(object):
|
||||||
self.ssl_support = ssl_support
|
self.ssl_support = ssl_support
|
||||||
self.escape_quotes = escape_quotes
|
self.escape_quotes = escape_quotes
|
||||||
self.state = statemachine.StateMachine(('disconnected','connecting',
|
self.state = statemachine.StateMachine(('disconnected','connecting',
|
||||||
'connected'))
|
'connected'))
|
||||||
self.should_reconnect = True
|
self.should_reconnect = True
|
||||||
|
|
||||||
self.setSocket(socket)
|
self.setSocket(socket)
|
||||||
|
@ -240,7 +240,7 @@ class XMLStream(object):
|
||||||
if self.should_reconnect:
|
if self.should_reconnect:
|
||||||
self.disconnect(reconnect=True)
|
self.disconnect(reconnect=True)
|
||||||
|
|
||||||
logging.debug('Quitting Process thread')
|
logging.debug('Quitting Process thread')
|
||||||
|
|
||||||
def __readXML(self):
|
def __readXML(self):
|
||||||
"Parses the incoming stream, adding to xmlin queue as it goes"
|
"Parses the incoming stream, adding to xmlin queue as it goes"
|
||||||
|
@ -302,23 +302,24 @@ class XMLStream(object):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def disconnect(self, reconnect=False):
|
def disconnect(self, reconnect=False):
|
||||||
if not self.state.transition('connected','disconnected'):
|
with self.state.transition_ctx('connected','disconnected') as locked:
|
||||||
logging.warning("Already disconnected.")
|
if not locked:
|
||||||
return
|
logging.warning("Already disconnected.")
|
||||||
logging.debug("Disconnecting...")
|
return
|
||||||
self.sendRaw(self.stream_footer)
|
logging.debug("Disconnecting...")
|
||||||
time.sleep(5)
|
self.sendRaw(self.stream_footer)
|
||||||
#send end of stream
|
time.sleep(5)
|
||||||
#wait for end of stream back
|
#send end of stream
|
||||||
try:
|
#wait for end of stream back
|
||||||
# self.socket.shutdown(socket.SHUT_RDWR)
|
try:
|
||||||
self.socket.close()
|
# self.socket.shutdown(socket.SHUT_RDWR)
|
||||||
except socket.error as (errno,strerror):
|
self.socket.close()
|
||||||
logging.exception("Error while disconnecting. Socket Error #%s: %s" % (errno, strerror))
|
except socket.error as (errno,strerror):
|
||||||
try:
|
logging.exception("Error while disconnecting. Socket Error #%s: %s" % (errno, strerror))
|
||||||
self.filesocket.close()
|
try:
|
||||||
except socket.error as (errno,strerror):
|
self.filesocket.close()
|
||||||
logging.exception("Error closing filesocket.")
|
except socket.error as (errno,strerror):
|
||||||
|
logging.exception("Error closing filesocket.")
|
||||||
|
|
||||||
if reconnect: self.connect()
|
if reconnect: self.connect()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue