From d11a67702e9f28fecbe4460f82b6c0ab0bdd740c Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Fri, 10 Aug 2012 12:41:02 -0700 Subject: Exit transition immediately if already in the desired state. --- sleekxmpp/thirdparty/statemachine.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'sleekxmpp/thirdparty') diff --git a/sleekxmpp/thirdparty/statemachine.py b/sleekxmpp/thirdparty/statemachine.py index 33d9b828..1f01a92a 100644 --- a/sleekxmpp/thirdparty/statemachine.py +++ b/sleekxmpp/thirdparty/statemachine.py @@ -29,7 +29,7 @@ class StateMachine(object): if state in self.__states: raise IndexError("The state '%s' is already in the StateMachine." % state) self.__states.append(state) - finally: + finally: self.lock.release() @@ -90,6 +90,9 @@ class StateMachine(object): log.debug("Could not acquire lock") return False + if self.__current_state == to_state: + return True + while not self.__current_state in from_states: # detect timeout: remainder = start + wait - time.time() @@ -108,7 +111,7 @@ class StateMachine(object): # some 'false' value returned from func, # indicating that transition should not occur: - if not return_val: + if not return_val: return return_val log.debug(' ==== TRANSITION %s -> %s', self.__current_state, to_state) @@ -193,9 +196,9 @@ class StateMachine(object): while not self.__current_state in states: # detect timeout: remainder = start + wait - time.time() - if remainder > 0: + if remainder > 0: self.lock.wait(remainder) - else: + else: self.lock.release() return False self.lock.release() @@ -241,7 +244,7 @@ class _StateCtx: while not self.state_machine[self.from_state] or not self.state_machine.lock.acquire(False): # detect timeout: remainder = start + self.wait - time.time() - if remainder > 0: + if remainder > 0: self.state_machine.lock.wait(remainder) else: log.debug('StateMachine timeout while waiting for state: %s', self.from_state) -- cgit v1.2.3 From 814a50e36feb73ced9152680560261addf3ff0ea Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Fri, 10 Aug 2012 14:11:44 -0700 Subject: Fix handling state machine lock when quick exiting. --- sleekxmpp/thirdparty/statemachine.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'sleekxmpp/thirdparty') diff --git a/sleekxmpp/thirdparty/statemachine.py b/sleekxmpp/thirdparty/statemachine.py index 1f01a92a..4b5ecd6b 100644 --- a/sleekxmpp/thirdparty/statemachine.py +++ b/sleekxmpp/thirdparty/statemachine.py @@ -83,16 +83,16 @@ class StateMachine(object): if not to_state in self.__states: raise ValueError("StateMachine does not contain to_state %s." % to_state) + if self.__current_state == to_state: + return True + start = time.time() while not self.lock.acquire(False): time.sleep(.001) if (start + wait - time.time()) <= 0.0: - log.debug("Could not acquire lock") + log.debug("==== Could not acquire lock in %s sec: %s -> %s ", wait, self.__current_state, to_state) return False - if self.__current_state == to_state: - return True - while not self.__current_state in from_states: # detect timeout: remainder = start + wait - time.time() -- cgit v1.2.3