77
88logger = logging .getLogger (__name__ )
99
10+ # pylint: disable=global-statement
1011_default_recorder = None
1112
1213
@@ -22,10 +23,14 @@ class Recorder(ABC):
2223 def events (self ):
2324 return self ._events
2425
25- @abstractmethod
26- def next_event_id (self ):
27- self ._next_event_id += 1
28- return self ._next_event_id
26+ _next_event_id = 0
27+ _next_event_id_lock = threading .Lock ()
28+
29+ @classmethod
30+ def next_event_id (cls ):
31+ with cls ._next_event_id_lock :
32+ cls ._next_event_id += 1
33+ return cls ._next_event_id
2934
3035 # It might be nice to put @property on the getters here. The python maintainers have gone back
3136 # and forth on whether you should be able to combine @classmethod and @property. In 3.11,
@@ -44,24 +49,40 @@ def set_current(cls, r):
4449 """
4550 Set the recorder for the current thread.
4651 """
47- appmap_tls ()[cls ._RECORDER_KEY ] = r
52+ tls = appmap_tls ()
53+ if r :
54+ tls [cls ._RECORDER_KEY ] = r
55+ else :
56+ del tls [cls ._RECORDER_KEY ]
57+
4858 return r
4959
60+ @classmethod
61+ def get_global (cls ):
62+ _ , shared = cls ._get_current ()
63+ return shared
64+
65+ @classmethod
66+ def new_global (cls ):
67+ global _default_recorder
68+ _default_recorder = SharedRecorder ()
69+ return _default_recorder
70+
5071 @classmethod
5172 def get_enabled (cls ):
52- return cls .get_current ()._enabled
73+ return cls .get_current ()._enabled # pylint: disable=protected-access
5374
5475 @classmethod
5576 def set_enabled (cls , e ):
56- cls .get_current ()._enabled = e
77+ cls .get_current ()._enabled = e # pylint: disable=protected-access
5778
5879 @classmethod
5980 def start_recording (cls ):
60- cls .get_current ()._start_recording ()
81+ cls .get_current ()._start_recording () # pylint: disable=protected-access
6182
6283 @classmethod
6384 def stop_recording (cls ):
64- return cls .get_current ()._stop_recording ()
85+ return cls .get_current ()._stop_recording () # pylint: disable=protected-access
6586
6687 @classmethod
6788 def add_event (cls , event ):
@@ -70,28 +91,25 @@ def add_event(cls, event):
7091 one).
7192 """
7293 perthread , shared = cls ._get_current ()
73- shared ._add_event (event )
94+ shared ._add_event (event ) # pylint: disable=protected-access
7495 if perthread :
75- perthread ._add_event (event )
96+ perthread ._add_event (event ) # pylint: disable=protected-access
7697
7798 _RECORDER_KEY = "appmap_recorder"
7899
79100 @classmethod
80101 def _get_current (cls ):
81- global _default_recorder
82102 perthread = appmap_tls ().get (cls ._RECORDER_KEY , None )
83103
84104 return [perthread , _default_recorder ]
85105
86106 def clear (self ):
87107 self ._events = []
88- self ._next_event_id = 0
89108
90109 def __init__ (self , enabled = False ):
91110 self ._events = []
92111 self ._enabled = enabled
93112 self .start_tb = None
94- self ._next_event_id = 0
95113
96114 @abstractmethod
97115 def _start_recording (self ):
@@ -122,8 +140,7 @@ def _initialize():
122140 threads initializing the default recorder. If you find yourself wanting to do that, you
123141 should probably be using per-thread recording.
124142 """
125- global _default_recorder
126- _default_recorder = SharedRecorder ()
143+ Recorder .new_global ()
127144
128145
129146class ThreadRecorder (Recorder ):
@@ -135,9 +152,8 @@ class ThreadRecorder(Recorder):
135152 def events (self ):
136153 return super ().events
137154
138- def next_event_id (self ):
139- return super ().next_event_id ()
140-
155+ # They're not useless, because they're abtract with a default implementation
156+ # pragma pylint: disable=useless-super-delegation
141157 def _start_recording (self ):
142158 super ()._start_recording ()
143159
@@ -147,6 +163,8 @@ def _stop_recording(self):
147163 def _add_event (self , event ):
148164 super ()._add_event (event )
149165
166+ # pragma pylint: enable=useless-super-delegation
167+
150168
151169class SharedRecorder (Recorder ):
152170 """
@@ -155,6 +173,14 @@ class SharedRecorder(Recorder):
155173
156174 _lock = threading .Lock ()
157175
176+ def __init__ (self ):
177+ super ().__init__ ()
178+ Recorder ._next_event_id = 0
179+
180+ def clear (self ):
181+ super ().clear ()
182+ Recorder ._next_event_id = 0
183+
158184 @property
159185 def events (self ):
160186 with self ._lock :
@@ -168,14 +194,10 @@ def _stop_recording(self):
168194 with self ._lock :
169195 return super ()._stop_recording ()
170196
171- def next_event_id (self ):
172- with self ._lock :
173- return super ().next_event_id ()
174-
175197 def _add_event (self , event ):
176198 with self ._lock :
177199 super ()._add_event (event )
178200
179201
180202def initialize ():
181- Recorder ._initialize ()
203+ Recorder ._initialize () # pylint: disable=protected-access
0 commit comments