commit 5cea698be4f714cae7c660ae46bd55aa3ee0a133 Author: David Fifield david@bamsoftware.com Date: Tue Jul 30 22:56:10 2013 -0700
Fix a race condition in registration.
This could cause the first registration message not to be sent. The registration thread used the "notify" of a condition variable as the signal to do a registration. If the main thread did its "notify" before the registration thread did its "wait", then the registration thread would not wake up until the next time a registration was requested. --- flashproxy-client | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/flashproxy-client b/flashproxy-client index 89eda2a..cf16437 100755 --- a/flashproxy-client +++ b/flashproxy-client @@ -730,10 +730,15 @@ def forward_ports(pairs): return True
register_condvar = threading.Condition() +# register_flag true means registration_thread_func should register at its next +# opportunity. +register_flag = False def register(): + global register_flag if not options.register: return register_condvar.acquire() + register_flag = True register_condvar.notify() register_condvar.release()
@@ -765,9 +770,12 @@ def register_one(): log(u"All registration commands failed.")
def registration_thread_func(): + global register_flag while True: register_condvar.acquire() - register_condvar.wait() + while not register_flag: + register_condvar.wait() + register_flag = False register_condvar.release() if len(unlinked_remotes) < DESIRED_NUMBER_OF_PROXIES: register_one()