[tor-commits] [stem/master] Checking event version prereqs before setting any

atagar at torproject.org atagar at torproject.org
Sat Dec 8 23:30:39 UTC 2012


commit 40827b365e3a5f3dac6d1f8e8ffddd589be6cd70
Author: Damian Johnson <atagar at torproject.org>
Date:   Sat Dec 8 15:10:08 2012 -0800

    Checking event version prereqs before setting any
    
    Checking that our tor version meets all of the event's version prereqs before
    setting any. This has a few advantages...
    
    * It makes add_event_listener() an all-or-nothing operation (ie, failing one
      of the checks means that no listeners are attached, rather than a few)
    
    * Avoids repeated acquisitions of _event_listeners_lock (so other lock users
      can't slip in-between).
    
    * Lets me fix a bug where we were calling SETEVENTS for each event type, rather
      than a single call when we're done adding the listeners.
---
 stem/control.py |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/stem/control.py b/stem/control.py
index f7463b0..74127c0 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -660,14 +660,17 @@ class Controller(BaseController):
     :raises: :class:`stem.socket.ControllerError` if unable to set the events
     """
     
+    # first checking that tor supports these event types
     for event_type in events:
       event_version = stem.response.events.EVENT_TYPE_TO_CLASS[event_type]._VERSION_ADDED
       if not self.get_version().meets_requirements(event_version):
         raise stem.InvalidRequest(552, "%s event requires Tor version %s or later" % (event_type, event_version))
-      
-      with self._event_listeners_lock:
+    
+    with self._event_listeners_lock:
+      for event_type in events:
         self._event_listeners.setdefault(event_type, []).append(listener)
-        self._attach_listeners()
+      
+      self._attach_listeners()
   
   def remove_event_listener(self, listener):
     """





More information about the tor-commits mailing list