[tor-commits] [flashproxy/master] Fix a race condition in registration.

dcf at torproject.org dcf at torproject.org
Wed Jul 31 06:00:15 UTC 2013


commit 5cea698be4f714cae7c660ae46bd55aa3ee0a133
Author: David Fifield <david at 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()



More information about the tor-commits mailing list