Revision 4a2351a5 src/listener.py

b/src/listener.py
12 12
# See the License for the specific language governing permissions and
13 13
# limitations under the License.
14 14

  
15
from threading import Lock
16

  
15 17
class Subject:
16 18
    
19
    'Thread-safe abstact class for event-dispatching subjects'
20
    
17 21
    def __init__(self, listeners=[]):
18 22
        self._listeners = listeners
19
        
23
        self._lock = Lock()
24
    
20 25
    def has_listener(self, listener):
21
        return (listener in self._listeners)
26
        with self._lock:
27
            return (listener in self._listeners)
22 28
    
23 29
    def add_listener(self, listener):
30
        with self._lock:
24 31
            self._listeners.append(listener)
25

  
32
    
26 33
    def remove_listener(self, listener):
27
        self._listeners.remove(listener)
28

  
34
        with self._lock:
35
            try:
36
                self._listeners.remove(listener)
37
            except ValueError:
38
                pass
39
    
29 40
    def dispatch(self, event, *args, **kwds):
30 41
        try:
31 42
            func = getattr(Listener, event)
32
            for l in listeners:
33
                func(l, data)
43
            with self._lock:
44
                for l in listeners:
45
                    func(l, *args, **kwds)
34 46
        except AttributeError:
35 47
            pass
36 48

  
37 49
class Listener:
38 50
    
51
    """Abstract class for NETCONF protocol message listeners, defining 2 events:
52
    - reply
53
    - error
54
    """
55
    
39 56
    @override
40 57
    def reply(self, *args, **kwds):
41 58
        raise NotImplementedError

Also available in: Unified diff