Revision 38a9b062 ncclient/subject.py

b/ncclient/subject.py
21 21
class Subject:
22 22
        
23 23
    def __init__(self, listeners=[]):
24
        self._listeners = listeners
24
        self._listeners = set(listeners)
25 25
        self._lock = Lock()
26 26
    
27 27
    def has_listener(self, listener):
......
30 30
    
31 31
    def add_listener(self, listener):
32 32
        with self._lock:
33
            self._listeners.append(listener)
33
            self._listeners.add(listener)
34 34
    
35 35
    def remove_listener(self, listener):
36 36
        with self._lock:
37
            try:
38
                self._listeners.remove(listener)
39
            except ValueError:
40
                pass
37
            self._listeners.discard(listener)
41 38
    
42 39
    def dispatch(self, event, *args, **kwds):
40
        # holding the lock while doing callbacks could lead to a deadlock
41
        # if one of the above methods is called
43 42
        with self._lock:
44 43
            listeners = list(self._listeners)
45 44
        for l in listeners:
46
            logger.debug('dispatching [%s] to [%s]' % (event, l.__class__))
47 45
            try:
46
                logger.debug('dispatching [%s] to [%s]' % (event, l))
48 47
                getattr(l, event)(*args, **kwds)
49 48
            except Exception as e:
50
                logger.warning(e)
49
                logger.warning(e)

Also available in: Unified diff